<?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: Sanjoy Ghosh</title>
    <description>The latest articles on DEV Community by Sanjoy Ghosh (@sanjoy1234).</description>
    <link>https://dev.to/sanjoy1234</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4026539%2Ff89fee05-f124-42d4-9ca1-4919437660b1.jpeg</url>
      <title>DEV Community: Sanjoy Ghosh</title>
      <link>https://dev.to/sanjoy1234</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sanjoy1234"/>
    <language>en</language>
    <item>
      <title>How GAUNTLEX Gates HIPAA/FINRA Compliance in CI</title>
      <dc:creator>Sanjoy Ghosh</dc:creator>
      <pubDate>Thu, 16 Jul 2026 16:27:40 +0000</pubDate>
      <link>https://dev.to/sanjoy1234/how-gauntlex-gates-hipaafinra-compliance-in-ci-29hj</link>
      <guid>https://dev.to/sanjoy1234/how-gauntlex-gates-hipaafinra-compliance-in-ci-29hj</guid>
      <description>&lt;h2&gt;
  
  
  The compliance gap nobody's pricing in yet
&lt;/h2&gt;

&lt;p&gt;A team building a healthcare API asks an AI coding assistant to implement a patient records endpoint. The assistant produces working code — clean, well-structured, passes review. Six months later, a HIPAA audit finds the endpoint returns more PHI fields than the request actually needed. Nobody wrote a test for "is this response over-broad." Nobody thought to.&lt;/p&gt;

&lt;p&gt;That's not a hypothetical. It's the specific, named failure mode in &lt;a href="https://github.com/sanjoy1234/gauntlex" rel="noopener noreferrer"&gt;GAUNTLEX&lt;/a&gt;'s own HIPAA policy playbook: &lt;em&gt;"PHI Disclosure — Over-Broad API Response."&lt;/em&gt; I want to walk through how GAUNTLEX turns regulatory requirements like this into something that actually runs in CI, instead of something a compliance team discovers during an audit that's already too late.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domains, not generic scans
&lt;/h2&gt;

&lt;p&gt;GAUNTLEX ships five compliance domain playbooks out of the box: OWASP Top 10, HIPAA, FINRA, PCI DSS, and SOC 2 (NIST SSDF and OWASP API Security are available as installable extensions). Each one is a curated set of attack scenarios specific to that domain's actual failure modes — not a generic vulnerability scanner with a different label stapled on.&lt;/p&gt;

&lt;p&gt;The HIPAA playbook's nine scenarios include things like &lt;em&gt;"Emergency Access — Hardcoded Override Credentials"&lt;/em&gt; and &lt;em&gt;"PHI Integrity — Missing Tamper Detection"&lt;/em&gt; — the kind of finding a generic SAST tool has no vocabulary for, because it's not a code pattern, it's a regulatory failure mode. The FINRA playbook is a different nine entirely: &lt;em&gt;"SEC 17a-4 — Non-WORM Record Storage Race Condition,"&lt;/em&gt; &lt;em&gt;"AML — Structuring Detection Bypass,"&lt;/em&gt; &lt;em&gt;"Best Execution — Pricing Calculation Error"&lt;/em&gt; — scenarios written for people who've actually read those regulations, not reverse-engineered from a CVE database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gauntlex run &lt;span class="nt"&gt;--issue&lt;/span&gt; patient_api_spec.md &lt;span class="nt"&gt;--mode&lt;/span&gt; standard &lt;span class="nt"&gt;--domain&lt;/span&gt; hipaa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Every finding traces to a control
&lt;/h2&gt;

&lt;p&gt;This is the part that actually matters for a compliance review. Every finding GAUNTLEX produces carries a CWE tag and maps to real control frameworks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;CONTROL_MAPPINGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NIST_SSDF&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RV.2.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RV.3.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PW.8.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OWASP_SAMM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Verification/Security-Testing/2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SOC2_CC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CC7.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CC8.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ISO_27001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A.14.2.8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A.14.2.9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not decoration. It's the difference between handing an auditor "we ran a security tool" and handing them a report where every finding traces to the specific control it violates — the artifact a compliance reviewer actually needs, in the format they actually work in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gate, not a suggestion
&lt;/h2&gt;

&lt;p&gt;Here's where it stops being a reporting tool and becomes an enforcement mechanism. GAUNTLEX runs in CI with a configurable minimum Adversarial Resilience Score — 0.80 by default — and &lt;code&gt;fail_open: false&lt;/code&gt;. Below that threshold, the merge is blocked. Not a Slack notification to review later. The same mechanism that blocks a merge on a failing test suite, applied to compliance-relevant security posture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;gate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;minimum_ars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.80&lt;/span&gt;
  &lt;span class="na"&gt;fail_open&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single config line is the actual point of this whole system: compliance testing that happens &lt;em&gt;before&lt;/em&gt; code ships, gating the same pipeline everything else already gates, instead of a quarterly audit finding what a machine could have caught on day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;gauntlex-ai
gauntlex policy list                    &lt;span class="c"&gt;# see all available domains&lt;/span&gt;
gauntlex run &lt;span class="nt"&gt;--issue&lt;/span&gt; your_spec.md &lt;span class="nt"&gt;--domain&lt;/span&gt; hipaa &lt;span class="nt"&gt;--mode&lt;/span&gt; quick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;gauntlex audit&lt;/code&gt; lists every past run with its full compliance control mapping over a configurable window — useful the next time an auditor asks "show me your security testing evidence" and you'd rather hand over a report than a explanation.&lt;/p&gt;

&lt;p&gt;Repo, MCP integration, and the full domain list: &lt;a href="https://github.com/sanjoy1234/gauntlex" rel="noopener noreferrer"&gt;github.com/sanjoy1234/gauntlex&lt;/a&gt;. If you're building in a regulated space and want to see what GAUNTLEX flags in your own spec, I'd genuinely like to know — &lt;a href="https://github.com/sanjoy1234/gauntlex/discussions" rel="noopener noreferrer"&gt;open a discussion&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>compliance</category>
      <category>security</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>The Adversarial Resilience Score: A New Metric for AI-Generated Code</title>
      <dc:creator>Sanjoy Ghosh</dc:creator>
      <pubDate>Tue, 14 Jul 2026 02:49:44 +0000</pubDate>
      <link>https://dev.to/sanjoy1234/the-adversarial-resilience-score-a-new-metric-for-ai-generated-code-4gej</link>
      <guid>https://dev.to/sanjoy1234/the-adversarial-resilience-score-a-new-metric-for-ai-generated-code-4gej</guid>
      <description>&lt;h2&gt;
  
  
  The problem with "this AI writes secure code"
&lt;/h2&gt;

&lt;p&gt;Every AI coding tool now claims some flavor of security-awareness. Almost none of them will tell you, in a number, how resilient the code it just wrote actually is — and fewer still will let you verify that number yourself after the fact.&lt;/p&gt;

&lt;p&gt;That's the gap I built the Adversarial Resilience Score (ARS) to close. It's the core metric behind &lt;a href="https://github.com/sanjoy1234/gauntlex" rel="noopener noreferrer"&gt;GAUNTLEX&lt;/a&gt;, and I want to walk through exactly how it's computed — not the marketing version, the actual formula — because a security metric nobody can audit isn't a metric, it's a claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  The formula
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ARS = Σ(attack_scores) / N
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;N&lt;/code&gt; is the number of adversarial attacks fired at the generated code for a given run (5 in quick mode, 20 in standard, 50 in thorough), and each individual &lt;code&gt;attack_score&lt;/code&gt; is one of exactly three values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1.0&lt;/strong&gt; — mitigated. The attack was fully defended against.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0.5&lt;/strong&gt; — partial. The defense exists but is bypassable or incomplete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0.0&lt;/strong&gt; — missed. No defense at all; the attack succeeded cleanly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each attack is scored independently by GAUNTLEX's Arbiter — a separate model call that renders a verdict (&lt;code&gt;mitigated&lt;/code&gt; / &lt;code&gt;partial&lt;/code&gt; / &lt;code&gt;missed&lt;/code&gt;) plus a one-line reason, so every score comes with an explanation attached, not just a number. ARS is the mean of those scores, so it lands somewhere in &lt;strong&gt;[0.0, 1.0]&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an average, not a pass rate
&lt;/h2&gt;

&lt;p&gt;This is the detail I think matters most and gets glossed over the most. ARS is &lt;em&gt;not&lt;/em&gt; "percentage of attacks blocked." A pass/fail count throws away information — it treats a defense that's 90% there the same as no defense at all, and it treats a narrowly-avoided bypass the same as an attack that never had a chance. Averaging continuous per-attack scores keeps that gradient. A codebase that mitigates most attacks cleanly but has two partially-bypassable defenses scores differently — and more informatively — than one that fully blocks some attacks and fully fails others, even if the raw counts look similar.&lt;/p&gt;

&lt;p&gt;It also means ARS resists gaming by test selection. You can't inflate it by throwing in a pile of trivially-blocked attacks, because a single fully-missed attack against something serious (say, an auth bypass) pulls the average down hard regardless of how many easy ones surround it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gate, not a suggestion
&lt;/h2&gt;

&lt;p&gt;GAUNTLEX runs in CI with a configurable minimum ARS — 0.80 by default. If a run scores below that threshold, the build fails. Not a warning, not a Slack notification to review later — the merge is blocked, the same way a failing test suite blocks a merge. &lt;code&gt;fail_open&lt;/code&gt; defaults to &lt;code&gt;false&lt;/code&gt;: if GAUNTLEX itself can't complete a run for some reason, that's a failure state too, not a silent pass.&lt;/p&gt;

&lt;p&gt;The reasoning: a security score that's advisory gets ignored under deadline pressure, every time. A score that gates the merge doesn't have that problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain-specific, not generic
&lt;/h2&gt;

&lt;p&gt;The 5/20/50 attacks per run aren't generic fuzzing — they're drawn from policy playbooks scoped to a specific regulatory or security domain: OWASP Top 10, HIPAA, FINRA, PCI DSS, SOC 2 (with NIST SSDF and OWASP API Security available as installable extensions). Each domain playbook is a curated set of scenarios specific to that domain's actual failure modes — HIPAA's playbook probes PHI-handling failure modes, FINRA's probes the record-retention and audit-trail patterns those regulations actually care about, not a repackaged OWASP list with a different label on it.&lt;/p&gt;

&lt;p&gt;Every finding GAUNTLEX produces also carries a CWE tag and maps to control frameworks (NIST SSDF, OWASP SAMM, SOC 2, ISO 27001) — so a report isn't just "here's a score," it's something a compliance reviewer can actually trace back to a specific control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tamper-evident by construction
&lt;/h2&gt;

&lt;p&gt;A self-reported security score is worth exactly as much as the trust you place in whoever generated it — which is close to zero for a tool that hasn't earned it yet. So every GAUNTLEX report includes a SHA-256 hash computed over the ordered array of attack results. Anyone can run &lt;code&gt;gauntlex verify &amp;lt;run_id&amp;gt;&lt;/code&gt; and confirm the report they're looking at hasn't been edited after the fact. It doesn't prove the score is &lt;em&gt;good&lt;/em&gt; — it proves the score you're reading is the score that was actually computed, not a touched-up version of it.&lt;/p&gt;

&lt;p&gt;That distinction — provable versus claimed — is the whole design philosophy behind GAUNTLEX, and it's why I built ARS as an auditable formula instead of a black-box "security rating."&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;gauntlex-ai
gauntlex run &lt;span class="nt"&gt;--spec&lt;/span&gt; your_spec.md &lt;span class="nt"&gt;--mode&lt;/span&gt; quick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quick mode runs 5 attacks in under a minute and prints an ARS for whatever spec you point it at. Full writeup, the compliance domain list, and the MCP server integration (works inside Claude Code, Cursor, Windsurf, Zed) are in the &lt;a href="https://github.com/sanjoy1234/gauntlex" rel="noopener noreferrer"&gt;repo&lt;/a&gt; and the &lt;a href="https://github.com/sanjoy1234/gauntlex/blob/main/docs/DEEP_DIVE.md" rel="noopener noreferrer"&gt;Deep Dive doc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you try it against something you've built, I'd genuinely like to know what it finds — that's what &lt;a href="https://github.com/sanjoy1234/gauntlex/discussions" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt; is for.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>Why I Built an Adversarial Co-Generation Engine</title>
      <dc:creator>Sanjoy Ghosh</dc:creator>
      <pubDate>Mon, 13 Jul 2026 03:35:53 +0000</pubDate>
      <link>https://dev.to/sanjoy1234/why-i-built-an-adversarial-co-generation-engine-2038</link>
      <guid>https://dev.to/sanjoy1234/why-i-built-an-adversarial-co-generation-engine-2038</guid>
      <description>&lt;p&gt;I spent a chunk of last year around legacy modernization work — the kind of project where a bank or an insurer is taking twenty years of accumulated code and rebuilding it as modern services, one system at a time. Every one of those systems starts the same way: a PRD or a requirements document says what the business needs, that gets translated into a spec precise enough for an AI to implement, and eventually someone tests what came out.&lt;/p&gt;

&lt;p&gt;What struck me, watching this happen at scale, wasn't that the code was bad. It was that nobody was testing the thing that actually determined whether the code would be bad: the spec itself — the technical description handed to the model, not the PRD that motivated it. Every security tool I looked at — SAST scanners, DAST tools, even the AI coding assistants themselves — waited until an implementation existed before doing anything adversarial. Attack the code, once it's there. That's the whole industry's model, and it's worked fine for forty years because the volume was always survivable. A team ships a handful of PRs a week, a human reviews them, and eventually a pentest catches whatever slipped through.&lt;/p&gt;

&lt;p&gt;That math falls apart at modernization scale. When you're regenerating a few million lines of code, you're also generating a few thousand specs, faster than any review process was ever built to absorb. Testing after the fact doesn't just get slower under that load — it quietly stops happening, spec by spec, until the aggregate exposure is enormous and nobody can point to when it happened.&lt;/p&gt;

&lt;p&gt;So I built GAUNTLEX to test the thing that happens before the code does: the spec.&lt;/p&gt;

&lt;p&gt;This is also where I want to be precise about a word that gets overloaded. "Spec-driven development" — the broader industry shift toward writing structured, agent-facing specs instead of prompting an AI free-form — is exactly the world GAUNTLEX lives in. But a spec (what to build, precise enough for a model to implement) and a PRD or requirements doc (why it's needed) aren't the same artifact, even though people often use "spec" loosely to mean both. GAUNTLEX treats them as two separate inputs on purpose: build intent from the spec itself, business intent pulled in separately from wherever your team actually tracks the why — Jira, Confluence, Aha! — via what the product calls the Intent Adapter. The attack surface gets reasoned from both, not just one.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it actually works
&lt;/h2&gt;

&lt;p&gt;Two agents run on the same specification, at the same time. A Builder implements it. A Breaker attacks it, reading only the spec, with no visibility into what the Builder wrote. Neither one waits on the other. By the time the Builder has working code, the Breaker already has a full adversarial test suite derived from the same intent.&lt;/p&gt;

&lt;p&gt;A third agent, the Arbiter, scores every attack against whatever the Builder actually produced — mitigated, partially mitigated, or missed entirely — and that produces a single number, the Adversarial Resilience Score. Fall below the threshold your team sets (0.80 by default) and the merge is blocked automatically, the same way a failing test suite blocks one today. It isn't a new discipline. It's the same discipline, pointed at a gap nobody was covering.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gauntlex run &lt;span class="nt"&gt;--issue&lt;/span&gt; SPEC.md &lt;span class="nt"&gt;--intent&lt;/span&gt; PROJ-123 &lt;span class="nt"&gt;--mode&lt;/span&gt; standard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What actually comes out of it
&lt;/h2&gt;

&lt;p&gt;Every finding is tied to a real CWE, but more importantly, to the compliance controls an auditor is actually going to ask about — NIST SSDF, OWASP SAMM, SOC 2, ISO 27001. A CWE number is useful to an engineer. It isn't what satisfies a compliance review, and I wanted the report to be useful to both people in that conversation, not just one. Five regulated-industry playbooks — HIPAA, FINRA, PCI DSS, SOC 2, OWASP Top 10 — ship today, each mapped to the actual regulation it's checking against, not a generic scan wearing an industry label.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want to try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gauntlex setup
gauntlex run &lt;span class="nt"&gt;--issue&lt;/span&gt; examples/demo_issue.md &lt;span class="nt"&gt;--mode&lt;/span&gt; quick &lt;span class="nt"&gt;--pretty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's free, MIT licensed, and works with whichever model provider you already use, including fully local through Ollama if you can't send code to an external API at all.&lt;/p&gt;

&lt;p&gt;I'd genuinely like to hear what it catches in your own repos That's what the &lt;a href="https://github.com/sanjoy1234/gauntlex/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt; are for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sanjoy1234/gauntlex" rel="noopener noreferrer"&gt;github.com/sanjoy1234/gauntlex&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
    </item>
  </channel>
</rss>
