<?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: Finley Zhu</title>
    <description>The latest articles on DEV Community by Finley Zhu (@gitgo_1900).</description>
    <link>https://dev.to/gitgo_1900</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%2F4066408%2Fa41d9f86-e297-4e74-871a-ea6f4bcff946.png</url>
      <title>DEV Community: Finley Zhu</title>
      <link>https://dev.to/gitgo_1900</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gitgo_1900"/>
    <language>en</language>
    <item>
      <title>New Open-Weight Model Drops Every Week. Here's a Reproducible Way to Decide If It Belongs in Your Workflow</title>
      <dc:creator>Finley Zhu</dc:creator>
      <pubDate>Mon, 10 Aug 2026 11:07:25 +0000</pubDate>
      <link>https://dev.to/gitgo_1900/new-open-weight-model-drops-every-week-heres-a-reproducible-way-to-decide-if-it-belongs-in-your-52b4</link>
      <guid>https://dev.to/gitgo_1900/new-open-weight-model-drops-every-week-heres-a-reproducible-way-to-decide-if-it-belongs-in-your-52b4</guid>
      <description>&lt;p&gt;Every few weeks another open-weight model release lights up the timeline — MiniMax's recent open model drop being the latest example — and the comment sections fill with the same two questions: "Is it actually good at code?" and "Where can I run it without a credit card?"&lt;/p&gt;

&lt;p&gt;I can't answer the first question for you, and honestly, neither can the benchmark screenshots floating around. Benchmarks measure a distribution of tasks that may not look anything like &lt;em&gt;your&lt;/em&gt; tasks. What I can give you is a small, reproducible evaluation harness you can point at any OpenAI-compatible endpoint, plus a decision table for when free-hosted options are good enough versus when you need your own hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why leaderboard scores won't save you
&lt;/h2&gt;

&lt;p&gt;Public coding benchmarks have three well-known problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Contamination.&lt;/strong&gt; Popular benchmark tasks leak into training data. A model can "know" the answer without being able to solve a novel variant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distribution mismatch.&lt;/strong&gt; A benchmark full of self-contained algorithm puzzles tells you little about how a model handles a 40-file refactor with ambiguous requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No cost signal.&lt;/strong&gt; A model that scores 3 points higher but needs 4x the tokens (or a GPU you don't have) may be a net loss.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix is boring but effective: build a tiny private test set from &lt;em&gt;your own&lt;/em&gt; recent work, and re-run it against each new model that catches your attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  The artifact: a 60-line eval harness
&lt;/h2&gt;

&lt;p&gt;This harness is a proposal you can adapt — it's deliberately simple. It takes a folder of prompts (yours, not scraped from public benchmarks), sends them to any OpenAI-compatible chat endpoint, and records raw outputs plus latency so you can score them yourself.&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;# mini_eval.py — run your own coding evals against any compatible endpoint
&lt;/span&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;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;  &lt;span class="c1"&gt;# pip install openai
&lt;/span&gt;
&lt;span class="n"&gt;ENDPOINT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EVAL_BASE_URL&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;http://localhost:8000/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;API_KEY&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EVAL_API_KEY&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;not-needed-for-local&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;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EVAL_MODEL&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;your-model-name&lt;/span&gt;&lt;span class="sh"&gt;"&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="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ENDPOINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;API_KEY&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;run_eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_dir&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;out_file&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;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;prompt_path&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="n"&gt;prompt_dir&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;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prompt_path&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;t0&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;resp&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="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&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;messages&lt;/span&gt;&lt;span class="o"&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# low temp: we want reproducibility, not creativity
&lt;/span&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;dt&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;t0&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
        &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&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;dt&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;completion_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&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;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="nf"&gt;print&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="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prompt_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&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="n"&gt;out_file&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="nf"&gt;print&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="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Wrote &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&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="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; results to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out_file&lt;/span&gt;&lt;span class="si"&gt;}&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="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="nf"&gt;run_eval&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;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="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&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;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompts/&lt;/span&gt;&lt;span class="sh"&gt;"&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;argv&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="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&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;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build your prompt folder from real work:&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="s"&gt;prompts/&lt;/span&gt;
  &lt;span class="s"&gt;01-fix-this-flaky-test.md&lt;/span&gt;       &lt;span class="c1"&gt;# paste a real failing test + stack trace&lt;/span&gt;
  &lt;span class="s"&gt;02-refactor-callback-to-async.md&lt;/span&gt; &lt;span class="c1"&gt;# a real function from your codebase&lt;/span&gt;
  &lt;span class="s"&gt;03-explain-this-regex.md&lt;/span&gt;        &lt;span class="c1"&gt;# something you actually didn't understand&lt;/span&gt;
  &lt;span class="s"&gt;04-write-migration-sql.md&lt;/span&gt;       &lt;span class="c1"&gt;# a schema change you recently made&lt;/span&gt;
  &lt;span class="s"&gt;05-review-this-diff.md&lt;/span&gt;          &lt;span class="c1"&gt;# a real PR diff (secrets removed)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two rules that make this useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use tasks where you already know the right answer.&lt;/strong&gt; You're grading, not exploring. Five to ten prompts is plenty; you want a fast smoke test, not a dissertation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the outputs of the model you use today&lt;/strong&gt; as the baseline file. A new model only earns a switch if it beats your baseline &lt;em&gt;on your tasks&lt;/em&gt;, not on a leaderboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scoring is manual but fast: read each output, mark pass/fail/partial, note latency and token usage. Fifteen minutes per model, once per interesting release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to run it: a decision table
&lt;/h2&gt;

&lt;p&gt;This is where access matters more than model quality. When a release like MiniMax's latest drops, the bottleneck for most individual developers isn't curiosity — it's a place to run the thing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Sensible option&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Just want a quick vibe-check on a new model&lt;/td&gt;
&lt;td&gt;A hosted free tier with model access&lt;/td&gt;
&lt;td&gt;Zero setup; good enough for a 10-prompt smoke test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evaluating models regularly, don't own a GPU&lt;/td&gt;
&lt;td&gt;A free hosted server / sandbox&lt;/td&gt;
&lt;td&gt;Persistent environment, your harness lives there&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need data privacy (client code, prod schemas)&lt;/td&gt;
&lt;td&gt;Self-host on your own hardware&lt;/td&gt;
&lt;td&gt;Nothing leaves your network; free tiers are wrong tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load testing or long batch jobs&lt;/td&gt;
&lt;td&gt;Paid or dedicated compute&lt;/td&gt;
&lt;td&gt;Free tiers aren't sized or intended for this&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regulated industry / compliance review needed&lt;/td&gt;
&lt;td&gt;Whatever your compliance team approves&lt;/td&gt;
&lt;td&gt;Don't improvise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On the first two rows: I've been using MonkeyCode for this kind of quick-evaluation loop — it offers free access to models and a free server option, which covers exactly the "I want to run my 10 prompts against the new hotness tonight" scenario without provisioning anything. &lt;em&gt;Disclosure: This article was prepared as part of MonkeyCode's product outreach.&lt;/em&gt; What I find genuinely aligned with how I work, though, is its open-source orientation: the harness above is just a script against a standard endpoint, so nothing about the evaluation method locks you into any one provider. If the free options disappear tomorrow, the same script runs against a local vLLM or Ollama server by changing one environment variable. That portability is, to me, the practical meaning of open-source spirit — the workflow belongs to you, not the platform.&lt;/p&gt;

&lt;p&gt;To run the harness against MonkeyCode's free server, you'd set:&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;EVAL_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;your-server-endpoint&amp;gt;/v1"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;EVAL_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;the model you want to test&amp;gt;"&lt;/span&gt;
python mini_eval.py prompts/ results_new_model.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm intentionally not naming specific models, quotas, or limits here — availability on free tiers changes fast, so check what's actually offered when you sign up rather than trusting any article (including this one) to be current.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations, honestly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Five prompts is a smoke test, not science.&lt;/strong&gt; It will catch "this model is broken for my use case" and "this is surprisingly good." It will not give you a defensible ranking. If you need that, look at proper eval frameworks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free tiers have ceilings.&lt;/strong&gt; Expect rate limits, queues, or capacity changes. They're for evaluation and light use, not for piping into your CI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency numbers from a shared hosted endpoint are noisy.&lt;/strong&gt; Treat them as order-of-magnitude signals only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't paste proprietary code into any hosted service&lt;/strong&gt;, free or paid, without checking your obligations. Keep your prompt set sanitized.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who should skip this approach
&lt;/h2&gt;

&lt;p&gt;If your team already has an internal eval platform, use that. If you need auditable, statistically meaningful comparisons for a purchasing decision, you need far more than ten hand-graded prompts. And if your code can't leave your network, no hosted free tier — MonkeyCode's included — is the right answer; self-host an open-weight model instead, and the same harness still works.&lt;/p&gt;

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

&lt;p&gt;The next time a model release floods your feed, you don't need to take anyone's word for it — including mine. Keep a small private prompt set, keep a baseline, and spend fifteen minutes getting your own answer. Free model access and a free server lower the cost of that answer to roughly zero, and an open, portable workflow means the answer stays yours no matter where you run it.&lt;/p&gt;

&lt;p&gt;If you end up building your own prompt set, I'd be curious what five tasks you picked — the spread of "real work" tasks across developers is more interesting than any benchmark.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your AI Reviewer Needs a Reviewer: A Free Pipeline for Stress-Testing Suggested Diffs</title>
      <dc:creator>Finley Zhu</dc:creator>
      <pubDate>Mon, 10 Aug 2026 08:50:40 +0000</pubDate>
      <link>https://dev.to/gitgo_1900/your-ai-reviewer-needs-a-reviewer-a-free-pipeline-for-stress-testing-suggested-diffs-4i5p</link>
      <guid>https://dev.to/gitgo_1900/your-ai-reviewer-needs-a-reviewer-a-free-pipeline-for-stress-testing-suggested-diffs-4i5p</guid>
      <description>&lt;p&gt;Last month I applied an AI-suggested fix to a retry loop without checking it properly. The change looked clean: fewer lines, clearer naming, and my test suite stayed green. What I didn't notice was that the model had moved a &lt;code&gt;sleep&lt;/code&gt; outside a conditional, so every successful request now paid a delay that used to apply only to retries. The tests passed because no test ever timed that path.&lt;/p&gt;

&lt;p&gt;That experience changed how I treat AI code-review suggestions. The suggestion itself is a hypothesis, not an answer, and hypotheses deserve experiments. This post describes the experiment setup I now run on every non-trivial suggestion: an isolated copy of the repo, a behavioral probe that refuses to accept "zero tests ran" as success, a static scan, and an adversarial second model pass. The whole thing runs on free model access and a free hosted server, so there is no per-call cost excuse for skipping the second opinion.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually goes wrong with suggested diffs
&lt;/h2&gt;

&lt;p&gt;Obvious garbage is easy to reject. The suggestions that hurt you share three traits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They are &lt;em&gt;locally&lt;/em&gt; sensible but violate an invariant that lives outside the snippet the model was shown.&lt;/li&gt;
&lt;li&gt;They alter edge-case behavior — short-circuit order, regex reach, error paths — in ways the stated reasoning never mentions.&lt;/li&gt;
&lt;li&gt;They occasionally weaken a validation or sanitization step, reopening a class of bug someone fixed years ago.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A verification pipeline therefore has to produce three kinds of evidence: the changed code still behaves (tests), it doesn't introduce known-bad patterns (static analysis), and its stated reasoning survives hostile scrutiny (a second model asked to find divergence, not to agree).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step one: quarantine the suggestion
&lt;/h2&gt;

&lt;p&gt;The model's edit never touches my real working tree. I apply it in a throwaway git worktree so a bad suggestion is &lt;code&gt;rm -rf&lt;/code&gt; away from disappearing:&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 — isolate an AI-suggested patch for verification&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;PATCH_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;SCRATCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&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="s2"&gt;/suggestion-check"&lt;/span&gt;

git worktree add &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SCRATCH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; HEAD
git &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SCRATCH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; apply &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PATCH_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SCRATCH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;   &lt;span class="c"&gt;# hand the path to the next stage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This costs nothing and changes the psychology of the review: the suggestion is a specimen under glass, not a half-merged edit I'm emotionally invested in keeping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step two: a behavioral probe that can't lie about zero tests
&lt;/h2&gt;

&lt;p&gt;The classic self-deception in this kind of automation is a test selector that matches nothing. Green output, zero signal. So the probe counts matched tests first and treats zero as a hard failure:&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;# probe.sh &amp;lt;worktree&amp;gt; &amp;lt;test-selector&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-uo&lt;/span&gt; pipefail
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;MATCHED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;pytest &lt;span class="nt"&gt;--collect-only&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'::'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MATCHED&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"REJECT: selector matched no tests — the suite has nothing to say about this change."&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;2
&lt;span class="k"&gt;fi

&lt;/span&gt;pytest &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"REJECT: behavioral probe failed (&lt;/span&gt;&lt;span class="nv"&gt;$MATCHED&lt;/span&gt;&lt;span class="s2"&gt; tests ran)."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"OK: &lt;/span&gt;&lt;span class="nv"&gt;$MATCHED&lt;/span&gt;&lt;span class="s2"&gt; targeted tests passed."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;REJECT&lt;/code&gt; on zero matches is the highest-value line in this entire article. In my own usage, that guard has caught more bad merges than the static scanner — usually by revealing that the "passing suite" I trusted never covered the changed module at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step three: static scan, new findings only
&lt;/h2&gt;

&lt;p&gt;A pattern-based scanner (Semgrep with its default registry rules, or your language's equivalent) runs against just the changed files. It will not catch logic bugs, but it reliably catches the "simplified input validation" category of regression. Treat any finding on the diff as a human-review gate, not an auto-reject — false positives exist, but the review takes two minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step four: hostile cross-examination
&lt;/h2&gt;

&lt;p&gt;Here is the part people skip because a second model call costs money on a metered plan. Instead of asking a model "is this change correct?" — which invites a confident re-derivation of the same reasoning — I ask it to attack the change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a skeptical examiner reviewing a proposed patch.

CONTEXT BEFORE THE CHANGE:
{original}

PATCH:
{diff}

AUTHOR'S STATED REASONING:
{rationale}

Rules:
- Do not summarize or praise the patch.
- Name up to three concrete inputs or system states whose behavior this
  patch changes without the reasoning mentioning it.
- Classify each as SAFE, UNSAFE, or UNDETERMINABLE from the shown context.
- If the patch touches parsing, authentication, concurrency, or error
  handling, state the one invariant a human must verify by hand.
- If there is genuinely nothing, output exactly: NO DIVERGENCE FOUND.
  Fabricating concerns is a failure.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any OpenAI-compatible client can send this. The gold is in the &lt;code&gt;UNDETERMINABLE&lt;/code&gt; bucket: it is a precise, generated checklist of what you personally still owe the review. A response of "looks fine" carries almost no information; a list of three unverifiable claims carries a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the second opinion free
&lt;/h2&gt;

&lt;p&gt;The cross-examination stage used to be where cost crept in — one extra model call per suggestion, multiplied across every PR. Two ways to bring the marginal cost to zero:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hosted free tier.&lt;/strong&gt; MonkeyCode currently provides free model access together with a free server option, which means the Stage 4 call can hit a hosted endpoint instead of a billed API key, so the adversarial pass can run on &lt;em&gt;every&lt;/em&gt; suggestion rather than only the intimidating ones. Disclosure: This article was prepared as part of MonkeyCode's product outreach. Read "free" as a statement about current availability, not a permanent contract — free tiers change their quotas, latency, and model lineups, so confirm the present terms before wiring this into anything your team depends on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your own hardware.&lt;/strong&gt; An OpenAI-compatible local server (Ollama, llama.cpp) drops into the same client by changing one base URL. A mid-size quantized model is weaker than a frontier model, but the cross-examination prompt above is a structured checklist task, and mid-size models handle those better than their benchmark rankings suggest.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pipeline is deliberately indifferent to which backend answers. The prompt, the evidence categories, and the decision rules stay identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outcome combination&lt;/th&gt;
&lt;th&gt;Interpretation&lt;/th&gt;
&lt;th&gt;My move&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Probe passes, scan clean, examiner reports NO DIVERGENCE&lt;/td&gt;
&lt;td&gt;Safe for the shown context&lt;/td&gt;
&lt;td&gt;Apply after my own skim of the diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Probe passes, examiner returns UNDETERMINABLE items&lt;/td&gt;
&lt;td&gt;Model perceives risk it cannot resolve&lt;/td&gt;
&lt;td&gt;Hand-check exactly those invariants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Probe rejects: zero tests matched&lt;/td&gt;
&lt;td&gt;No behavioral evidence exists at all&lt;/td&gt;
&lt;td&gt;Write a characterization test before anything merges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scan flags the diff&lt;/td&gt;
&lt;td&gt;Possible security-relevant regression&lt;/td&gt;
&lt;td&gt;Blocked until a human clears it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Examiner contradicts the author's rationale&lt;/td&gt;
&lt;td&gt;The reasoning itself is unstable&lt;/td&gt;
&lt;td&gt;Reject — unstable reasoning is a worse sign than a wrong answer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where this breaks down
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Independence is required.&lt;/strong&gt; Cross-examining with the same model that authored the suggestion preserves its blind spots. Use a different model, ideally a different provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scanners have a known ceiling.&lt;/strong&gt; They match patterns, not novel exploitable logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free offerings move.&lt;/strong&gt; Quotas, availability, and latency on any free tier can shift without warning; keep the local fallback exercised so it works the day you need it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope matters.&lt;/strong&gt; This pipeline assumes a review-sized diff. A 40-file agent-generated refactor needs characterization tests and staged rollout, not a checklist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who should skip this:&lt;/strong&gt; teams with enforced coverage gates and mature mutation testing already own most of this value. And if your code cannot leave your perimeter for compliance reasons, the hosted free tier is simply not an option — run the examiner locally or not at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thought
&lt;/h2&gt;

&lt;p&gt;The point is not suspicion; it is making trust something each suggestion earns individually rather than something the tool enjoys by default. A quarantined worktree, a probe that fails loudly on zero tests, a pattern scan, and one hostile second opinion cover most of the risk — and with free model access plus a free server, the second opinion costs nothing but thirty seconds. If you adapt this pipeline, the thing I'd be curious to hear is which stage fires most often for you — my money stays on the zero-tests guard.&lt;/p&gt;

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