<?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: Florent Cleron</title>
    <description>The latest articles on DEV Community by Florent Cleron (@commonlayer).</description>
    <link>https://dev.to/commonlayer</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%2F3825523%2F56443aa4-016a-4c4f-ae66-82d86ce1d2bf.jpg</url>
      <title>DEV Community: Florent Cleron</title>
      <link>https://dev.to/commonlayer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/commonlayer"/>
    <language>en</language>
    <item>
      <title>I Turned Notion Into a Shared Brain for AI Agents (and it actually made sense)</title>
      <dc:creator>Florent Cleron</dc:creator>
      <pubDate>Tue, 07 Apr 2026 13:24:31 +0000</pubDate>
      <link>https://dev.to/commonlayer/i-turned-notion-into-a-shared-brain-for-ai-agents-and-it-actually-made-sense-26ha</link>
      <guid>https://dev.to/commonlayer/i-turned-notion-into-a-shared-brain-for-ai-agents-and-it-actually-made-sense-26ha</guid>
      <description>&lt;h2&gt;
  
  
  The thing that bugged me
&lt;/h2&gt;

&lt;p&gt;Every "AI + Notion" demo I've seen does roughly the same thing: you prompt a model, it generates text, the text gets dumped into a Notion page. Done.&lt;/p&gt;

&lt;p&gt;It works. It's fine. But it's basically a fancy copy-paste.&lt;/p&gt;

&lt;p&gt;The agent writes &lt;em&gt;to&lt;/em&gt; Notion, but Notion doesn't &lt;em&gt;do&lt;/em&gt; anything. It's a filing cabinet, not a workspace.&lt;/p&gt;

&lt;p&gt;And that felt like a waste. Because Notion already has databases, relations, statuses, filters — all the building blocks of a workflow engine. We just... never let the agents use them.&lt;/p&gt;

&lt;p&gt;So I had this thought: &lt;strong&gt;what if Notion wasn't the destination, but the coordination layer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/CommonLayer/notion-blackboard" rel="noopener noreferrer"&gt;github.com/CommonLayer/notion-blackboard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What if multiple agents could read and write to shared Notion databases, and that's how they'd collaborate — not through function calls or message queues, but through structured state that a human can see and touch at any point?&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet Notion Blackboard
&lt;/h2&gt;

&lt;p&gt;The idea is dead simple.&lt;/p&gt;

&lt;p&gt;You write an objective in a Notion database. Something like &lt;em&gt;"Prepare a competitive analysis of the AI code editor market."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then a pipeline kicks in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;manager agent&lt;/strong&gt; reads your objective and breaks it into 3-7 concrete tasks (stored in a Task Queue database)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;worker agent&lt;/strong&gt; picks up each task and produces a result (stored in a Results database)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;reviewer agent&lt;/strong&gt; checks every result, scores it, approves or rejects it (logged in an Audit Log database)&lt;/li&gt;
&lt;li&gt;The system compiles everything into one clean &lt;strong&gt;final report&lt;/strong&gt;, published back to Notion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The punchline: &lt;strong&gt;none of these agents talk to each other directly.&lt;/strong&gt; They coordinate entirely through Notion. The manager writes tasks, the worker reads them. The worker writes results, the reviewer reads them. It's asynchronous, inspectable, and weirdly elegant.&lt;/p&gt;

&lt;p&gt;I call it a blackboard architecture — an old AI pattern from the 80s where agents share a common workspace instead of passing messages. Notion just happens to be a very nice blackboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this actually matters
&lt;/h2&gt;

&lt;p&gt;Here's the thing about most multi-agent setups: they're black boxes.&lt;/p&gt;

&lt;p&gt;You fire off a pipeline, stuff happens in memory, logs scroll by in a terminal, and eventually you get an output. If something goes wrong, good luck figuring out where. If you want to tweak the plan mid-run, too bad — the agents already moved on.&lt;/p&gt;

&lt;p&gt;With Notion as the backbone, you get something different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The state is visible.&lt;/strong&gt; Every task, every result, every review sits in a database you can browse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can intervene.&lt;/strong&gt; Don't like a task the manager created? Edit it. Think a result is garbage? Change its status before the reviewer gets to it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The audit trail is real.&lt;/strong&gt; Not buried in a log file — it's right there in a database, filterable, sortable, shareable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The output lives where you already work.&lt;/strong&gt; No "export to PDF" step. The final report is a Notion page your team can read.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not about making agents smarter. It's about making their work &lt;strong&gt;legible&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech under the hood
&lt;/h2&gt;

&lt;p&gt;The stack is intentionally minimal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; — because it's the lingua franca for this kind of thing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion API&lt;/strong&gt; — direct REST calls, no SDK wrapper needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter&lt;/strong&gt; — one API to call Claude, GPT-4o, Gemini, whatever you want&lt;/li&gt;
&lt;li&gt;Each agent uses a different model by default (Claude for planning, GPT-4o for execution, Gemini for review), but you can swap them freely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repo comes with some quality-of-life stuff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bootstrap the full Notion workspace (creates 6 databases)&lt;/span&gt;
python3 main.py &lt;span class="nt"&gt;--bootstrap&lt;/span&gt; &lt;span class="nt"&gt;--parent-page-id&lt;/span&gt; &amp;lt;PAGE_ID&amp;gt;

&lt;span class="c"&gt;# Check that everything is wired correctly&lt;/span&gt;
python3 main.py &lt;span class="nt"&gt;--doctor&lt;/span&gt;

&lt;span class="c"&gt;# Run the pipeline on all pending objectives&lt;/span&gt;
python3 main.py &lt;span class="nt"&gt;--process-objectives&lt;/span&gt;

&lt;span class="c"&gt;# Try it without any API calls&lt;/span&gt;
python3 main.py &lt;span class="s2"&gt;"Your objective here"&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dry-run mode is particularly nice for poking around — it simulates the full pipeline locally with fake data, so you can see the flow without spending tokens or setting up Notion.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Notion workspace looks like
&lt;/h2&gt;

&lt;p&gt;The workspace has two layers, and the split is intentional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you see as a user:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Objectives&lt;/strong&gt; — where you write what you want done&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final Reports&lt;/strong&gt; — where you read the result&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Here&lt;/strong&gt; — a guide page the system auto-generates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's running backstage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Task Queue&lt;/strong&gt; — the manager's work breakdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Results&lt;/strong&gt; — the worker's intermediate outputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit Log&lt;/strong&gt; — every agent action, timestamped&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Registry&lt;/strong&gt; — which agents are active and what model they're running&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had everything in one flat view at first. It was technically correct and completely overwhelming. The two-layer split made it click — you get the clean "objectives in, reports out" experience, with full transparency one click away if you want it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd build next
&lt;/h2&gt;

&lt;p&gt;This is a working prototype, not a SaaS product. But the pattern has legs.&lt;/p&gt;

&lt;p&gt;Things I'm thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Retry loops&lt;/strong&gt; — when the reviewer rejects a result, send it back to the worker automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel workers&lt;/strong&gt; — right now tasks run sequentially, but Notion can handle concurrent writes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web research&lt;/strong&gt; — let the worker agent pull in external sources, with citations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A small web UI&lt;/strong&gt; — so you don't need a terminal to trigger a run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better templates&lt;/strong&gt; — richer formatting for the final reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But honestly, the core loop already works and it's satisfying to watch. Write an objective, go make coffee, come back to a structured report with full traceability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;I think there's a real gap between "AI can generate text" and "AI can get work done in a way humans can follow."&lt;/p&gt;

&lt;p&gt;Most agent frameworks optimize for autonomy — let the agents figure it out, minimize human intervention. That's exciting, but it also means you're trusting a pipeline you can't see.&lt;/p&gt;

&lt;p&gt;Notion Blackboard takes the opposite bet: &lt;strong&gt;make the process the product.&lt;/strong&gt; Every step is visible, editable, and stored in a tool people already use daily. The agents aren't hidden behind an API — they're collaborators in a shared workspace.&lt;/p&gt;

&lt;p&gt;That's the idea, anyway. It's a small project, but I think the pattern is worth exploring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check it out
&lt;/h2&gt;

&lt;p&gt;The code is open source:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/CommonLayer/notion-blackboard" rel="noopener noreferrer"&gt;github.com/CommonLayer/notion-blackboard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're into multi-agent workflows, Notion hacks, or just want to see what happens when you treat a productivity app as an AI coordination protocol — have a look, break things, and let me know what you think.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>notion</category>
      <category>python</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Less Heard — A Terminal Sketch on Gender Equity in Tech</title>
      <dc:creator>Florent Cleron</dc:creator>
      <pubDate>Wed, 18 Mar 2026 07:35:14 +0000</pubDate>
      <link>https://dev.to/commonlayer/less-heard-a-terminal-sketch-on-gender-equity-in-tech-10j8</link>
      <guid>https://dev.to/commonlayer/less-heard-a-terminal-sketch-on-gender-equity-in-tech-10j8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Frontend Art&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Less Heard&lt;/em&gt; is an interactive piece built for the WeCoded Challenge 2026, on the theme of gender equality in tech. No framework, no UI library — just a terminal, a face, and a path you have to walk yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show us your Art
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://fcwebdesign.github.io/Less-Heard/" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Less Heard&lt;/em&gt; is an interactive terminal experience. Type &lt;code&gt;help&lt;/code&gt; to get started, then follow the guided path: &lt;code&gt;speak&lt;/code&gt;, &lt;code&gt;listen&lt;/code&gt;, &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;amplify&lt;/code&gt;, &lt;code&gt;echo&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;There is something ironically equal about an 80s terminal.&lt;/p&gt;

&lt;p&gt;In the early days of personal computing, everyone saw the same thing: monochrome screen, fixed text, green or amber on black. It didn't matter who you were — the interface didn't look at you. It read you. That's where the aesthetic of &lt;em&gt;Less Heard&lt;/em&gt; comes from: a space where form doesn't discriminate.&lt;/p&gt;

&lt;p&gt;The 3D face at the center is neither male nor female. It's an entity, a presence. Behind a computer, we all start at the same point — one of the few equalities tech has always offered. The problem starts after that: when you speak up.&lt;/p&gt;

&lt;p&gt;The core of the piece is the interaction itself. You have to type each word: &lt;code&gt;speak&lt;/code&gt;, &lt;code&gt;listen&lt;/code&gt;, &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;amplify&lt;/code&gt;, &lt;code&gt;echo&lt;/code&gt;. It doesn't scroll automatically. That's intentional. Because that's exactly what's missing in real life: if you don't speak up, if no one validates you, if no one relays what you say — the signal stays below the line. The terminal mechanic forces you to &lt;em&gt;make the journey&lt;/em&gt;. Not just watch it go by.&lt;/p&gt;

&lt;p&gt;The final message: &lt;strong&gt;Heard. Credited. Carried forward.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not "equality is good." Just what's concretely missing when it isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Code
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/fcwebdesign/Less-Heard" rel="noopener noreferrer"&gt;github.com/fcwebdesign/Less-Heard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vanilla HTML/CSS/JS + Three.js. Nothing to install, no build step.&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>frontend</category>
      <category>threejs</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>What if LLMs needed a spine, not a bigger brain?</title>
      <dc:creator>Florent Cleron</dc:creator>
      <pubDate>Mon, 16 Mar 2026 14:22:52 +0000</pubDate>
      <link>https://dev.to/commonlayer/what-if-llms-needed-a-spine-not-a-bigger-brain-4812</link>
      <guid>https://dev.to/commonlayer/what-if-llms-needed-a-spine-not-a-bigger-brain-4812</guid>
      <description>&lt;p&gt;I’ve been building something for the past few months, and I’m still trying to figure out whether I’m hitting a real problem or just over-structuring something that better prompting would already solve.&lt;/p&gt;

&lt;p&gt;My starting intuition is simple: LLMs are very good at generating, but much less reliable when you expect continuity from them. As soon as you want an agent that can hold a line, remember things cleanly, recover after tension, and stay coherent over time, you start seeing the limits of the model on its own. Not necessarily because it lacks intelligence, but because it lacks a kind of skeleton.&lt;/p&gt;

&lt;p&gt;In many systems, the LLM does everything at once: it speaks, it decides, it improvises its own memory and its own frame. And that works, until it starts to drift. Prompting can take you pretty far, but it still feels fragile.&lt;/p&gt;

&lt;p&gt;That’s the space I’m exploring. The idea is to move governance outside the model: the LLM generates, but it does not decide on its own. An explicit policy layer handles decisions, state and memory carry continuity, and a timeline keeps an inspectable trace of what happened.&lt;/p&gt;

&lt;p&gt;What I’m seeing so far is mostly more stability: less invention around internal state, better constraint-following, firmer boundaries under prompt injection, and less drift over long sequences.&lt;/p&gt;

&lt;p&gt;That said, I don’t want to oversell it: I haven’t formally proven state causality, the actual impact of governed memory, or deterministic replay yet. What I have are strong signals, not hard proof.&lt;/p&gt;

&lt;p&gt;I’m posting this mainly to test the framing. Does this way of thinking resonate? Are there better or earlier projects working on the same problem? Or am I just adding structure to something that better prompting will eventually absorb?&lt;/p&gt;

&lt;p&gt;At the core, the question I keep coming back to is simple: if the LLM is the muscle, what does the skeleton look like?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why I make LLMs argue with each other before I make architecture decisions</title>
      <dc:creator>Florent Cleron</dc:creator>
      <pubDate>Sun, 15 Mar 2026 15:48:12 +0000</pubDate>
      <link>https://dev.to/commonlayer/why-i-make-llms-argue-with-each-other-before-i-make-architecture-decisions-5hnn</link>
      <guid>https://dev.to/commonlayer/why-i-make-llms-argue-with-each-other-before-i-make-architecture-decisions-5hnn</guid>
      <description>&lt;h2&gt;
  
  
  The problem with asking one model
&lt;/h2&gt;

&lt;p&gt;You ask Claude about your API design. It gives you a confident, well-structured answer. You move on. Two weeks later, during code review, someone spots the thing the model didn't mention — the thing you would have caught if you'd thought about it from a different angle.&lt;/p&gt;

&lt;p&gt;This happens because LLMs are agreement machines. Ask one model a question, you get one perspective wrapped in confidence. The model won't naturally play devil's advocate against its own answer. It'll give you the best answer &lt;em&gt;it&lt;/em&gt; can produce, not the best answer the &lt;em&gt;problem&lt;/em&gt; deserves.&lt;/p&gt;

&lt;p&gt;I started doing something simple: same prompt, same codebase context, two different models. And I noticed that the interesting part was never where they agreed — it was where they disagreed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured disagreement as a design tool
&lt;/h2&gt;

&lt;p&gt;The idea isn't new. Adversarial review exists in every serious engineering culture: red teams, architecture review boards, RFC processes. What's new is that you can now run a lightweight version of this with LLMs, grounded in your actual code, in minutes instead of days.&lt;/p&gt;

&lt;p&gt;The setup I converged on uses two roles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critic&lt;/strong&gt; — opens each round by pressure-testing the thesis. It looks for fragilities, unexamined assumptions, missing invariants. Its job is to break the argument, not improve it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Builder&lt;/strong&gt; — responds with implementation choices, sequencing, and safeguards. Its job is to defend or adapt the approach while staying concrete.&lt;/p&gt;

&lt;p&gt;Both see the full transcript at every turn. This matters — it forces each model to actually address the other's points instead of talking past them.&lt;/p&gt;

&lt;p&gt;After the rounds, a third model (or one of the two) produces a synthesis. Not a "both sides have good points" summary — a structured recommendation that incorporates the strongest objections.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard part: grounding the debate in code
&lt;/h2&gt;

&lt;p&gt;A debate between two models about abstract architecture is just two blog posts arguing. The value comes from grounding.&lt;/p&gt;

&lt;p&gt;This is the technical problem I spent the most time on. When you point the tool at a codebase, it needs to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build a file tree&lt;/strong&gt; — from a local repo, uploaded files, or a GitHub repository (public or private). This means handling auth tokens, ignoring &lt;code&gt;node_modules&lt;/code&gt;/&lt;code&gt;.git&lt;/code&gt;/&lt;code&gt;dist&lt;/code&gt;, and respecting size limits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resolve excerpts&lt;/strong&gt; — you can't dump an entire repo into a prompt. The tool scores and selects the most relevant excerpts from each selected file, given the debate topic and objective. The default limits are 3 excerpts per source, 18 excerpts max per pack, 2 MB per text file, 10 MB per PDF.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inject as an evidence pack&lt;/strong&gt; — the selected excerpts are injected into both the debate prompts and the synthesis prompt, with &lt;code&gt;[SRC-x]&lt;/code&gt; markers. This forces the models to cite specific files when making claims, instead of hand-waving about "your codebase."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The citation system is what makes the output actually useful. When the Critic says "your pagination contracts are inconsistent across 6 endpoints &lt;code&gt;[SRC-2]&lt;/code&gt;", you can go straight to the file and verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a debate actually looks like
&lt;/h2&gt;

&lt;p&gt;Say you're debating whether to migrate a REST API to GraphQL. You select the relevant route files, the API client code, and the schema definitions.&lt;/p&gt;

&lt;p&gt;The Critic opens by pointing out that migration won't fix existing inconsistencies — it just relocates them from endpoint logic to resolver logic. It flags the risk of nested query over-fetching before rate-limiting is in place.&lt;/p&gt;

&lt;p&gt;The Builder responds: the inconsistencies are scoped to a handful of endpoints that can be normalized as a pre-migration step. Depth limiting and query cost analysis are standard tools. The migration unlocks typed schema sharing across client teams that are currently maintaining hand-written API wrappers.&lt;/p&gt;

&lt;p&gt;The synthesis doesn't split the difference. It says: proceed with a scoped migration, normalize the problematic endpoints first, gate production access on query cost limits, and prioritize the two client teams that benefit most.&lt;/p&gt;

&lt;p&gt;That's more useful than either model's answer alone. Not because the models are smarter together, but because the structure forced the second-order questions to surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this works (and when it doesn't)
&lt;/h2&gt;

&lt;p&gt;This works well for decisions that are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reversible but expensive&lt;/strong&gt; — you're not sure, and being wrong costs weeks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-dimensional&lt;/strong&gt; — there are real tradeoffs, not a single correct answer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groundable&lt;/strong&gt; — there's actual code or documentation to anchor the discussion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn't work well when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The answer is obvious&lt;/strong&gt; — no need for a debate if best practices clearly apply&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The context is too large&lt;/strong&gt; — an entire monorepo won't fit, and excerpt selection can miss things&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need domain-specific expertise&lt;/strong&gt; — the models are limited by what they know about your specific business logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes the debate is noise. Two models going back and forth without surfacing anything you didn't already know. That's fine — it takes a few minutes and costs a few cents. The signal-to-noise ratio improves a lot when you give it well-scoped files and a clear question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation choices
&lt;/h2&gt;

&lt;p&gt;A few technical decisions worth mentioning:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider-agnostic routing.&lt;/strong&gt; The tool supports OpenRouter (single key for any model), direct OpenAI/Anthropic keys, or a mix. Credential resolution happens server-side with a clear priority: UI-provided key &amp;gt; env variable &amp;gt; direct provider routing. This means you can use Claude as the Critic and GPT as the Builder, or any other combination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strict round structure.&lt;/strong&gt; Exactly 2 participants, strict alternating rounds, one synthesis pass. I tried freeform multi-turn and it degenerates quickly — models start being polite instead of precise. The constraint makes the output better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Format-aware synthesis.&lt;/strong&gt; The synthesis step has format presets: tech/architecture, decision/strategy, factual/practical, proof/validation, or auto-detect. This shapes the synthesis prompt to produce the right kind of output rather than a generic summary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No persistence.&lt;/strong&gt; No database, no &lt;code&gt;localStorage&lt;/code&gt; for keys, no saved sessions. Each run is self-contained. The output is a Markdown or JSON export you take with you. This was deliberate — the tool is for decision-making, not conversation management.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;Next.js App Router, TypeScript, React, Tailwind. Provider adapters for OpenRouter, OpenAI, and Anthropic. &lt;code&gt;unpdf&lt;/code&gt; for PDF text extraction. Nothing exotic — the complexity is in the prompt engineering and the evidence pack resolution, not the framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd like to figure out next
&lt;/h2&gt;

&lt;p&gt;The biggest open question is evaluation. How do you measure whether a debate-produced synthesis is actually better than a single-model answer to the same question? I have intuitions from using it, but no systematic way to prove it.&lt;/p&gt;

&lt;p&gt;The second question is excerpt selection. Right now it's scoring-based, but there's probably room for a retrieval step that's more context-aware.&lt;/p&gt;

&lt;p&gt;If you've tried similar multi-model approaches — or if you think this whole idea is flawed — I'm interested in hearing why.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/CommonLayer/model-debate" rel="noopener noreferrer"&gt;github.com/CommonLayer/model-debate&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
