<?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: Ravitej</title>
    <description>The latest articles on DEV Community by Ravitej (@ravitej2049).</description>
    <link>https://dev.to/ravitej2049</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%2F4232462%2F92032786-7d15-4fd8-9531-9ac6b76f079f.jpg</url>
      <title>DEV Community: Ravitej</title>
      <link>https://dev.to/ravitej2049</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ravitej2049"/>
    <language>en</language>
    <item>
      <title>Code Court: AI Agents Put Your Pull Requests on Trial</title>
      <dc:creator>Ravitej</dc:creator>
      <pubDate>Sat, 07 Nov 2026 16:57:54 +0000</pubDate>
      <link>https://dev.to/ravitej2049/code-court-ai-agents-put-your-pull-requests-on-trial-1214</link>
      <guid>https://dev.to/ravitej2049/code-court-ai-agents-put-your-pull-requests-on-trial-1214</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My AI prosecutor proved that a 150% coupon turns a $100 cart into −$50. Then my AI judge caught the defense's "fix" for a rounding bug and proved it was still broken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No human reviewer had looked at the PR yet. And I didn't write a single line of application code to build the court.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is &lt;strong&gt;Code Court&lt;/strong&gt;, my project for the &lt;strong&gt;Flip the Switch Hackathon&lt;/strong&gt; (DevTools Academy × Switch AI). Three AI agents put a GitHub pull request on trial inside a Discord channel, and my team is the jury.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F68n5rru9n5krk8sz84t4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F68n5rru9n5krk8sz84t4.png" alt="The judge's final ruling in Discord" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with one reviewer
&lt;/h2&gt;

&lt;p&gt;Code review usually means &lt;strong&gt;one&lt;/strong&gt; reviewer, human or AI, reading a diff and saying "looks good." That reviewer has blind spots. It's easy to approve a PR because its description &lt;em&gt;sounds&lt;/em&gt; right. And when an AI reviewer is confidently wrong, nobody pushes back.&lt;/p&gt;

&lt;p&gt;Courtrooms solved this problem centuries ago. You don't trust one person's opinion. You make &lt;strong&gt;one side attack, one side defend, and a neutral judge check the evidence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I built that for pull requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet the court
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧑‍⚖️ &lt;strong&gt;Judge&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@judge&lt;/code&gt; agent&lt;/td&gt;
&lt;td&gt;Opens the case, reads the diff, rules on every charge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚔️ &lt;strong&gt;Prosecutor&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@prosecutor&lt;/code&gt; agent&lt;/td&gt;
&lt;td&gt;Hunts for bugs, missing validation and missing tests, citing file:line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🛡️ &lt;strong&gt;Defense&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@defense&lt;/code&gt; agent&lt;/td&gt;
&lt;td&gt;Answers each charge: &lt;strong&gt;CONCEDE&lt;/strong&gt;, &lt;strong&gt;MITIGATE&lt;/strong&gt; or &lt;strong&gt;CONTEST&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👥 &lt;strong&gt;Jury&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;My team, the humans&lt;/td&gt;
&lt;td&gt;Votes ⚖️ to accept the ruling or ❌ to overturn it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three agents run on &lt;strong&gt;Claude Opus 5.5&lt;/strong&gt; through the &lt;strong&gt;Claude Code&lt;/strong&gt; provider in &lt;strong&gt;Switch&lt;/strong&gt;, on my own laptop. Switch bridges them into a Discord channel called &lt;code&gt;#courtroom&lt;/code&gt;, where each agent shows up with its own name and its own @mention.&lt;/p&gt;

&lt;p&gt;The flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer opens a PR
      ↓
@judge case: &amp;lt;PR link&amp;gt;      (posted in Discord #courtroom)
      ↓
Judge opens court → calls @prosecutor → charges filed
      ↓
@defense answers each charge → plea entered
      ↓
@judge rules: SUSTAINED / OVERRULED + verdict + fix list
      ↓
Team votes ⚖️ or ❌ → a human merges or fixes on GitHub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  A real trial, start to finish
&lt;/h2&gt;

&lt;p&gt;To test it, I made a small demo repo and opened a PR: &lt;strong&gt;"Add coupon discounts to checkout"&lt;/strong&gt;. It adds an &lt;code&gt;applyCoupon()&lt;/code&gt; function and claims that "existing callers keep working unchanged."&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;applyCoupon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discountPercent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;discountPercent&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&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;Looks harmless, right? Here's what happened in the courtroom.&lt;/p&gt;
&lt;h3&gt;
  
  
  ⚖️ Court is in session (3:41 PM)
&lt;/h3&gt;

&lt;p&gt;I typed one line in Discord:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@judge case: https://github.com/httpsravi/code-court-demo/pull/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The judge read the diff, summarised it, and called the prosecution.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn7f00r57htitq9lyy6z9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn7f00r57htitq9lyy6z9.png" alt="Filing the case in Discord" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ⚔️ The prosecution (3:42 PM)
&lt;/h3&gt;

&lt;p&gt;The prosecutor came back with three numbered charges, each with a severity and a line number:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Charge 1 — No validation of the discount (severity: high):&lt;/strong&gt; checkout.js:24 accepts any value for discountPercent. If it's 150 the total comes out negative (&lt;strong&gt;a $100 cart becomes −$50&lt;/strong&gt;), a negative value adds a surcharge, and NaN or a stray string makes the total NaN.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It also caught that my PR description was &lt;strong&gt;lying&lt;/strong&gt;. Every total is now rounded, so "existing callers unchanged" was false. And it found that &lt;code&gt;Math.round(x*100)/100&lt;/code&gt; gets half-cents wrong: &lt;strong&gt;1.005 becomes 1, not 1.01&lt;/strong&gt;. The third charge: no tests at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendation: FIX FIRST.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  🛡️ The defense (3:45 PM)
&lt;/h3&gt;

&lt;p&gt;This is the part I'm proudest of. The defense isn't a yes-man. Its prompt says: &lt;em&gt;"Never defend a real security hole or data-loss bug; concede it. A defense that admits weak points is more convincing."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So it &lt;strong&gt;conceded&lt;/strong&gt; charge 1 straight away and suggested a validation check. On charge 2 it &lt;strong&gt;mitigated&lt;/strong&gt;: rounding money to the cent is the right behaviour, and the existing tests use whole-dollar carts, so they still pass. Then it offered a fix for the rounding bug:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EPSILON&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Plea: &lt;strong&gt;MERGE WITH FIXES.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  🔨 The ruling (3:52 PM)
&lt;/h3&gt;

&lt;p&gt;Then the judge did something I didn't expect. It didn't just pick the more convincing side. &lt;strong&gt;It ran the edge cases itself, including the defense's fix:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Careful: the defense's suggested fix, &lt;code&gt;Math.round(Number.EPSILON + x*100)&lt;/code&gt;, still gives 1. I tested it. &lt;code&gt;Math.round((x + Number.EPSILON) * 100) / 100&lt;/code&gt; gives 1.01.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The defense's fix &lt;strong&gt;looked&lt;/strong&gt; right and came with a confident explanation, and it was wrong. If I'd had a single AI reviewer, I'd probably have copied that fix straight into my code.&lt;/p&gt;

&lt;p&gt;You can check it yourself in Node:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.005&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                    &lt;span class="c1"&gt;// 1     original bug&lt;/span&gt;
&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EPSILON&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// 1     defense's fix: still wrong&lt;/span&gt;
&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EPSILON&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 1.01  judge's fix&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;All three charges were &lt;strong&gt;SUSTAINED&lt;/strong&gt;. &lt;strong&gt;Verdict: MERGE WITH FIXES&lt;/strong&gt;, with a 4-step checklist: validate 0–100, fix the rounding, correct the PR description, and add tests for 0%, 20%, 100%, out-of-range values and the 1.005 case.&lt;/p&gt;

&lt;p&gt;My jury voted ⚖️. The whole trial took 11 minutes.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I built it with zero code
&lt;/h2&gt;

&lt;p&gt;Code Court has &lt;strong&gt;no application code&lt;/strong&gt;. The whole "source" is three prompts and some settings in Switch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Started a Local Switch server&lt;/strong&gt; in Switch Console. It runs on my own machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connected the Claude Code provider.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Created three agents&lt;/strong&gt; (&lt;code&gt;judge&lt;/code&gt;, &lt;code&gt;prosecutor&lt;/code&gt;, &lt;code&gt;defense&lt;/code&gt;) and wrote a system prompt for each: its role, the exact output format, and hard rules like &lt;em&gt;"never merge, close, approve, comment on, or push to anything on GitHub."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Created a Discord bot&lt;/strong&gt; with 8 permissions, connected it under &lt;em&gt;Messaging apps → Discord&lt;/em&gt;, and posted in &lt;code&gt;#courtroom&lt;/code&gt; to create the bridged room.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invited the agents&lt;/strong&gt; with &lt;code&gt;!invite-agent @judge&lt;/code&gt; and so on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The prompts matter most. A few rules made the biggest difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cite or it didn't happen.&lt;/strong&gt; Every charge needs a file:line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No invented facts.&lt;/strong&gt; If an agent can't verify something, it has to say so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One round each.&lt;/strong&gt; The judge calls each side once, so the agents never loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hands off GitHub.&lt;/strong&gt; The agents only read. Humans merge.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What broke (and how I fixed it)
&lt;/h2&gt;

&lt;p&gt;Not everything worked the first time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The server wouldn't start, and the error was misleading.&lt;/strong&gt; The error message quoted an old line from the log, not the real cause. Retrying fixed it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch couldn't see Claude Code.&lt;/strong&gt; An old install had left a broken &lt;code&gt;claude&lt;/code&gt; on my PATH. Adding the real install folder to PATH fixed it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Only me" trap.&lt;/strong&gt; My judge called the defense and got &lt;em&gt;"not permitted."&lt;/em&gt; The "Only me" setting blocks &lt;strong&gt;your own agents&lt;/strong&gt; too. Switching to &lt;strong&gt;"Only me and my agents"&lt;/strong&gt; fixed it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replies hide in threads.&lt;/strong&gt; Each agent answers in a Discord thread, and the judge doesn't always notice. So today a human nudges each stage: tag &lt;code&gt;@defense&lt;/code&gt;, then ask &lt;code&gt;@judge&lt;/code&gt; for the verdict.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one turned into a feature. Every stage gets a human check, and nothing moves forward without a person.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this works better than one reviewer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Adversarial beats agreeable.&lt;/strong&gt; A dedicated attacker and a dedicated defender bring up more than one reviewer, and they make the trade-offs explicit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents check each other.&lt;/strong&gt; The judge caught a wrong fix that the defense proposed in good faith.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Humans keep the final say.&lt;/strong&gt; The AI argues. The team decides.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-advance&lt;/strong&gt; the stages, so the judge calls the defense and rules without a nudge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post the ruling to GitHub&lt;/strong&gt; as a PR review.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;GitHub Action&lt;/strong&gt; that files a case automatically when a PR opens.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Everything, including all three prompts, the setup guide and the full transcript, is open source:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/httpsravi" rel="noopener noreferrer"&gt;
        httpsravi
      &lt;/a&gt; / &lt;a href="https://github.com/httpsravi/code-court" rel="noopener noreferrer"&gt;
        code-court
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ⚖️ AI agents put your pull requests on trial. A judge, prosecutor and defense debate every PR in Discord, and your team is the jury. Built with Switch for the Flip the Switch Hackathon 2026.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/httpsravi/code-court/assets/banner.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fhttpsravi%2Fcode-court%2FHEAD%2Fassets%2Fbanner.svg" alt="Code Court: AI agents put your pull requests on trial" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Code Court ⚖️&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;b&gt;AI agents put your pull requests on trial.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/554c10219d62575dbd1c746ed707b4346e8b7c0694775601906c1398c6f2810c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4275696c74253230776974682d5377697463682d3645353643463f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/554c10219d62575dbd1c746ed707b4346e8b7c0694775601906c1398c6f2810c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4275696c74253230776974682d5377697463682d3645353643463f7374796c653d666f722d7468652d6261646765" alt="Built with Switch"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8c0fca73564f21d7a6f235747eb4d739a2e4aaa348b8e074904127baeb944b9e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d3538363546323f7374796c653d666f722d7468652d6261646765266c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/8c0fca73564f21d7a6f235747eb4d739a2e4aaa348b8e074904127baeb944b9e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d3538363546323f7374796c653d666f722d7468652d6261646765266c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465" alt="Discord"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f1192e4d6223b82b7ddf3182f69b59e40f1a5457b896ffc9a2cdd8915fcc15a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4769744875622d3138313731373f7374796c653d666f722d7468652d6261646765266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/f1192e4d6223b82b7ddf3182f69b59e40f1a5457b896ffc9a2cdd8915fcc15a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4769744875622d3138313731373f7374796c653d666f722d7468652d6261646765266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465" alt="GitHub"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0ee3fab9729801eee5d77a1bc59f3471de5a1ea4d42a7fa326fc7b514a8ee3fb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466c69702532307468652532305377697463682d4861636b6174686f6e253230323032362d4635423833443f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/0ee3fab9729801eee5d77a1bc59f3471de5a1ea4d42a7fa326fc7b514a8ee3fb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466c69702532307468652532305377697463682d4861636b6174686f6e253230323032362d4635423833443f7374796c653d666f722d7468652d6261646765" alt="Flip the Switch Hackathon 2026"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  🎬 &lt;b&gt;&lt;a href="https://github.com/httpsravi/code-court/TODO_DEMO_VIDEO_URL" rel="noopener noreferrer"&gt;Watch the demo video&lt;/a&gt;&lt;/b&gt; · 📝 &lt;a href="https://github.com/httpsravi/code-court/TODO_BLOG_URL" rel="noopener noreferrer"&gt;Read the blog post&lt;/a&gt; · 🧾 &lt;a href="https://github.com/httpsravi/code-court-demo/pull/1" rel="noopener noreferrer"&gt;See the demo PR&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/httpsravi/code-court/assets/08-verdict.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fhttpsravi%2Fcode-court%2FHEAD%2Fassets%2F08-verdict.png" alt="The judge's ruling on PR #1 in the Discord courtroom" width="85%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Paste a pull request link into Discord and three AI agents hold a trial. One argues against the PR, one defends it, and a judge checks both sides against the real diff before ruling. &lt;strong&gt;Your team is the jury and has the final say.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Role&lt;/th&gt;

&lt;th&gt;Who&lt;/th&gt;

&lt;th&gt;Job&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;🧑‍⚖️ &lt;strong&gt;Judge&lt;/strong&gt;&lt;br&gt;
&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;code&gt;@judge&lt;/code&gt; agent&lt;/td&gt;

&lt;td&gt;Opens the case, reads the diff, rules on every charge, gives a verdict and a fix list&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;⚔️ &lt;strong&gt;Prosecutor&lt;/strong&gt;&lt;br&gt;
&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;code&gt;@prosecutor&lt;/code&gt; agent&lt;/td&gt;

&lt;td&gt;Hunts for bugs, missing validation, security issues and missing tests, citing file:line&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;🛡️ &lt;strong&gt;Defense&lt;/strong&gt;&lt;br&gt;
&lt;/td&gt;

&lt;td&gt;
&lt;br&gt;
&lt;code&gt;@defense&lt;/code&gt; agent&lt;/td&gt;

&lt;td&gt;Answers each charge with CONCEDE, MITIGATE or CONTEST, and enters a plea&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;👥 &lt;strong&gt;Jury&lt;/strong&gt;&lt;br&gt;
&lt;/td&gt;

&lt;td&gt;Your team, the humans&lt;/td&gt;

&lt;td&gt;Votes ⚖️ to accept the ruling or ❌ to overturn it, then merges or fixes by&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;…&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/httpsravi/code-court" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;👉 &lt;strong&gt;Demo PR on trial:&lt;/strong&gt; &lt;a href="https://github.com/httpsravi/code-court-demo/pull/1" rel="noopener noreferrer"&gt;https://github.com/httpsravi/code-court-demo/pull/1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you build your own court, I'd love to see what charges your prosecutor files. Drop a comment! ⚖️&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>discord</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
