<?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: Serdar Doğrubakar</title>
    <description>The latest articles on DEV Community by Serdar Doğrubakar (@serdardb).</description>
    <link>https://dev.to/serdardb</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%2F4050681%2F74802d52-e01f-4f5b-9d30-446b12c375c9.png</url>
      <title>DEV Community: Serdar Doğrubakar</title>
      <link>https://dev.to/serdardb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/serdardb"/>
    <language>en</language>
    <item>
      <title>I made three AI models argue about my code, then judged the winner</title>
      <dc:creator>Serdar Doğrubakar</dc:creator>
      <pubDate>Tue, 28 Jul 2026 07:37:51 +0000</pubDate>
      <link>https://dev.to/serdardb/i-made-three-ai-models-argue-about-my-code-then-judged-the-winner-439p</link>
      <guid>https://dev.to/serdardb/i-made-three-ai-models-argue-about-my-code-then-judged-the-winner-439p</guid>
      <description>&lt;p&gt;I never fully trusted a single model's code review. Different models miss different things, and I wanted that difference working for me instead of betting everything on one. So I built a tool that runs the same review agent across several models and makes them cross-check each other. Here is how it works, and an honest note about what it is and is not yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  One agent, many models
&lt;/h2&gt;

&lt;p&gt;You already have a review agent defined for one coding CLI, a plain &lt;code&gt;.claude/agents/*.md&lt;/code&gt; file. &lt;code&gt;multi-agent&lt;/code&gt; runs that same agent on other model CLIs: &lt;code&gt;grok&lt;/code&gt;, &lt;code&gt;codex&lt;/code&gt;, &lt;code&gt;claude&lt;/code&gt;. Each one executes it natively through its own runtime. No API keys, no re-implementation. If the CLI is installed and logged in, the agent runs there.&lt;/p&gt;

&lt;p&gt;The point is diversity, not redundancy. When independent models &lt;strong&gt;converge&lt;/strong&gt; on a finding, you get confidence. When they &lt;strong&gt;diverge&lt;/strong&gt;, you get coverage you would not have had alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  /arena: let the debate stop itself
&lt;/h2&gt;

&lt;p&gt;The first command runs a deterministic tournament.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Round 1        each model audits independently
Round 2        cross-critique: KEEP / WITHDRAW / ADOPT / NEW, each citing code
Round 3, 4...  added ONLY while positions keep moving
Judge          opens the real code, confirms or rejects each disputed claim
Scoreboard     ranks the models, post-hoc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rounds are convergence gated. My first version ran a fixed number of rounds, and half of them were theater: by round two nobody was changing position, they were just restating themselves with more tokens. Now a round is added only while someone is actually withdrawing a claim, adopting a rival's, or raising a new one. The moment the debate freezes, it ends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Score the models, but never tell them
&lt;/h2&gt;

&lt;p&gt;The arena ends with a scoreboard, and the design decision I care about most is that the models are never told they are being scored.&lt;/p&gt;

&lt;p&gt;The moment a model knows it is in a competition, the incentives rot. It defends a weak finding because withdrawing looks like losing. It nitpicks rivals to farm points. The debate stops being about the code. So the scoring happens afterwards, from the judge's confirmed results: confirmed findings add points weighted by severity, false positives subtract, unique real catches and honest concessions count extra.&lt;/p&gt;

&lt;p&gt;The models argue about truth. The ranking is computed behind their backs. Goodhart's law hits language models as hard as it hits people.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;I have to be straight about the current state, because it would be easy to oversell this.&lt;/p&gt;

&lt;p&gt;It was &lt;strong&gt;built for and tested on Claude Code&lt;/strong&gt;. The multi-round arena runs on top of Claude Code's Workflow system, the deterministic runtime you can watch live in &lt;code&gt;/workflows&lt;/code&gt;. Claude is also the default judge, because it is the host model and always available.&lt;/p&gt;

&lt;p&gt;The other CLIs, &lt;code&gt;grok&lt;/code&gt; and &lt;code&gt;codex&lt;/code&gt;, are supported as &lt;strong&gt;targets&lt;/strong&gt;: the engine runs your agent on them and collects their findings. What is &lt;strong&gt;not&lt;/strong&gt; shipped yet is native host wrappers for them, because I have not tested that path enough to trust it. The orchestration engine underneath is plain Python and host-agnostic, so those wrappers can be added later, but I would rather say "not yet" than pretend it is done.&lt;/p&gt;

&lt;p&gt;There is also a real cost. A full adversarial run is heavy: many model turns, several rounds, minutes to tens of minutes, real token spend, and each round waits for the slowest model. For quick work you use fewer models, or the second command, a live single-model review you can talk to while it works.&lt;/p&gt;

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

&lt;p&gt;It is open source under MIT. The write-up with the two commands, the exact scoring rules and the full list of limitations is on the project page: &lt;a href="https://dogrubakar.com/projects/multi-agent" rel="noopener noreferrer"&gt;multi-agent on dogrubakar.com&lt;/a&gt;, and the code is on &lt;a href="https://github.com/serdardb/multi-agent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you run multi-model review workflows, I would genuinely like to hear how you keep them honest.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>codereview</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Switch AI coding agents without losing your context</title>
      <dc:creator>Serdar Doğrubakar</dc:creator>
      <pubDate>Tue, 28 Jul 2026 07:18:10 +0000</pubDate>
      <link>https://dev.to/serdardb/switch-ai-coding-agents-without-losing-your-context-1733</link>
      <guid>https://dev.to/serdardb/switch-ai-coding-agents-without-losing-your-context-1733</guid>
      <description>&lt;p&gt;I use more than one coding agent. Claude Code, Codex, Grok, sometimes Antigravity. The problem was never which one is best. It was that every time I switched, I lost the whole conversation. I would copy a summary by hand, hunt for a session id, and start the new agent cold.&lt;/p&gt;

&lt;p&gt;So I built a small open source tool to fix exactly that, and this is how it works, plus the part that broke while building it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: move the delta, not the transcript
&lt;/h2&gt;

&lt;p&gt;The lazy way to move context between two agents is to copy the entire conversation. It is also the wrong way. A transcript is large, it repeats what the target already knows, and it buries the two sentences that actually matter.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;context-bridge&lt;/code&gt; keeps a small &lt;code&gt;knownBy&lt;/code&gt; matrix instead: for every pair of agents, how far into each agent's own stream the other one has already been told. A handoff sends only the missing part, in four bounded sections: &lt;strong&gt;Conversation, Decisions, Work, Next&lt;/strong&gt;. The receiving agent spends one short sentence acknowledging it. That is the entire overhead.&lt;/p&gt;

&lt;p&gt;If you have ever worked on reconciliation systems, this is the same shape: you do not resend the ledger, you send the diff since the last watermark.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It does not replace the agents.&lt;/li&gt;
&lt;li&gt;It does not proxy their APIs.&lt;/li&gt;
&lt;li&gt;It needs no API keys.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It drives the subscription CLIs you already have. One command, &lt;code&gt;/bridge codex&lt;/code&gt;, and the agent you leave closes while the one you arrive in already knows your work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest asymmetry
&lt;/h2&gt;

&lt;p&gt;Not every agent accepts context the same way, and I think glossing over that would be dishonest.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude and Codex&lt;/strong&gt; take the delta through their own session hooks, so it lands inside the conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grok and Antigravity&lt;/strong&gt; get it in the opening prompt of the resumed session, because their runtimes offer no way to inject.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The knowledge is equal on every side. The session shape is not, and that difference is stated plainly rather than hidden.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug that reported success and carried nothing
&lt;/h2&gt;

&lt;p&gt;Here is the failure that scared me most, and it was not in my code.&lt;/p&gt;

&lt;p&gt;These agents store their sessions in undocumented internal files. Nobody owes you stability there. A point release renames one field and nothing looks broken: the binary still runs, auth still works, and the handoff reports success. Meanwhile every delta is quietly empty.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;bridge doctor&lt;/code&gt; got a check nobody asked for. It does not just check that an agent is installed and logged in. It opens each vendor's session files and confirms that the current version of the bridge can still parse them. That failure is invisible otherwise, until you notice that a week of handoffs carried nothing.&lt;/p&gt;

&lt;p&gt;The lesson I keep from it: when you build on another product's internal files, "installed and logged in" tells you nothing. Test the data you depend on, not the binary that writes it.&lt;/p&gt;

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

&lt;p&gt;It is a developer preview, tested and used daily, and open source. The write-up with install steps and the full list of honest limitations is on the project page: &lt;a href="https://dogrubakar.com/projects/context-bridge" rel="noopener noreferrer"&gt;context-bridge on dogrubakar.com&lt;/a&gt;, and the code is on &lt;a href="https://github.com/serdardb/context-bridge" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you also juggle multiple agents, I would love to hear how you handle the context problem today.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
