<?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>A Valid Plot Map Is Not a Due Diligence Statement</title>
      <dc:creator>Serdar Doğrubakar</dc:creator>
      <pubDate>Wed, 21 Oct 2026 10:45:20 +0000</pubDate>
      <link>https://dev.to/serdardb/a-valid-plot-map-is-not-a-due-diligence-statement-2h4n</link>
      <guid>https://dev.to/serdardb/a-valid-plot-map-is-not-a-due-diligence-statement-2h4n</guid>
      <description>&lt;p&gt;When a supplier sends a GeoJSON or KML file, the first problem is often treated as a compliance problem. In practice, it is usually a data-quality problem first.&lt;/p&gt;

&lt;p&gt;A plot file can open in a map viewer and still be unsuitable for the next step. It may contain a self-intersection, a ring that is not closed, an invalid geometry type, the wrong coordinate reference system, or a feature placed hundreds of kilometres from the stated origin. None of those errors tells you whether the land was deforested, whether production was legal, or whether an operator can complete its own due diligence. They do tell you that the file needs attention before those questions can be assessed reliably.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check before reviewing the evidence
&lt;/h2&gt;

&lt;p&gt;A useful first pass separates four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the file readable?&lt;/li&gt;
&lt;li&gt;Is the geometry valid?&lt;/li&gt;
&lt;li&gt;Is the location plausible for the declared source?&lt;/li&gt;
&lt;li&gt;Is the corrected file traceable to the original?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These checks are easy to mix together. A repaired polygon is not proof of land-use history. A point inside a country is not proof of origin. A file that passes a geometry validator is not a certification.&lt;/p&gt;

&lt;p&gt;For a practical workflow, start by keeping the supplier file unchanged. Work on a copy and record what was inspected. Check the file format, feature types, coordinate reference system and geometry validity. Then inspect the shape on a map. A narrow strip crossing a coastline, a polygon with a spike, or a feature in the wrong hemisphere is often easier to see than to infer from raw coordinates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repairs should be visible
&lt;/h2&gt;

&lt;p&gt;Some repairs are mechanical. A geometry can sometimes be closed, normalized, or made valid. Those operations should produce a new file and a clear record of what changed. The original should remain available for comparison.&lt;/p&gt;

&lt;p&gt;The important distinction is between a repair preview and a verified fact. A preview can show how a geometry operation would change the shape. It cannot establish that the replacement boundary is the supplier's true plot. That still requires a person with the relevant source information to review it.&lt;/p&gt;

&lt;p&gt;The same principle applies to coordinate transformations. Reprojecting a file may make it display correctly, but it does not correct a wrong location. A transformation changes how coordinates are interpreted. It does not create missing provenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the handoff simple
&lt;/h2&gt;

&lt;p&gt;A useful handoff package can contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the original file&lt;/li&gt;
&lt;li&gt;the corrected working copy&lt;/li&gt;
&lt;li&gt;a short change log&lt;/li&gt;
&lt;li&gt;the validation result&lt;/li&gt;
&lt;li&gt;the map view used for the visual check&lt;/li&gt;
&lt;li&gt;the source and date of any external reference&lt;/li&gt;
&lt;li&gt;the person responsible for the next review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is preparation, not a substitute for the operator's own assessment. The final decision about evidence, risk and any formal filing remains with the responsible organization.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://eudrtools.com" rel="noopener noreferrer"&gt;EUDR Tools&lt;/a&gt; around this narrow preparation problem. Its Map Studio lets a user inspect GeoJSON and KML files, see geometry issues, preview selected repairs and export a working copy. The site's HS/CN scope and country-risk pages are separate lookups. They do not certify a product, verify legality or deforestation status, or submit a due diligence statement on someone else's behalf.&lt;/p&gt;

&lt;p&gt;That boundary is deliberate. Better files make later review easier, but a clean map is only one part of a much larger evidence chain.&lt;/p&gt;

</description>
      <category>data</category>
      <category>software</category>
      <category>softwareengineering</category>
    </item>
    <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>
