<?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: GauntletCI</title>
    <description>The latest articles on DEV Community by GauntletCI (@gauntletci).</description>
    <link>https://dev.to/gauntletci</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%2F3918796%2F6df556b4-e474-4313-a65a-09116f121db2.png</url>
      <title>DEV Community: GauntletCI</title>
      <link>https://dev.to/gauntletci</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gauntletci"/>
    <language>en</language>
    <item>
      <title>Post-Mortem: How a "Performance" PR Introduced 28 New Regressions</title>
      <dc:creator>GauntletCI</dc:creator>
      <pubDate>Fri, 08 May 2026 01:53:14 +0000</pubDate>
      <link>https://dev.to/gauntletci/post-mortem-how-a-performance-pr-introduced-28-new-regressions-4pgf</link>
      <guid>https://dev.to/gauntletci/post-mortem-how-a-performance-pr-introduced-28-new-regressions-4pgf</guid>
      <description>&lt;h2&gt;
  
  
  Analyzing Jellyfin PR #16062 with GauntletCI
&lt;/h2&gt;

&lt;p&gt;Jellyfin PR #16062 is titled &lt;strong&gt;"Query Performance Improvements."&lt;/strong&gt; It was a massive architectural shift: 126 files, 27,810 lines of code. It was reviewed, approved, and merged on May 3, 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By May 7, the community was already reporting 90-second query hangs (Issue #16279).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We ran GauntletCI: a deterministic, rules-based Behavioral Change Risk (BCR) detector: against the merged diff. It took exactly &lt;strong&gt;660 ms&lt;/strong&gt; to find exactly why the "Performance Improvement" was causing performance degradation.&lt;/p&gt;




&lt;h2&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%2Fuxr5r1a94okw5z6rt4v3.png" alt="The GauntletCI dashboard for Jellyfin PR #16062: 129 findings across 27,000+ lines, fully analyzed in just" width="800" height="721"&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Gap Between Intent and Reality
&lt;/h3&gt;

&lt;p&gt;In a 27,000-line diff, human review is a suggestion, not a safeguard. The maintainers intended to fix N+1 query patterns. They succeeded in some areas, but the sheer scale of the change made it impossible to see what was being introduced simultaneously.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Performance Traps (GCI0044)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Findings:&lt;/strong&gt; 28 LINQ-in-loop patterns.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Reality:&lt;/strong&gt; While the PR closed older performance issues, it introduced 28 new ones. Specifically, 9 findings in &lt;code&gt;BaseItemRepository.TranslateQuery.cs&lt;/code&gt; map directly to the filtering logic that users are now reporting as "unbearably slow." &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Verification:&lt;/strong&gt; &lt;a href="https://github.com/jellyfin/jellyfin/issues/16279" rel="noopener noreferrer"&gt;Issue #16279&lt;/a&gt; ("Filters query taking 90s each time") isn't a mystery. It's a structural regression that was visible in the diff 1546 ms after it was written.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. The Deadlock Time-Bombs (GCI0016)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Findings:&lt;/strong&gt; 5 Block-level async violations (&lt;code&gt;.Wait()&lt;/code&gt; and &lt;code&gt;.GetAwaiter().GetResult()&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Risk:&lt;/strong&gt; These are "Heisenbugs." They often pass local CI because they require specific concurrency timing to hang a thread pool. &lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Status:&lt;/strong&gt; These are currently sitting in the master branch. They haven't "exploded" yet, but the pattern is a well-documented deadlock vector in ASP.NET Core.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. The Structural Decay (GCI0038 &amp;amp; GCI0043)
&lt;/h3&gt;

&lt;p&gt;Beyond the crashes, the scan found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;45 Dependency Injection Violations:&lt;/strong&gt; Service locator anti-patterns that create hidden coupling.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;15 Type Safety Gaps:&lt;/strong&gt; &lt;code&gt;as&lt;/code&gt; casts without null checks that lead to context-less &lt;code&gt;NullReferenceExceptions&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Execution Profile
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total Findings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;129&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Block-Level (Merge Stoppers)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scan Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;660 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLMs Used&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Why This Happened
&lt;/h3&gt;

&lt;p&gt;The Jellyfin team is talented. The problem isn't the people: it's the &lt;strong&gt;Scale of Change vs. The Speed of Human Cognition.&lt;/strong&gt; Reviewers check for intent; GauntletCI checks for structural risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try It Yourself
&lt;/h3&gt;

&lt;p&gt;You don't need an LLM to find these. You need a &lt;a href="https://github.com/EricCogen/GauntletCI" rel="noopener noreferrer"&gt;pessimistic verifier&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; GauntletCI
gauntletci analyze &lt;span class="nt"&gt;--staged&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>performance</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
