<?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: Blake Yang</title>
    <description>The latest articles on DEV Community by Blake Yang (@datars_7274).</description>
    <link>https://dev.to/datars_7274</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%2F4061230%2F081cb59c-26d8-46fd-a592-ce04b6639b4b.png</url>
      <title>DEV Community: Blake Yang</title>
      <link>https://dev.to/datars_7274</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/datars_7274"/>
    <language>en</language>
    <item>
      <title>Stop Vibes-Testing AI Coding Models: A Repeatable Evaluation Suite You Can Run for Free</title>
      <dc:creator>Blake Yang</dc:creator>
      <pubDate>Wed, 05 Aug 2026 06:55:44 +0000</pubDate>
      <link>https://dev.to/datars_7274/stop-vibes-testing-ai-coding-models-a-repeatable-evaluation-suite-you-can-run-for-free-3b3n</link>
      <guid>https://dev.to/datars_7274/stop-vibes-testing-ai-coding-models-a-repeatable-evaluation-suite-you-can-run-for-free-3b3n</guid>
      <description>&lt;p&gt;Most developers evaluate a new AI coding model the same way: open a chat, type "write a REST API", nod at the output, and either subscribe or move on. I have done this too, and it is a terrible method. The output always &lt;em&gt;looks&lt;/em&gt; competent on the first prompt, and the model's real weaknesses only show up on the fifth refactor, the ambiguous requirement, or the codebase question it answers with confident fiction.&lt;/p&gt;

&lt;p&gt;This article is a small, repeatable alternative: a fixed suite of eight prompts, a scoring rubric, and a harness that records everything so you can compare models (or the same model a month later) on evidence instead of vibes. You can run the whole thing on free tiers — I will note one option below — so cost is not an excuse to skip it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one-shot prompts mislead you
&lt;/h2&gt;

&lt;p&gt;A single prompt conflates three different capabilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fluency&lt;/strong&gt; — producing syntactically plausible code. Nearly every current model passes this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specification fidelity&lt;/strong&gt; — doing what you actually asked, including the boring constraints ("no external dependencies", "must handle empty input").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honesty under uncertainty&lt;/strong&gt; — saying "I don't know this API" instead of inventing one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fluency is what a demo measures. The other two are what determine whether the model saves you time or creates debugging debt. Your evaluation suite should probe all three separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  The suite: eight prompts, three categories
&lt;/h2&gt;

&lt;p&gt;Store these as files so the suite is versioned and re-runnable. Adjust the domain to your actual work — a frontend developer should swap the systems prompts for component tasks — but keep the &lt;em&gt;categories&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;evals/
  spec_fidelity/
    01_constrained_api.md      # implement X with explicit constraints
    02_refactor_with_tests.md  # change behavior, keep tests green
    03_boring_edge_cases.md    # empty input, unicode, large input
  honesty/
    04_obscure_library.md      # asks about a niche/deprecated API
    05_ambiguous_requirement.md# under-specified task; does it ask or guess?
  workflow/
    06_debug_this.md           # broken code + failing test output
    07_explain_diff.md         # explain a non-obvious diff
    08_multi_step_plan.md      # plan a migration, then execute step 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example prompt, &lt;code&gt;01_constrained_api.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Write a Python function &lt;span class="sb"&gt;`retry_with_backoff(fn, retries, base_delay)`&lt;/span&gt;.
Constraints:
&lt;span class="p"&gt;-&lt;/span&gt; Standard library only.
&lt;span class="p"&gt;-&lt;/span&gt; Exponential backoff with full jitter.
&lt;span class="p"&gt;-&lt;/span&gt; Raise the last exception after retries are exhausted.
&lt;span class="p"&gt;-&lt;/span&gt; Include type hints and one usage example.
Do not explain the code; output code only.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The constraints are the point. A model that adds &lt;code&gt;tenacity&lt;/code&gt; as a dependency or skips jitter has failed specification fidelity even if the code runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The harness
&lt;/h2&gt;

&lt;p&gt;The harness is deliberately boring: run each prompt, save the raw response, and fill in a scorecard. Automation can check mechanical constraints (did it import a banned package? does the code parse?); judgment calls (did it ask a clarifying question?) stay manual. Here is a minimal Python sketch — label it as a starting point, adapt it to whatever API you are testing:&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;# eval_runner.py — adapt endpoint/auth to your provider
&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;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="n"&gt;SUITE&lt;/span&gt; &lt;span class="o"&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;evals&lt;/span&gt;&lt;span class="sh"&gt;"&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="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;results&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="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%Y-%m-%d_%H%M&lt;/span&gt;&lt;span class="sh"&gt;"&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="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parents&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="n"&gt;exist_ok&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;def&lt;/span&gt; &lt;span class="nf"&gt;run_prompt&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="nb"&gt;str&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Send `text` to the model under test, return raw response.
    Replace the body with your provider&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s SDK or HTTP call.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nb"&gt;NotImplementedError&lt;/span&gt;  &lt;span class="c1"&gt;# wire up your model endpoint here
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mechanical_checks&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;Path&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="nb"&gt;str&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;checks&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;response_nonempty&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;bool&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="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;constrained_api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&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="n"&gt;checks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no_external_import&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;import tenacity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;
        &lt;span class="n"&gt;checks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mentions_jitter&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jitter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;random&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;checks&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spec_fidelity&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;honesty&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;workflow&lt;/span&gt;&lt;span class="sh"&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_file&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="n"&gt;SUITE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;category&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_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="k"&gt;try&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="nf"&gt;run_prompt&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="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;NotImplementedError&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="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wire up run_prompt() to your model endpoint first.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;record&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;prompt&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;prompt_file&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;checks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;mechanical_checks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_file&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="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RESULTS&lt;/span&gt; &lt;span class="o"&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;category&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;prompt_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stem&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="n"&gt;out&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;record&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="s"&gt;saved &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then score each response 0–2 on the rubric:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Wrong, fabricated, or ignores constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Partially correct; usable after real editing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Correct and constraint-faithful; minor polish at most&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total per model: 0–16. That number is not a benchmark of the model in general — it is a measurement of &lt;em&gt;this model on work that looks like yours&lt;/em&gt;, which is the only measurement that should drive your tooling decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to actually look for in each category
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Honesty prompts (04, 05)&lt;/strong&gt; are the most revealing. For &lt;code&gt;04_obscure_library.md&lt;/code&gt;, ask about a real but niche API you know well, or an older version of a popular one. A model that hallucinates function signatures here will hallucinate them in your real work, and those bugs are expensive because they compile in your head while you read them. For &lt;code&gt;05_ambiguous_requirement.md&lt;/code&gt;, the &lt;em&gt;best&lt;/em&gt; response asks one or two sharp clarifying questions before coding; a model that confidently guesses is a liability on under-specified tickets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflow prompts (06–08)&lt;/strong&gt; test whether the model can operate on &lt;em&gt;your&lt;/em&gt; artifacts — a failing test log, a diff, a partial migration — rather than generating greenfield code, which is where most real usage happens after week one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running it for free
&lt;/h2&gt;

&lt;p&gt;Evaluation should not require a paid subscription to the thing you are evaluating — that is backwards. Free tiers and trial credits from the major providers work, and there are also coding platforms that bundle free model access.&lt;/p&gt;

&lt;p&gt;One option I used for a run of this suite: MonkeyCode offers free model access and a free server option, which was enough to execute the eight-prompt suite end to end without touching a credit card.&lt;/p&gt;

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

&lt;p&gt;The harness above is provider-agnostic on purpose — point &lt;code&gt;run_prompt()&lt;/code&gt; at whatever endpoint you have, including a local model if you have the hardware for one. If you want to try the suite on MonkeyCode's free tier, the setup takes a few minutes and the results directory slots straight into the comparison step below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing runs without fooling yourself
&lt;/h2&gt;

&lt;p&gt;When you have two or more &lt;code&gt;results/&lt;/code&gt; folders (different models, or the same model across months):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compare per prompt, not just totals.&lt;/strong&gt; A model that wins 14–12 but loses the two honesty prompts is the riskier daily driver.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the diffs on prompts where scores differ.&lt;/strong&gt; The raw responses tell you &lt;em&gt;why&lt;/em&gt;; totals never do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-run before concluding.&lt;/strong&gt; A single run conflates model behavior with sampling luck. Two or three runs per prompt, with the rubric applied blindly if you can manage it, is meaningfully better.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A recent DEV discussion on why &lt;a href="https://dev.to/hexisteme/sub-agent-metrics-are-not-comparable-to-main-thread-metrics-5585"&gt;sub-agent metrics are not comparable to main-thread metrics&lt;/a&gt; makes a related point worth internalizing: numbers only mean something within the context that produced them. Your 0–16 score is valid inside your suite, your rubric, and your domain — do not treat it as a leaderboard entry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations and who should skip this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eight prompts is a smoke test, not a benchmark.&lt;/strong&gt; It will reliably separate "clearly bad fit" from "worth a two-week trial", but it will not rank two good models against each other with confidence. For that, you need real tasks from your issue tracker and a longer evaluation window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The rubric is subjective at the boundaries.&lt;/strong&gt; The 1-vs-2 call varies between reviewers. If a team runs this, calibrate on two or three example responses together first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free tiers have constraints.&lt;/strong&gt; Rate limits, queueing, or model availability can affect your runs, and a free tier may not expose the exact model you would pay for. Check what you are actually being served, and do not extrapolate latency measurements from a free server to production expectations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If your work is highly specialized&lt;/strong&gt; (embedded C, formal verification, regulated-industry code), a generic suite tells you little. Build the eight prompts from your own domain or skip the exercise and run a supervised trial on real tickets instead.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The model that demos best is rarely the model that fails best. A fixed, versioned prompt suite — even a small one — converts "I tried it and it seemed fine" into a comparable artifact you can rerun whenever a new model, a new pricing tier, or a quiet capability change lands. The suite in this article is a starting skeleton: steal the structure, replace the prompts with your own work, and keep the honesty category no matter what.&lt;/p&gt;

&lt;p&gt;If you end up publishing your own version of the suite, I would be curious which category surprised you most.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>testing</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
