1<!DOCTYPE html> 2<html lang="en"> 3<head> 4<meta charset="utf-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1.0"> 6<title>PairCoder++: Pair Programming as a Universal Paradigm for Verified Code-Driven Multimodal and Structured-Artifact Generation</title> 7<meta name="description" content="PairCoder grounds code review in the toolchain and realizes it as two-agent pair programming. A Driver writes the program, a Navigator reviews it against verification evidence, and the two switch roles when errors persist."> 8<meta property="og:title" content="PairCoder++: Pair Programming as a Universal Paradigm for Verified Code-Driven Multimodal and Structured-Artifact Generation"> 9<meta property="og:description" content="Two-agent pair programming for code-driven multimodal generation, verified by the toolchain. 17 benchmarks, 7 models, 3 vendors."> 10<meta property="og:image" content="assets/img/teaser_multidomain.png"> 11<meta property="og:type" content="website"> 12<link rel="preconnect" href="https://fonts.googleapis.com"> 13<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 14<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> 15<link rel="stylesheet" href="style.css"> 16</head> 17<body> 18 19<div class="accepted-bar"> 20 <span class="trophy">ð</span> Accepted to <strong>ACL 2026 (Findings)</strong> 21</div> 22 23<nav class="topnav"> 24 <div class="nav-inner"> 25 <a class="brand" href="#top">PairCoder++</a> 26 <div class="nav-links"> 27 <a href="#abstract">Abstract</a> 28 <a href="#method">Method</a> 29 <a href="#results">Results</a> 30 <a href="#explore">Explore</a> 31 <a href="#gallery">Gallery</a> 32 <a href="#crossmodel">Cross-Model</a> 33 <a href="#bibtex">BibTeX</a> 34 </div> 35 </div> 36</nav> 37 38<header id="top" class="hero"> 39 <div class="container"> 40 <p class="venue"><span class="acl-badge">ACL 2026 · Findings</span> Code-Driven Multimodal & Structured-Artifact Generation</p> 41 <h1 class="title">PairCoder++: Pair Programming as a Universal Paradigm for Verified<br>Code-Driven Multimodal and Structured-Artifact Generation</h1> 42 43 <div class="authors"> 44 <span><a href="https://yisuanwang.github.io" target="_blank" rel="noopener">Junhao Chen</a><sup>1</sup></span> 45 <span><a href="#">Xiang Li</a><sup>2</sup></span> 46 <span><a href="#">Mingjin Chen</a><sup>3</sup></span> 47 <span><a href="#">Boran Zhang</a><sup>4</sup></span> 48 <span><a href="#">Henghaofan Zhang</a><sup>5</sup></span> 49 <span class="break"></span> 50 <span><a href="#">Yibin Xu</a><sup>6</sup></span> 51 <span><a href="#">Yuehan Cui</a><sup>7</sup></span> 52 <span><a href="#">Fangsheng Weng</a><sup>8</sup></span> 53 <span class="senior">Fei Ma<sup>9</sup></span> 54 <span class="break"></span> 55 <span class="senior">Qi Tian<sup>9</sup></span> 56 <span class="senior">Ruqi Huang<sup>1</sup></span> 57 <span class="senior">Hao Zhao<sup>1,10</sup></span> 58 </div> 59 60 <div class="affil"> 61 <sup>1</sup>Tsinghua University · 62 <sup>2</sup>Peking University · 63 <sup>3</sup>The Hong Kong Polytechnic University<br> 64 <sup>4</sup>University of Science and Technology of China · 65 <sup>5</sup>University of Electronic Science and Technology of China<br> 66 <sup>6</sup>Tongji University · 67 <sup>7</sup>Tianjin University · 68 <sup>8</sup>Independent Researcher<br> 69 <sup>9</sup>Guangming Lab · 70 <sup>10</sup>BAAI 71 </div> 72 73 <div class="buttons"> 74 <a class="btn" href="https://arxiv.org/pdf/2607.01883" target="_blank" rel="noopener"><svg viewBox="0 0 24 24" width="17" height="17"><path fill="currentColor" d="M6 2h9l5 5v15a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1zm8 1.5V8h4.5L14 3.5zM8 13h8v1.5H8V13zm0 3h8v1.5H8V16zm0-6h4v1.5H8V10z"/></svg> Paper</a> 75 <a class="btn" href="https://github.com/yisuanwang/PairCoder" target="_blank" rel="noopener"><svg viewBox="0 0 24 24" width="17" height="17">
75<path fill="currentColor" d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2c-3.2.7-3.9-1.5-3.9-1.5-.5-1.3-1.3-1.7-1.3-1.7-1.1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.3 1.2a11.5 11.5 0 0 1 6 0C17.3 4.6 18.3 5 18.3 5c.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.3c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"/></svg> Code</a> 76 <a class="btn" href="https://arxiv.org/abs/2607.01883" target="_blank" rel="noopener"><svg viewBox="0 0 24 24" width="17" height="17"><path fill="currentColor" d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h12v2H3v-2z"/></svg> arXiv</a> 77 <a class="btn" href="#bibtex"><svg viewBox="0 0 24 24" width="17" height="17"><path fill="currentColor" d="M7 3h10a2 2 0 0 1 2 2v16l-7-3-7 3V5a2 2 0 0 1 2-2z"/></svg> Cite</a> 78 </div> 79 </div> 80</header> 81 82<section class="teaser"> 83 <div class="container"> 84 <figure> 85 <img src="assets/img/teaser_multidomain.png" alt="PairCoder improves code generation across artifact domains" loading="lazy"> 86 <figcaption><strong>PairCoder improves code generation across every artifact domain, not only Python program synthesis.</strong> 87 Left: single model (light) versus PairCoder (dark) on all 17 public benchmarks, with the absolute gain in percentage points. Right: cases where the baseline also renders an artifact, so the comparison isolates artifact quality — the baseline drifts from the target while PairCoder matches it closely.</figcaption> 88 </figure> 89 </div> 90</section> 91 92<section class="stats"> 93 <div class="container stat-grid"> 94 <div class="stat"><div class="num">17</div><div class="lbl">public benchmarks</div></div> 95 <div class="stat"><div class="num">7</div><div class="lbl">models, 3 vendors</div></div> 96 <div class="stat"><div class="num">0.20→0.78</div><div class="lbl">Blender executability</div></div> 97 <div class="stat"><div class="num">+10–30</div><div class="lbl">Ti<i>k</i>Z compile points</div></div> 98 <div class="stat"><div class="num">2</div><div class="lbl">agents: Driver + Navigator</div></div> 99 </div> 100</section> 101 102<section id="abstract" class="block"> 103 <div class="container narrow"> 104 <h2>Abstract</h2> 105 <p>Code is the medium through which large language models generate structured artifacts: charts, scientific figures, vector graphics, CAD models, 3D scenes, and hardware designs are all produced by writing programs. In this regime single-pass inference is brittle, because the compiler, renderer, or simulator that decides whether the artifact exists is invisible to the model. We present <strong>PairCoder</strong>, which grounds review in the toolchain and realizes it as two-agent pair programming: a <strong>Driver</strong> agent writes the program, a <strong>Navigator</strong> agent reviews it against verification evidence (diagnostics, execution results, and renderings of the current artifact beside the target), and the two switch roles when errors persist. Across 17 public benchmarks and seven models from three vendors, PairCoder improves essentially every benchmark whose artifact is verifiable, on full official metric suites rather than execution alone (for example, Blender scene executability 0.20→0.78; Ti<i>k</i>Z compile rate up 10 to 30 points on every model), at 2.9 to 9.2 times single-model cost (about 7 times overall). The improvements concentrate where the toolchain provides an informative oracle and the baseline leaves headroom, and the method ties or mildly regresses where the oracle is weak, so we frame pair programming as a reliable recipe for code-driven generation of structured data and multimodal content wherever a trustworthy verification oracle exists.</p> 106 </div> 107</section> 108 109<section id="method" class="block alt"> 110 <div class="container"> 111 <h2>The PairCoder Framework</h2> 112 <p class="lead">A minimal two-agent loop that turns code-driven generation into a toolchain-verified dialogue. The Driver writes and revises the program; the Navigator reviews each candidate against concrete verification evidence; control of the keyboard follows the diagnosis.</p> 113 <figure class="wide"> 114 <img src="assets/img/agent_framework.png" alt="PairCoder framework: Driver and Navigator collaboration with role switching" loading="lazy">
115 <figcaption>Iterative collaboration between the Driver (code generation) and Navigator (review and feedback) agents, with the automatic role-switching mechanism.</figcaption> 116 </figure> 117 118 <div class="cards"> 119 <div class="card"> 120 <div class="card-ico">1</div> 121 <h3>Driver & Navigator with Self-Mirror prompting</h3> 122 <p>The Driver generates and revises while the Navigator reviews, each under a role-specific system prompt over the shared task and memory, preserving two genuinely different perspectives on the same code.</p> 123 </div> 124 <div class="card"> 125 <div class="card-ico">2</div> 126 <h3>Verification-grounded review</h3> 127 <p>Each candidate is compiled, executed, or rendered by the benchmark's own toolchain. The evidence — diagnostics, test outcomes, and a rendering of the artifact beside the target — is attached to the review. The Navigator must cite a concrete error or accept with <code>[NOERROR]</code>, which prevents churn on already-correct programs.</p> 128 </div> 129 <div class="card"> 130 <div class="card-ico">3</div> 131 <h3>Error-triggered role switching</h3> 132 <p>Persistent errors swap the roles so the agent that diagnosed the fault repairs it. An exhausted budget returns the candidate with the best verified quality rather than the last one.</p> 133 </div> 134 </div> 135 </div> 136</section> 137 138<section id="results" class="block"> 139 <div class="container"> 140 <h2>Multimodal Results</h2> 141 <p class="lead">Each cell is <em>single model → <strong>PairCoder</strong></em> at <code>gpt-5.4</code> (thinking disabled). PairCoder improves <strong>every official metric on all seven</strong> multimodal benchmarks — executability, visual similarity, and geometry alike.</p> 142 143 <div class="table-wrap"> 144 <table class="results"> 145 <thead> 146 <tr><th>Benchmark</th><th>Metric</th><th>Single</th><th>PairCoder</th></tr> 147 </thead> 148 <tbody> 149 <tr><td rowspan="2">DaTikZ <span class="n">(60)</span></td><td>valid render ↑</td><td>0.717</td><td class="win">0.967</td></tr> 150 <tr><td>SSIM / CLIP / DINO ↑</td><td>.363/.566/.530</td><td class="win">.512/.770/.698</td></tr> 151 152 <tr><td rowspan="2">Plot2Code <span class="n">(132)</span></td><td>execution rate ↑</td><td>0.962</td><td class="win">0.977</td></tr> 153 <tr><td>SSIM / CLIP ↑</td><td>.476/.916</td><td class="win">.495/.920</td></tr> 154 155 <tr><td rowspan="2">PandasPlotBench <span class="n">(175)</span></td><td>execution rate ↑</td><td>0.966</td><td class="win">0.994</td></tr> 156 <tr><td>SSIM / CLIP ↑</td><td>.567/.909</td><td class="win">.610/.944</td></tr> 157 158 <tr><td rowspan="2">ChartMimic <span class="n">(60)</span></td><td>execution rate ↑</td><td>0.917</td><td class="win">0.983</td></tr> 159 <tr><td>SSIM ↑</td><td>.533</td><td class="win">.582</td></tr> 160 161 <tr><td rowspan="2">StarVector <span class="n">(60)</span></td><td>render rate ↑</td><td>0.900</td><td class="win">1.000</td></tr> 162 <tr><td>SSIM / CLIP / DINO ↑</td><td>.776/.859/.820</td><td class="win">.873/.954/.906</td></tr> 163 164 <tr><td rowspan="2">GenCAD-Code <span class="n">(60)</span></td><td>execution rate ↑</td><td>0.867</td><td class="win">0.983</td></tr> 165 <tr><td>Chamfer (agg.) ↓</td><td>0.259</td><td class="win">0.155</td></tr> 166 167 <tr><td rowspan="3">3DCodeBench <span class="n">(60)</span></td><td>executability ↑</td><td>0.433</td><td class="win">0.783</td></tr> 168 <tr><td>SigLIP-2 / DINO (agg.) ↑</td><td>.263/.129</td><td class="win">.842/.512</td></tr> 169 <tr><td>Chamfer (agg.) ↓</td><td>4.66</td><td class="win">1.66</td></tr> 170 </tbody> 171 </table> 172 </div> 173 <p class="note">Aggregate scores count non-executing generations as worst case. <span class="winkey"></span> Green marks a PairCoder improvement.</p> 174 175 <div class="two-col"> 176 <figure> 177 <img src="assets/img/cost_gain.png" alt="Cost versus benefit per benchmark" loading="lazy">
178 <figcaption><strong>Cost vs. benefit at <code>gpt-5.4-mini</code>.</strong> Per-benchmark token multiplier against gain on the primary metric. Spend concentrates where it converts — the largest multipliers coincide with the largest gains.</figcaption> 179 </figure> 180 <figure> 181 <img src="assets/img/roleswitch.png" alt="Role switching policy comparison" loading="lazy"> 182 <figcaption><strong>Role-switching policy.</strong> Official metric (top) and PairCoder token cost (bottom) for four policies. Switching on each error is best or tied-best on all four benchmarks at a modest token premium.</figcaption> 183 </figure> 184 </div> 185 </div> 186</section> 187 188<section id="explore" class="block"> 189 <div class="container"> 190 <h2>Explore All Results</h2> 191 <p class="lead">The full main table, interactive: 17 benchmarks × 7 models from 3 vendors, single model versus PairCoder. The default view shows <strong>every number at once</strong>, color-coded by improvement; switch to a chart to drill into one benchmark or one model.</p> 192 193 <div class="explorer"> 194 <div class="ex-controls"> 195 <div class="seg" role="tablist"> 196 <button class="seg-btn active" data-mode="table">Full table</button> 197 <button class="seg-btn" data-mode="bench">By benchmark</button> 198 <button class="seg-btn" data-mode="model">By model</button> 199 </div> 200 <div class="ex-selectors" id="ex-selectors" hidden> 201 <label id="lbl-bench">Benchmark<br><select id="sel-bench"></select></label> 202 <label id="lbl-metric">Metric<br><select id="sel-metric"></select></label> 203 <label id="lbl-model" hidden>Model<br><select id="sel-model"></select></label> 204 </div> 205 <div class="ex-legend" id="ex-legend"> 206 <span><i class="sw imp"></i> improves</span> 207 <span><i class="sw reg"></i> regresses</span> 208 <span><i class="sw tie"></i> tie</span> 209 <span><i class="sw na"></i> n/a</span> 210 </div> 211 </div> 212 <div id="ex-table" class="pc-grid-wrap"></div> 213 <div class="chart-box" id="ex-chart" hidden><canvas id="pcChart"></canvas></div> 214 <p class="ex-note" id="ex-note"></p> 215 </div> 216 </div> 217</section> 218 219<section id="gallery" class="block alt"> 220 <div class="container"> 221 <h2>Qualitative Gallery</h2> 222 <p class="lead">For each domain: target / reference, single-model baseline, and PairCoder side by side. The benchmarks rotate automatically — hover to pause, or click a tab to take over.</p> 223 224 <div class="tabs" role="tablist" data-auto="3500"> 225 <button class="tab active" data-tab="g-datikz">DaTikZ</button> 226 <button class="tab" data-tab="g-plot2code">Plot2Code</button> 227 <button class="tab" data-tab="g-ppb">PandasPlotBench</button> 228 <button class="tab" data-tab="g-chartmimic">ChartMimic</button> 229 <button class="tab" data-tab="g-starvector">StarVector</button> 230 <button class="tab" data-tab="g-gencad">GenCAD</button> 231 <button class="tab" data-tab="g-tdcb">3DCodeBench</button> 232 </div> 233 234 <div class="tab-panels"> 235 <figure class="panel active" id="g-datikz"><img src="assets/img/gallery_datikz.png" alt="DaTikZ gallery" loading="lazy"><figcaption>DaTikZ: caption → Ti<i>k</i>Z / L<span class="ll">a</span>T<span class="ll">e</span>X.</figcaption></figure> 236 <figure class="panel" id="g-plot2code"><img src="assets/img/gallery_plot2code.png" alt="Plot2Code gallery" loading="lazy"><figcaption>Plot2Code: image → matplotlib.</figcaption></figure> 237 <figure class="panel" id="g-ppb"><img src="assets/img/gallery_ppb.png" alt="PandasPlotBench gallery" loading="lazy"><figcaption>PandasPlotBench: data → matplotlib.</figcaption></figure> 238 <figure class="panel" id="g-chartmimic"><img src="assets/img/gallery_chartmimic.png" alt="ChartMimic gallery" loading="lazy"><figcaption>ChartMimic: chart → matplotlib.</figcaption></figure> 239 <figure class="panel" id="g-starvector"><img src="assets/img/gallery_starvector.png" alt="StarVector gallery" loading="lazy"><figcaption>StarVector: image → SVG.</figcaption></figure> 240 <figure class="panel" id="g-gencad"><img src="assets/img/gallery_gencad.png" alt="GenCAD gallery" loading="lazy"><figcaption>GenCAD-Code: image → CadQuery.</figcaption></figure> 241 <figure class="panel" id="g-tdcb"><img src="assets/img/gallery_tdcb.png" alt="3DCodeBench gallery" loading="lazy"><figcaption>3DCodeBench: text → Blender script.</figcaption></figure> 242 </div> 243 </div> 244</section> 245 246<section id="crossmodel" class="block"> 247 <div class="container"> 248 <h2>Cross-Model Generality</h2> 249 <p class="lead">The same tasks rendered across models from three vendors, baseline versus PairCoder. The headline transfers: domains with a strong toolchain signal improve on nearly every applicable model.</p> 250 251 <div class="tabs" role="tablist"> 252 <button class="tab active" data-tab="x-p2c">Plot2Code</button> 253 <button class="tab" data-tab="x-ppb">PandasPlotBench</button> 254 <button class="tab" data-tab="x-chart">ChartMimic</button> 255 <button class="tab" data-tab="x-svg">StarVector</button> 256 <button class="tab" data-tab="x-tdcb">3DCodeBench</button> 257 </div> 258 <div class="tab-panels"> 259 <figure class="panel active" id="x-p2c"><img src="assets/img/xm_p2c.png" alt="Cross-model Plot2Code" loading="lazy"><figcaption>Plot2Code across models.</figcaption></figure> 260 <figure class="panel" id="x-ppb"><img src="assets/img/xm_ppb.png" alt="Cross-model PandasPlotBench" loading="lazy"><figcaption>PandasPlotBench across models.</figcaption></figure> 261 <figure class="panel" id="x-chart"><img src="assets/img/xm_chart.png" alt="Cross-model ChartMimic" loading="lazy"><figcaption>ChartMimic across models.</figcaption></figure> 262 <figure class="panel" id="x-svg"><img src="assets/img/xm_svg.png" alt="Cross-model StarVector" loading="lazy"><figcaption>StarVector across models.</figcaption></figure> 263 <figure class="panel" id="x-tdcb"><img src="assets/img/xm_tdcb.png" alt="Cross-model 3DCodeBench" loading="lazy"><figcaption>3DCodeBench across models.</figcaption></figure> 264 </div> 265 </div> 266</section> 267 268<section id="bibtex" class="block alt"> 269 <div class="container narrow"> 270 <h2>BibTeX</h2> 271 <p class="lead"><strong>PairCoder++</strong> (arXiv:2607.01883):</p> 272 <pre class="bib"><code>@misc{chen2026paircoderpairprogramminguniversal, 273 title={PairCoder++: Pair Programming as a Universal Paradigm for 274 Verified Code-Driven Multimodal and Structured-Artifact Generation}, 275 author={Junhao Chen and Xiang Li and Mingjin Chen and Boran Zhang and 276 Henghaofan Zhang and Yibin Xu and Yuehan Cui and Fangsheng Weng and 277 Fei Ma and Qi Tian and Ruqi Huang and Hao Zhao}, 278 year={2026}, 279 eprint={2607.01883}, 280 archivePrefix={arXiv}, 281 primaryClass={cs.CL}, 282 url={https://arxiv.org/abs/2607.01883} 283}</code></pre> 284 <button class="copy-btn" id="copyBib">Copy BibTeX</button> 285 <p class="lead" style="margin-top:1.75rem">The original <strong>PairCoder</strong> (<a href="https://aclanthology.org/2026.findings-acl.149/">ACL 2026 Findings</a>):</p> 286 <pre class="bib"><code>@inproceedings{chen2026paircoder, 287 title = {PairCoder: Pair Programming-Inspired Two-Agent 288 Collaboration for Code Generation},
289 author = {Chen, Junhao and Li, Xiang and Xu, Yibin and Cui, Yuehan and 290 Weng, Fangsheng and Zhao, Hao and Ma, Fei and Tian, Qi}, 291 booktitle = {Findings of the Association for Computational Linguistics: ACL 2026}, 292 pages = {3043--3058}, 293 year = {2026} 294}</code></pre> 295 </div> 296</section> 297 298<footer class="footer"> 299 <div class="container"> 300 <p>PairCoder++ · <a href="https://github.com/yisuanwang/PairCoder">github.com/yisuanwang/PairCoder</a></p> 301 <p class="fine">Page template hand-built for the PairCoder project. Website content © the authors.</p> 302 </div> 303</footer> 304
305<script src="script.js"></script>
vendor: 1 bytes, line 305
305
306<script src="data.js"></script>
vendor: 1 bytes, line 306
306
307<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/chart.umd.min.js"></script>
vendor: 1 bytes, line 307
307
308<script src="explorer.js"></script>
308 309</body> 310</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.