<?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: Morgan Xu</title>
    <description>The latest articles on DEV Community by Morgan Xu (@bytepro_1774).</description>
    <link>https://dev.to/bytepro_1774</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%2F4064721%2F02474325-4559-45ec-884e-abb11e65a46c.png</url>
      <title>DEV Community: Morgan Xu</title>
      <link>https://dev.to/bytepro_1774</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bytepro_1774"/>
    <language>en</language>
    <item>
      <title>A New Open-Weight Model Drops Every Week. Here's the 30-Minute Eval Harness I Run Before Believing Any Benchmark</title>
      <dc:creator>Morgan Xu</dc:creator>
      <pubDate>Mon, 10 Aug 2026 10:59:39 +0000</pubDate>
      <link>https://dev.to/bytepro_1774/a-new-open-weight-model-drops-every-week-heres-the-30-minute-eval-harness-i-run-before-believing-ebe</link>
      <guid>https://dev.to/bytepro_1774/a-new-open-weight-model-drops-every-week-heres-the-30-minute-eval-harness-i-run-before-believing-ebe</guid>
      <description>&lt;p&gt;If your feed looks anything like mine this week, it's wall-to-wall hot takes about the latest open-weight coding model release — right now it's MiniMax's H3 getting the treatment, last month it was something else, next month it'll be something newer. The pattern is always the same: a launch post, a set of vendor benchmark tables, a wave of "this changes everything" threads, and then, quietly, a trickle of "actually it's mediocre at X" follow-ups.&lt;/p&gt;

&lt;p&gt;I'm not going to tell you whether H3 is good. I haven't run it through enough of my own workloads to say, and honestly, neither have most of the people posting about it. What I can give you is something more durable: a small, reproducible evaluation harness that takes about 30 minutes to set up and tells you whether &lt;em&gt;any&lt;/em&gt; newly released model is worth switching to &lt;em&gt;for your code&lt;/em&gt;, not for a benchmark suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why vendor benchmarks don't answer your actual question
&lt;/h2&gt;

&lt;p&gt;The question a launch benchmark answers is: "How does this model perform on a standardized set of problems under controlled prompting?" The question you actually have is: "Will this model waste less of my time than the one I'm already using, on the kind of work I actually do?"&lt;/p&gt;

&lt;p&gt;These diverge fast. Your work has a specific language mix, a specific repo style, specific tolerance for verbosity, specific failure modes you can't stand (mine: confidently inventing API methods that don't exist). A two-point swing on a public leaderboard says almost nothing about any of that.&lt;/p&gt;

&lt;p&gt;So the harness below is built around &lt;em&gt;your&lt;/em&gt; tasks, scored automatically where possible and by checklist where not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The harness: 12 tasks, 3 scoring tiers
&lt;/h2&gt;

&lt;p&gt;The whole thing is a directory of task prompts plus a runner script. Here's the structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model-eval/
├── tasks/
│   ├── 01_fix_failing_test.md
│   ├── 02_refactor_for_readability.md
│   ├── 03_explain_unfamiliar_code.md
│   ├── ...
│   └── 12_migration_snippet.md
├── runner.py
├── score.py
└── results/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each task file is a prompt plus an expected-output specification. Three tiers of tasks, four each:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 1 — mechanically verifiable.&lt;/strong&gt; Tasks where the output can be checked by a script: "fix this failing pytest," "write a function passing these assertions," "produce valid JSON matching this schema." These get scored by actually executing the output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 2 — checklist verifiable.&lt;/strong&gt; "Refactor this function" tasks scored against an explicit rubric: no behavior change (run the existing tests), no new dependencies, cyclomatic complexity not increased. Partially automatable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 3 — judgment tasks.&lt;/strong&gt; "Explain what this regex does," "review this diff for security issues." Scored by you, but against a written answer key you make &lt;em&gt;before&lt;/em&gt; looking at model output, so you're not grading on vibes.&lt;/p&gt;

&lt;p&gt;Here's the runner — deliberately boring, provider-agnostic, ~40 lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;task_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;task_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latency_s&lt;/span&gt;&lt;span class="sh"&gt;"&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="n"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tokens_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;score_tier1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Write model output to a file, run the task&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s checker script.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;task_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_candidate.py&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;checker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;task_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check.sh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;proc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checker&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;returncode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# whatever provider you're testing
&lt;/span&gt;    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tasks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;run_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tier1_pass&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;score_tier1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tasks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_tier1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&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;Twelve tasks feels small. It is small — deliberately. You'll actually &lt;em&gt;finish&lt;/em&gt; a 12-task eval for every new model that drops. You will not finish a 200-task eval more than once, and an eval you run once is a demo, not a tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to run it without torching your budget
&lt;/h2&gt;

&lt;p&gt;The annoying part of doing this properly used to be access: to compare a new open-weight model against your incumbent, you need both models available through something you can script against, and paying per-token across several providers for eval runs adds up fast, especially when you're iterating on the harness itself.&lt;/p&gt;

&lt;p&gt;This is where I've been using MonkeyCode. Disclosure: This article was prepared as part of MonkeyCode's product outreach. The relevant bit for this workflow is that it offers free access to a set of models plus a free server option, which means the "spin up an endpoint, point the runner at it, tear it down" loop costs me nothing while I'm debugging the harness — and harness debugging is where most of the token spend actually goes, not the final eval run. I'd rather burn my mistakes on a free tier and reserve paid API calls for the comparisons that matter.&lt;/p&gt;

&lt;p&gt;What I appreciate beyond the pricing is the posture: the project leans into open source — the tooling is out in the open, you can read what the client is actually sending, and you're not reverse-engineering a black box to figure out why your eval numbers look weird. For an eval harness specifically, that transparency matters more than for casual use, because "I don't know what the wrapper did to my prompt" invalidates your results.&lt;/p&gt;

&lt;p&gt;If you want to try this workflow yourself, the free server option is enough to get the runner above working end-to-end; grab a task from your own recent git history and start there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned running this against recent releases
&lt;/h2&gt;

&lt;p&gt;Without naming specific scores (your tasks will differ, and that's the whole point), the pattern across the last few open-weight releases I've put through this harness:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tier 1 gaps are smaller than marketing implies.&lt;/strong&gt; Most current-generation open coding models pass the mechanically-verifiable tasks at similar rates. The differentiation has moved to Tier 2 and 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verbosity is a hidden cost.&lt;/strong&gt; One model I tested passed tasks at the same rate as my incumbent but produced 40% more output tokens per task — more to review, more latency, more cost per accepted suggestion. My harness counts &lt;code&gt;tokens_out&lt;/code&gt; for exactly this reason.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure &lt;em&gt;style&lt;/em&gt; matters more than failure &lt;em&gt;rate&lt;/em&gt;.&lt;/strong&gt; I keep a one-line note per failed task: "wrong but obviously wrong" vs "wrong and confident-looking." Models in the second category get rejected even with decent pass rates, because review time is my real bottleneck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency on your hardware/endpoint is not the benchmark's latency.&lt;/strong&gt; A model that looks great in a datacenter demo can be unusable if the endpoint you're actually hitting is slow. Measure it yourself; it's two lines of code, as above.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Limitations, and who shouldn't bother
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Twelve tasks can't measure everything.&lt;/strong&gt; This harness is a smoke test, not a certification. It's good at answering "is this worth a week-long trial," bad at answering "is this safe for production code review."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task selection bias is real.&lt;/strong&gt; If your tasks are all Python bugfixes, you'll pick the model that's best at Python bugfixes. That's fine if that's your job; it's a trap if it isn't. Rebuild the task set when your work changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judgment-tier scoring is still you.&lt;/strong&gt; The pre-written answer key reduces but doesn't eliminate grader drift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you only use a model for autocomplete-style completions&lt;/strong&gt;, this harness is overkill — you're better off measuring accept-rate in your editor for a week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free tiers change.&lt;/strong&gt; Any free model access or free server option — MonkeyCode's included — is an availability claim, not a permanent guarantee. Design your harness so the client is swappable and you're never locked into one endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The actual takeaway
&lt;/h2&gt;

&lt;p&gt;The next time a model drops and the feed explodes — H3 today, something else in three weeks — the correct response isn't hype or dismissal. It's: pull the release, run your twelve tasks, compare against your incumbent on &lt;em&gt;your&lt;/em&gt; rubric, and make a boring evidence-based decision in an afternoon. The teams that get value from the current pace of model releases aren't the ones with the strongest opinions; they're the ones with the cheapest evaluation loop.&lt;/p&gt;

&lt;p&gt;Build the harness once. Every future launch post becomes a 30-minute chore instead of a week of discourse.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>llm</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Green Tests Lie: How I Gate AI-Generated Patches Before They Touch Main</title>
      <dc:creator>Morgan Xu</dc:creator>
      <pubDate>Mon, 10 Aug 2026 08:36:35 +0000</pubDate>
      <link>https://dev.to/bytepro_1774/green-tests-lie-how-i-gate-ai-generated-patches-before-they-touch-main-3ob2</link>
      <guid>https://dev.to/bytepro_1774/green-tests-lie-how-i-gate-ai-generated-patches-before-they-touch-main-3ob2</guid>
      <description>&lt;p&gt;Every team chat I'm in has landed on the same uncomfortable question: an agent can write a plausible patch in ninety seconds, but who vouches for it? Reading the diff by eye feels like due diligence. In practice, it mostly rewards fluency — and generated code is fluent by construction.&lt;/p&gt;

&lt;p&gt;The stance I settled on: treat agent output like a pull request from a stranger with no commit history. You wouldn't merge that because it read nicely. You'd merge it because it survived your gauntlet. Below is the gauntlet I run, built entirely on compute that costs nothing, followed by an honest list of where it falls apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why eyeballing diffs keeps letting bad patches through
&lt;/h2&gt;

&lt;p&gt;When I audit agent patches that got a thumbs-up and later caused trouble, three defects recur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt-shaped correctness.&lt;/strong&gt; The code nails the scenario in the request and crumbles on the adjacent ones — empty input, DST boundaries, a record with ten thousand rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope creep in the edit set.&lt;/strong&gt; You asked for a fix in one module; the patch also nudges a lint config or a lockfile you never mentioned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gates quietly lowered.&lt;/strong&gt; The suite is green because a strict assertion became a loose one, or a test file got an early &lt;code&gt;return&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these announce themselves in a casual read. So the process below makes each one impossible to skip.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gauntlet, stage by stage
&lt;/h2&gt;

&lt;p&gt;Four stages, each producing an artifact you can revisit months later:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Quarantine&lt;/strong&gt; — run the patch in an environment with no network and no secrets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope audit&lt;/strong&gt; — diff the patch against what was actually requested.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adversarial probes&lt;/strong&gt; — tests you write &lt;em&gt;before&lt;/em&gt; looking at the implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision record&lt;/strong&gt; — one file capturing inputs, outputs, and verdict.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Stage 1: Quarantine
&lt;/h2&gt;

&lt;p&gt;The test environment should cost less to destroy than to disinfect. Mine is a scratch clone executed inside a container with networking disabled:&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;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# quarantine.sh — run an untrusted patch with no way in or out&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

&lt;span class="nv"&gt;REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="nv"&gt;PATCHFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;
&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s1"&gt;'rm -rf "$WORKDIR"'&lt;/span&gt; EXIT

git clone &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WORKDIR&lt;/span&gt;&lt;span class="s2"&gt;/tree"&lt;/span&gt;

docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; none &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cap-drop&lt;/span&gt; ALL &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--read-only&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tmpfs&lt;/span&gt; /tmp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WORKDIR&lt;/span&gt;&lt;span class="s2"&gt;/tree"&lt;/span&gt;:/repo &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PATCHFILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;:/queued.patch:ro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-w&lt;/span&gt; /repo &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;local&lt;/span&gt;/gate-runner:py312 &lt;span class="se"&gt;\&lt;/span&gt;
  sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'git apply /queued.patch &amp;amp;&amp;amp; python -m pytest -x -q'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two properties carry all the weight: traffic cannot escape (&lt;code&gt;--network none&lt;/code&gt;), and nothing sensitive can wander in (no credential mounts, no capabilities, read-only root). A useful mental model: you're grading the &lt;em&gt;artifact&lt;/em&gt;, not the agent. It doesn't matter where or how the model executed — only whether the patch survives this box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 2: Scope audit
&lt;/h2&gt;

&lt;p&gt;Before reading a single implementation line, get the full inventory of what the patch touches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git apply &lt;span class="nt"&gt;--stat&lt;/span&gt; /queued.patch
git apply &lt;span class="nt"&gt;--check&lt;/span&gt; /queued.patch   &lt;span class="c"&gt;# a patch that won't apply cleanly gets rejected on the spot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then classify every path relative to the original request:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path in patch&lt;/th&gt;
&lt;th&gt;Asked for?&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/parse_date.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;normal review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tests/test_parse_date.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;manual line-by-line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;reject pending justification&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The one heuristic I'd tattoo on the process: &lt;strong&gt;unrequested modifications to tests, CI configs, or dependency pins start with a presumption of guilt.&lt;/strong&gt; Softening a gate is the cheapest way to make a wrong patch look right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 3: Adversarial probes
&lt;/h2&gt;

&lt;p&gt;A passing project suite only tells you the patch preserved behaviors someone previously thought to test. Everything else is on you. I write a small set of hostile probes aimed at the change's probable weak spots. Say the patch rewrote a date-string parser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# probes/test_date_hostile.py — written by me, never shown to the model
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.parse_date&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;parse_date&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_rejects_feb_29_on_non_leap_year&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;parse_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025-02-29&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_no_silent_rollover_on_month_13&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;parse_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025-13-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_whitespace_and_unicode_padding_not_accepted&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;parse_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\u2003&lt;/span&gt;&lt;span class="s"&gt;2025-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_epoch_boundary_does_not_wrap_negative&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;parse_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1969-12-31&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1969&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One discipline makes this stage honest: &lt;strong&gt;write the probes before you open the diff.&lt;/strong&gt; Once you've seen the implementation, your supposedly independent tests drift toward the cases the model already covers. Attack first, read second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 4: Decision record
&lt;/h2&gt;

&lt;p&gt;Every accepted patch leaves one plain-text bundle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;ask&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;make&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;parse_date&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;strict&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;about&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;malformed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;input"&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-08-09&lt;/span&gt;
&lt;span class="na"&gt;compute&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;free model access + free server via MonkeyCode&lt;/span&gt;
&lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1 requested file, 0 surprise files&lt;/span&gt;
&lt;span class="na"&gt;project suite&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;312 passed&lt;/span&gt;
&lt;span class="na"&gt;hostile probes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4 passed (attempt 1 failed 2, regenerated, then passed)&lt;/span&gt;
&lt;span class="na"&gt;verdict&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;merged; human pass over parse_date.py:8-41&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This feels like paperwork until a September merge quietly regresses in November. Then the record turns a forensic afternoon into a ten-minute lookup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing this on zero budget
&lt;/h2&gt;

&lt;p&gt;The gauntlet consumes two things: repeated model calls (hostile probes regularly send a patch back — budget two or three regeneration rounds per change) and sacrificial compute to run them in.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: This article was prepared as part of MonkeyCode's product outreach.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My current loop runs on MonkeyCode's free model access together with its free server option, which suits exactly this pattern: frequent, low-stakes regeneration where per-call pricing would otherwise push you to ration attempts. That said, nothing in the four stages depends on any specific vendor — any model endpoint plus any disposable machine (a spare laptop, a CI free tier) runs the identical gauntlet. If you're assembling this from zero, rehearsing the workflow on a free tier is a reasonable first step before committing budget anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the gauntlet breaks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It proves behavior, not intent.&lt;/strong&gt; Hostile probes won't surface a deliberately concealed flaw. Human diff review remains required — this process feeds it evidence, it never replaces it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A container is hygiene, not a vault.&lt;/strong&gt; No-network, dropped-capability defaults are prudent, not a promise against a determined exploit. Never quarantine untrusted patches on a host with privileges you'd miss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weak probes, false confidence.&lt;/strong&gt; Stage 3 carries the rigor. If you phone it in, the remaining stages merely document your complacency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skip the ceremony where it doesn't pay&lt;/strong&gt;: one-token typo fixes don't justify four stages. Conversely, irreversible domains — payments, signing, authorization — need a domain expert reading every line regardless of what any suite says.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free tiers shift.&lt;/strong&gt; The model and server availability described here are operator-supplied claims at the time of writing; re-verify before baking them into a team process.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The actual takeaway
&lt;/h2&gt;

&lt;p&gt;The meaningful change is one of phrasing: stop asking "does this generated patch look correct?" and start asking "what can I demonstrate about it?" An offline quarantine, a scoped file audit, probes authored before the reveal, and a saved verdict — that chain is a demonstration, and today it costs essentially nothing to run.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>security</category>
      <category>codereview</category>
    </item>
  </channel>
</rss>
