<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: D Cairo</title>
    <description>The latest articles on DEV Community by D Cairo (@d_cairo).</description>
    <link>https://dev.to/d_cairo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3956835%2F11e4c26f-901b-4f2f-a6ef-aa20083bd475.png</url>
      <title>DEV Community: D Cairo</title>
      <link>https://dev.to/d_cairo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/d_cairo"/>
    <language>en</language>
    <item>
      <title>Thoughts after playing around with GitHub's `/security-review` command</title>
      <dc:creator>D Cairo</dc:creator>
      <pubDate>Fri, 29 May 2026 11:41:44 +0000</pubDate>
      <link>https://dev.to/d_cairo/thoughts-after-playing-around-with-githubs-security-review-command-2cnn</link>
      <guid>https://dev.to/d_cairo/thoughts-after-playing-around-with-githubs-security-review-command-2cnn</guid>
      <description>&lt;p&gt;I was setting up Copilot CLI on my work account last week and came across an experimental &lt;code&gt;/security-review&lt;/code&gt; command. I didn't see any announcement for it, so I was curious how it worked and poked around a little.&lt;/p&gt;

&lt;p&gt;The short version of what it does: you finish your coding session, it reads the diff, and it produces a list of likely vulnerabilities. Useful on paper. The thing I couldn't tell from poking at it manually was how much the underlying model matters. Does picking Opus over Haiku actually buy you better security findings, or are you just paying for the same answer in a fancier wrapper?&lt;/p&gt;

&lt;p&gt;So I built a small harness around OWASP Juice Shop to find out. This was a small scale experiment funded by my work subscription.  This post is what fell out of that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I needed a target with a known answer key, and Juice Shop is an app I've poked at before. It's a demo vulnerable Node.js app that ships with a catalogue of known issues. I took the original app, and created 10 changes from existing vulnerabilities. Each change is simply reintroducing one or more catalogued vulnerabilities. There were 14 vulnerabilities in total across the 10 changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL injection&lt;/li&gt;
&lt;li&gt;Weak crypto&lt;/li&gt;
&lt;li&gt;SSRF&lt;/li&gt;
&lt;li&gt;Path traversal&lt;/li&gt;
&lt;li&gt;XXE&lt;/li&gt;
&lt;li&gt;Insecure deserialization&lt;/li&gt;
&lt;li&gt;Broken access control&lt;/li&gt;
&lt;li&gt;Hardcoded credentials&lt;/li&gt;
&lt;li&gt;Missing rate limiting&lt;/li&gt;
&lt;li&gt;Open redirect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ground truth, with file, CWE, and one-line explanation, lives in a &lt;code&gt;catalogue.md&lt;/code&gt;. The AI reviewer never sees this file during the &lt;code&gt;/security-review&lt;/code&gt; process. &lt;/p&gt;

&lt;p&gt;For each change, I run &lt;code&gt;/security-review&lt;/code&gt; non-interactively and capture the output. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--no-ask-user&lt;/code&gt; flag matters. Without it the command seems to pause for input after its initial pass and never terminates in a script. With it, you get a clean JSON stream and a final &lt;code&gt;result&lt;/code&gt; event that includes the credits the run consumed.&lt;/p&gt;

&lt;p&gt;Then a separate, fixed LLM grader takes the catalogue and the reviewer's output and produces three counts per change: &lt;strong&gt;detected&lt;/strong&gt;, &lt;strong&gt;missed&lt;/strong&gt;, &lt;strong&gt;false positives&lt;/strong&gt;. The grader sees the catalogue. The reviewer doesn't. The grading model stays constant across all runs so any grader bias is a constant offset. I decided to go big on this one and used Opus 4.6. &lt;/p&gt;

&lt;p&gt;I ran this across &lt;strong&gt;5 models × 4 independent runs × 10 changes = 200 reviews&lt;/strong&gt;. It's a small sample, but tokens are expensive these days and I was funding this out of curiosity, not a budget. I think it's enough to see the broad shape and maybe make plans for future work.&lt;/p&gt;

&lt;p&gt;Models tested: Claude Haiku 4.5, Sonnet 4.6, Opus 4.6, GPT-5.4, GPT-5.5. These are all the ones currently selectable for Copilot CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What came out
&lt;/h2&gt;

&lt;p&gt;Mean detection rate across 4 runs, with range and standard deviation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69d15n00kuutcl8x9r9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69d15n00kuutcl8x9r9q.png" alt="Summary for each model after 4 runs, except for gpt 5.4 which is missing" width="800" height="199"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude-opus-4.6     93%   (93–93,  σ 0.0)   2.5 FPs   30.0 credits/run
gpt-5.5             91%   (86–93,  σ 3.6)   0.8 FPs   75.0 credits/run
claude-sonnet-4.6   86%   (79–93,  σ 8.2)   0.8 FPs   10.0 credits/run
claude-haiku-4.5    86%   (79–93,  σ 5.8)   1.2 FPs    3.3 credits/run
gpt-5.4             77%   (71–79,  σ 3.6)   0.2 FPs   10.0 credits/run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things stood out enough that I felt they were worth writing up.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Haiku 4.5 ties Sonnet 4.6 on mean detection at ~1/3 the cost
&lt;/h3&gt;

&lt;p&gt;Both landed at 86% mean detection. Haiku costs 3.3 credits per 10-change sweep; Sonnet costs 10. That's a 3× spread for the same outcome on this benchmark.&lt;/p&gt;

&lt;p&gt;If you're planning to run &lt;code&gt;/security-review&lt;/code&gt; on every PR in a busy repo, this feels like the line item to look at first. Sonnet has slightly fewer false positives on average (0.8 vs 1.2), but it's close enough that it made me think about using Haiku for this kind of task and then maybe use a bigger model to fix/throw away results that don't matter. &lt;/p&gt;

&lt;h3&gt;
  
  
  2. Opus is the only model with zero variance across runs
&lt;/h3&gt;

&lt;p&gt;Opus scored 13/14 every single time. Same detection rate, same missed vulnerability, four runs in a row.&lt;/p&gt;

&lt;p&gt;Everything else moved. Sonnet ranged from 79% to 93% across its four runs. Haiku did the same. That's a &lt;strong&gt;14-percentage-point swing&lt;/strong&gt; for "the same model on the same input."&lt;/p&gt;

&lt;p&gt;If your security gate is a single &lt;code&gt;/security-review&lt;/code&gt; run and it's a mid-tier model, you're partly looking at noise. Re-running matters more than I'd assumed before doing this, so there is a chance that a rinse and repeat with a cheaper model will be almost as good as one of the frontier models, but still come out cheaper. &lt;/p&gt;

&lt;h2&gt;
  
  
  The cost question
&lt;/h2&gt;

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

&lt;p&gt;Credits are bucketed per model. Every Haiku run cost roughly 3.3, every Opus run 30.0. So this isn't anecdotal cost data, it's the price list based on the tests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Credits / 10-change sweep&lt;/th&gt;
&lt;th&gt;vs Haiku&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;claude-haiku-4.5&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;1.0×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-sonnet-4.6&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;3.0×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.4&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;3.0×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-opus-4.6&lt;/td&gt;
&lt;td&gt;30.0&lt;/td&gt;
&lt;td&gt;9.1×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.5&lt;/td&gt;
&lt;td&gt;75.0&lt;/td&gt;
&lt;td&gt;22.7×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The thing this benchmark left me genuinely uncertain about: &lt;strong&gt;is this kind of analysis worth the tokens it consumes with frontier models?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A team running 100 PRs/week with Haiku is spending ~330 credits/week on security review. The same workload on GPT-5.5 is ~7,500. That's a meaningful number if you're paying for credits out of an engineering budget, and at the Haiku end it's small enough that the cost-benefit case writes itself. At the GPT-5.5 end you're paying 22× more for one percentage point less detection, which is harder to defend. Especially when a lot of companies might already have some security tooling set up. &lt;/p&gt;

&lt;p&gt;My take is: &lt;strong&gt;probably yes&lt;/strong&gt; for high-stakes diffs, and no for the long tail. But the tool doesn't help you make that call right now. So be mindful of the model you pick. &lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimer: This is a fun side project, not deep research
&lt;/h2&gt;

&lt;p&gt;I'd rather have a smaller true claim than a bigger shaky one, so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n=4 is small.&lt;/strong&gt; The "Haiku ties Sonnet" finding is consistent with these runs but is not statistically established. With a higher number of runs this could become clearer, but I'm not going to spend all the company's tokens on this. I also need some left to get the AI to do my job. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Juice Shop is well-known.&lt;/strong&gt; It almost certainly appears in training data for all five models, which would inflate scores roughly uniformly. That's why the interesting comparisons here are between models, not the absolute detection rates. I know there are better benchmarks out there, I was just playing around with something small so decided to pick something I know. I spent a few more tokens building the benchmark. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The grader sees the catalogue.&lt;/strong&gt; It's calibrated to "does this finding match a catalogued vuln," which is not a perfect 1:1 match and the AI could be wrong. I spot-checked a few matches and they were correct so I trust the grader does OK, especially with the Opus 4.6 model. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One workload.&lt;/strong&gt; This is &lt;code&gt;/security-review&lt;/code&gt; against Node.js diffs with common OWASP-class bugs. I don't know if things are different for other languages. I suspect that less popular languages might show bigger differences in the detection rates. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models change.&lt;/strong&gt; This is late May 2026. If you're reading this at a later point, pricing &amp;amp; capabilities changes in models could lead to different conclusions. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'd do next if I were funding this properly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Push n to 10+ per model and settle the Haiku-vs-Sonnet question.&lt;/li&gt;
&lt;li&gt;Add a private repo benchmark alongside Juice Shop to neutralise training-data effects.&lt;/li&gt;
&lt;li&gt;Test "2× Haiku with union" head-to-head against "1× Opus." That's the most useful practical question this data raises and it's still open.&lt;/li&gt;
&lt;li&gt;Add a second independent grader for inter-rater calibration, or do something more deterministic. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've played with &lt;code&gt;/security-review&lt;/code&gt; and seen different patterns or if you have ideas for what codebases would make better targets I'd genuinely like to hear about it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>programming</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
