<?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: Robert Gilbert </title>
    <description>The latest articles on DEV Community by Robert Gilbert  (@robertgilbert75).</description>
    <link>https://dev.to/robertgilbert75</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%2F4177446%2F376af1a1-e073-4264-b53c-5ac755b3894b.png</url>
      <title>DEV Community: Robert Gilbert </title>
      <link>https://dev.to/robertgilbert75</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robertgilbert75"/>
    <language>en</language>
    <item>
      <title>Trailhead: an Open-Weight Hiking Companion That Gets You Off the Screen</title>
      <dc:creator>Robert Gilbert </dc:creator>
      <pubDate>Mon, 12 Oct 2026 03:35:38 +0000</pubDate>
      <link>https://dev.to/robertgilbert75/trailhead-an-open-weight-hiking-companion-that-gets-you-off-the-screen-19jk</link>
      <guid>https://dev.to/robertgilbert75/trailhead-an-open-weight-hiking-companion-that-gets-you-off-the-screen-19jk</guid>
      <description>&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge: Week 1 — Touch Grass.*&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #devchallenge #hf26challenge&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Trailhead&lt;/strong&gt; — a single-file web app that turns a trail name, distance, season, and group into a hiking brief: gear checklist, safety brief, Leave No Trace reminders, and a go/no-go verdict. The screen time is under two minutes. Everything after that happens outside.&lt;/p&gt;

&lt;p&gt;The whole thing is one HTML file. No build step, no server, no framework. Open it on your phone in the trailhead parking lot and it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The demo
&lt;/h2&gt;

&lt;p&gt;You fill in five fields — trail, distance, season, who's going, anything else — and hit "Plan my hike." Thirty seconds later you get a practical brief. Example: Bear Mountain Loop, 3–7 miles, fall, 2 adults + 1 kid → layered clothing call, headlamp reminder (shorter days), kid-specific snack and turnaround-time math, and the one risk that matters most for that trip.&lt;/p&gt;

&lt;p&gt;The prompt engineering is the product: the model is instructed to be specific, not generic — no "bring water" fluff without quantities, no safety boilerplate without the actual risks of &lt;em&gt;this&lt;/em&gt; hike.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open-weight is the point
&lt;/h2&gt;

&lt;p&gt;Trailhead calls &lt;strong&gt;Llama 3.3 70B&lt;/strong&gt; — Meta's open-weight model — through Groq's free tier. That choice is load-bearing, not decorative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; A hiker checking trail conditions shouldn't need a subscription. Free-tier inference on an open model means the app is free forever, for everyone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No vendor lock-in.&lt;/strong&gt; The model is one string in the code. Swap in Mixtral, Qwen, or DeepSeek by changing a single line. If Groq changes terms, point it at any OpenAI-compatible endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditable advice.&lt;/strong&gt; When a model tells someone whether a hike is safe, you want to know what model said it and be able to swap it. Open weights mean the safety advice isn't a black box owned by one company.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It runs from anywhere.&lt;/strong&gt; One static file. No backend to deploy, no API keys baked in (yours stays in your browser). A closed model behind a paywalled API couldn't do this at $0.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Closed AI would make this a $9.99/month app with an account wall. Open weights make it a file you can text to a friend.&lt;/p&gt;

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

&lt;p&gt;Offline mode with a small local model (Llama 3.2 1B via WebGPU) for trails with no signal — the parking lot has bars, the summit doesn't. And a "trip report" loop: hikers confirm or correct the brief afterward, building a dataset of real-world accuracy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The app is a single &lt;code&gt;trailhead.html&lt;/code&gt; — open it, paste a free Groq key from console.groq.com, plan a hike, then touch grass. 🌲&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Built a Benchmark That Grades AI Code Reviewers on Planted Defects</title>
      <dc:creator>Robert Gilbert </dc:creator>
      <pubDate>Mon, 12 Oct 2026 00:27:32 +0000</pubDate>
      <link>https://dev.to/robertgilbert75/i-built-a-benchmark-that-grades-ai-code-reviewers-on-planted-defects-55na</link>
      <guid>https://dev.to/robertgilbert75/i-built-a-benchmark-that-grades-ai-code-reviewers-on-planted-defects-55na</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;.*&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;I spent the last month running fourteen independent audit rounds on a clean-room&lt;br&gt;
codebase. Outside reviewers — human and AI — kept catching defects that survived&lt;br&gt;
my own builder, my own test suite, and my own verifier. The experience left me&lt;br&gt;
with a question I couldn't shake: &lt;strong&gt;can an AI model do what those auditors did?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not fix the bug. &lt;em&gt;Find&lt;/em&gt; it. Name the lines. Say what's wrong and why.&lt;/p&gt;

&lt;p&gt;Existing benchmarks don't isolate this. SWE-bench measures repair — a model can&lt;br&gt;
stumble into a passing patch without ever identifying the defect. Devign does&lt;br&gt;
binary "vulnerable / not vulnerable" classification — no localization, no&lt;br&gt;
explanation, no severity. A model that says "vulnerable" for the wrong reason&lt;br&gt;
scores the same as one that found the actual flaw. I haven't found a benchmark&lt;br&gt;
that combines all three of: planted defects with controlled difficulty tiers,&lt;br&gt;
mandatory line localization and explanation, and false-positive measurement on&lt;br&gt;
paired clean variants.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Red-Pen Bench&lt;/strong&gt;. &lt;a href="https://www.kaggle.com/benchmarks/robertgilbertusa/red-pen-bench" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/robertgilbertusa/red-pen-bench&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it tests
&lt;/h2&gt;

&lt;p&gt;44 planted defects drawn from the mutation-testing operator taxonomy. The&lt;br&gt;
approach follows the selective-mutation tradition: Offutt, Lee, Rothermel,&lt;br&gt;
Untch, and Zapf ("An Experimental Determination of Sufficient Mutant&lt;br&gt;
Operators," ACM TOSEM 5(2):99–118, 1996) showed that five operators (ABS, UOI,&lt;br&gt;
LCR, AOR, ROR) capture 99.5% of the &lt;em&gt;mutation score of the full operator set&lt;/em&gt;.&lt;br&gt;
That 99.5% figure belongs to the complete five-operator set — this corpus uses&lt;br&gt;
four of the five (AOR, ROR, UOI, LCR; no ABS) plus statement-deletion defects&lt;br&gt;
and higher-order mutants (two interacting faults) for the hard tier, which that&lt;br&gt;
study doesn't cover. The operator family is the method; the exact coverage&lt;br&gt;
number is theirs, not mine.&lt;/p&gt;

&lt;p&gt;Every defect ships in &lt;strong&gt;four variants&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Original&lt;/strong&gt; — the defect in its natural setting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disguised&lt;/strong&gt; — the &lt;em&gt;same mechanism&lt;/em&gt; transplanted to a different domain,
different names (reduces the chance that a model can rely on surface
familiarity or template recognition)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed&lt;/strong&gt; — the repaired code (false-positive check)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean&lt;/strong&gt; — correct code written from scratch, independent of the defective
version (control)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three difficulty tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Easy&lt;/strong&gt; (18 items): single-operator defects — off-by-one loops, wrong
arithmetic operators, inverted guards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium&lt;/strong&gt; (18 items): wrong logical connectors, missing edge-case checks,
ceiling-vs-floor errors, the mutable-default-argument trap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard&lt;/strong&gt; (8 items): higher-order mutants — an auth check that's &lt;em&gt;both&lt;/em&gt;
inverted &lt;em&gt;and&lt;/em&gt; miswired, a withdrawal that's &lt;em&gt;both&lt;/em&gt; overdraft-permissive
&lt;em&gt;and&lt;/em&gt; audit-evasive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every item passed a &lt;strong&gt;killability gate&lt;/strong&gt; before entering the corpus: an automated&lt;br&gt;
test that fails on the defect variants and passes on the fixed/clean ones.&lt;br&gt;
And the corpus survived its own red pen — my first build had 44 defects that&lt;br&gt;
an independent verifier proved were really 10 templates with renamed variables.&lt;br&gt;
I threw it out, regenerated 44 genuinely distinct defects, and the verifier&lt;br&gt;
signed off on the second build: 44/44 structurally distinct, 44/44 killability,&lt;br&gt;
176-snippet integrity. The benchmark grades reviewers; it had to survive review&lt;br&gt;
itself.&lt;/p&gt;

&lt;p&gt;One defect, three of its four variants (easy tier, off-by-one):&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;# Original — the defect
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sum_prices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;total&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;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&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;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="c1"&gt;# skips the last element
&lt;/span&gt;        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&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;total&lt;/span&gt;

&lt;span class="c1"&gt;# Disguised — same mechanism, different domain and names
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tally_receipts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;aggregate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&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;entries&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;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&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;aggregate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aggregate&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&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;aggregate&lt;/span&gt;

&lt;span class="c1"&gt;# Fixed — the repair (false-positive check)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sum_prices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;total&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;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&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;items&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&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;total&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A model must output &lt;code&gt;DEFECT: yes&lt;/code&gt;, &lt;code&gt;LINES: 3&lt;/code&gt;, and an explanation naming the&lt;br&gt;
off-by-one that skips the last element.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scoring (no LLM judge)
&lt;/h2&gt;

&lt;p&gt;Models must output three things: &lt;strong&gt;DEFECT: yes/no&lt;/strong&gt;, &lt;strong&gt;LINES: &lt;/strong&gt;,&lt;br&gt;
&lt;strong&gt;EXPLANATION: &lt;/strong&gt;. Scored automatically, with no model&lt;br&gt;
grading a model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Detection rate&lt;/strong&gt; — fraction of the 2n defective variants (original +
disguised) where the verdict matched ground truth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line-level F1&lt;/strong&gt; — mean over all 4n variants of line-level F1 against the
planted fault lines (on fixed/clean variants: 1 if the model named no lines,
0 otherwise)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyword recall&lt;/strong&gt; — mean over the 2n defective variants of planted-keyword
hits in the explanation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;False-positive rate&lt;/strong&gt; — fraction of the 2n non-defective control variants
(fixed + independently clean) flagged DEFECT: yes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tier score = (detection + line-F1 + keyword-recall) / 3 − false-positive rate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The denominators scale exactly to the variant counts. Easy and medium tiers&lt;br&gt;
(n=18) average the four terms over 36, 72, 36, and 36 measurements&lt;br&gt;
respectively; the hard tier (n=8) averages over 16, 32, 16, and 16. The&lt;br&gt;
"Average" column is the &lt;strong&gt;unweighted&lt;/strong&gt; mean of&lt;br&gt;
the three tier scores, recomputed from the displayed tier values — each tier&lt;br&gt;
weighted equally despite the different item counts. (Kaggle displays&lt;br&gt;
two-decimal roundings of the same underlying values — 0.80, 0.64, 0.53, 0.12 —&lt;br&gt;
consistent with half-even rounding, which turns 0.125 into 0.12.)&lt;/p&gt;

&lt;p&gt;For calibration, two trivial baselines scored by the same code: &lt;strong&gt;always-no&lt;/strong&gt;&lt;br&gt;
(DEFECT: no on everything — 16.7% on every tier; the arithmetic is detection&lt;br&gt;
0, defect-line F1 0, clean-line F1 1, keyword recall 0, false-positive rate 0,&lt;br&gt;
so (0 + 0.5 + 0)/3 − 0 = 16.7%) and&lt;br&gt;
&lt;strong&gt;always-yes&lt;/strong&gt; (DEFECT: yes with no lines named and a keyword-free explanation&lt;br&gt;
— −50.0% on every tier; a flag-everything model that names lines would score&lt;br&gt;
differently). Note what the baselines expose about the metric itself: the&lt;br&gt;
composite's zero point is arbitrary. A model that attempts detection and errs&lt;br&gt;
can score below one that abstains — the meaningful threshold is the always-no&lt;br&gt;
baseline (16.7%), not zero. &lt;strong&gt;Anything below 16.7% is losing to doing nothing at&lt;br&gt;
all.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The models
&lt;/h2&gt;

&lt;p&gt;Four models, four labs, all run live on Kaggle Benchmarks on October 10, 2026,&lt;br&gt;
against the v1 benchmark (private at the time of the runs; public since&lt;br&gt;
October 11, 2026):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.7 Flash&lt;/strong&gt; (Google)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Haiku 5.5&lt;/strong&gt; (Anthropic)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.4 mini&lt;/strong&gt; (OpenAI)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek-R1&lt;/strong&gt; (DeepSeek)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model names above are the exact identifiers Kaggle displays — confirmed&lt;br&gt;
against the live leaderboard. All four ran the same three tasks (v1, locked)&lt;br&gt;
against the same dataset version. The benchmark page records "last updated&lt;br&gt;
October 10, 2026" and "evaluated on October 10, 2026"; its citation reads:&lt;br&gt;
Robert Gilbert USA, Red-Pen Bench,&lt;br&gt;
&lt;a href="https://www.kaggle.com/benchmarks/robertgilbertusa/red-pen-bench/versions/1" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/robertgilbertusa/red-pen-bench/versions/1&lt;/a&gt;,&lt;br&gt;
2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I found
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Executive summary:&lt;/strong&gt; Gemini 3.7 Flash led overall, Claude Haiku 5.5 was the&lt;br&gt;
most consistent across tiers, GPT-5.4 mini showed the largest observed&lt;br&gt;
hard-versus-easy gap (76.0% on hard against ~41% on easy and medium), and&lt;br&gt;
DeepSeek-R1 finished below the always-no baseline on average — all from a&lt;br&gt;
single run per model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway:&lt;/strong&gt; a reviewer that flags everything scores &lt;em&gt;below&lt;/em&gt; one that says&lt;br&gt;
nothing. If you're grading AI code review, measure false positives first — or&lt;br&gt;
your leaderboard is an enthusiasm contest.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Easy (18)&lt;/th&gt;
&lt;th&gt;Medium (18)&lt;/th&gt;
&lt;th&gt;Hard (8)&lt;/th&gt;
&lt;th&gt;Average&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.7 Flash&lt;/td&gt;
&lt;td&gt;70.4%&lt;/td&gt;
&lt;td&gt;88.7%&lt;/td&gt;
&lt;td&gt;80.6%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.799&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku 5.5&lt;/td&gt;
&lt;td&gt;71.3%&lt;/td&gt;
&lt;td&gt;60.7%&lt;/td&gt;
&lt;td&gt;61.4%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.645&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;41.6%&lt;/td&gt;
&lt;td&gt;41.3%&lt;/td&gt;
&lt;td&gt;76.0%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.530&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek-R1&lt;/td&gt;
&lt;td&gt;34.5%&lt;/td&gt;
&lt;td&gt;9.7%&lt;/td&gt;
&lt;td&gt;-6.7%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.125&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Always-no (baseline)&lt;/td&gt;
&lt;td&gt;16.7%&lt;/td&gt;
&lt;td&gt;16.7%&lt;/td&gt;
&lt;td&gt;16.7%&lt;/td&gt;
&lt;td&gt;0.167&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Always-yes (baseline)&lt;/td&gt;
&lt;td&gt;-50.0%&lt;/td&gt;
&lt;td&gt;-50.0%&lt;/td&gt;
&lt;td&gt;-50.0%&lt;/td&gt;
&lt;td&gt;-0.500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A cautious reading of the table: on the hard tier, the detection and false-positive&lt;br&gt;
&lt;em&gt;rates&lt;/em&gt; move in 1/16 ≈ 6.3-point steps — but each counts only one-third in the&lt;br&gt;
composite, so a single detection flip moves the tier &lt;em&gt;score&lt;/em&gt; about 2 points,&lt;br&gt;
and the line-F1 and keyword-recall terms are effectively continuous. Treat&lt;br&gt;
small hard-tier gaps as noise until replicated. And with one run per model,&lt;br&gt;
nothing below is a definitive ranking — it's one observation per cell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding 1: two of four models scored higher on hard than on easy.&lt;/strong&gt;&lt;br&gt;
Gemini scored 80.6% on hard vs 70.4% on easy. GPT-5.4 mini scored 76.0% on hard&lt;br&gt;
vs 41.6% on easy. I designed the tiers assuming difficulty increases&lt;br&gt;
monotonically. It doesn't — not for these models. I call these difficulty&lt;br&gt;
tiers by construction; the results show they are not difficulty-calibrated&lt;br&gt;
across models. Two confounds I can't&lt;br&gt;
separate from the leaderboard data: the false-positive term is computed on&lt;br&gt;
tier-specific clean variants, and tier correlates with domain — measured in the&lt;br&gt;
corpus, hard items cluster in business-logic domains (banking, security,&lt;br&gt;
retail, analytics, ETL, scheduling) while easy items are mostly small&lt;br&gt;
pedagogical domains (school, math, geometry). So "harder" and&lt;br&gt;
"different-looking" are entangled here. My &lt;em&gt;hypothesis&lt;/em&gt;, not a measured&lt;br&gt;
mechanism: the easy defects look like correct code at a glance, while the hard&lt;br&gt;
defects — two things wrong in one function — look conspicuous enough to trigger&lt;br&gt;
closer reading. That's an interpretation to investigate, not a proven cause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding 2: GPT-5.4 mini has a split personality.&lt;/strong&gt; 41% on easy and medium,&lt;br&gt;
76% on hard — a 34.7-point spread, the second-widest in the table. It reasons&lt;br&gt;
through tangled multi-fault logic far better than it handles the easy tier's&lt;br&gt;
single-operator defects. Whether that's a capability gap or a carefulness gap,&lt;br&gt;
this benchmark can't say — it doesn't measure internal attention, and the&lt;br&gt;
leaderboard doesn't give a per-operator breakdown. That pattern could be especially relevant to production review,&lt;br&gt;
where subtle defects in ordinary code are easy to overlook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding 3: Claude Haiku 5.5 has the narrowest spread.&lt;/strong&gt; 71.3% / 60.7% /&lt;br&gt;
61.4% — a 10.6-point spread, the smallest in the table, with no tier collapsing&lt;br&gt;
and none spiking. That's a descriptive fact about this run, not evidence of&lt;br&gt;
production reliability: the smallest observed spread across three tiers in a&lt;br&gt;
single run is a preliminary signal, not an operational recommendation. And&lt;br&gt;
note the tension in the table — Gemini's &lt;em&gt;worst&lt;/em&gt; tier (70.4%) is about Haiku's&lt;br&gt;
&lt;em&gt;best&lt;/em&gt; (71.3%), and Gemini leads the average by 16 points. "Steadiest" and&lt;br&gt;
"best" are different claims; this run supports only the first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding 4: DeepSeek-R1 finished below the always-no baseline.&lt;/strong&gt; 0.125&lt;br&gt;
average, 9.7% on medium, −6.7% on hard — all below the 16.7% that doing nothing&lt;br&gt;
achieves. A negative tier score means exactly one thing under this formula: the&lt;br&gt;
false-positive rate exceeded the mean of detection, line-F1, and keyword-recall.&lt;br&gt;
Two confounds before drawing conclusions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Output format.&lt;/strong&gt; Without per-model parse-failure counts and raw outputs, I
can't determine how much output-format noncompliance affected the result. The
parser takes the &lt;em&gt;first&lt;/em&gt; "DEFECT: yes/no" match in the response, so a
reasoning trace that mentions "DEFECT: yes" before its final verdict could
override the intended answer. Depending on the variant and the model's final
answer, this could affect both detection and false-positive measurements — I
can't establish the size or direction of that effect from the leaderboard
alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model age.&lt;/strong&gt; R1 is a January 2025 model measured against 2026 releases, so
model age is conflated with model type.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The observed result is real; its causes are not yet established.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A personal postscript.&lt;/strong&gt; None of the above is the whole story. The table says&lt;br&gt;
DeepSeek-R1 is the worst reviewer I measured; my own experience says DeepSeek&lt;br&gt;
is the sharpest auditor I've worked with — with one clarification that matters:&lt;br&gt;
the audits below were done in the DeepSeek app, file by file, with DeepThink&lt;br&gt;
and Search enabled (model version not recorded) — a different setup from the&lt;br&gt;
benchmark's single-snippet Kaggle runs. On the MINI-CRAY build — a clean-room&lt;br&gt;
vector-machine emulator that went through fourteen independent audit rounds —&lt;br&gt;
DeepSeek did four consecutive rounds (9 through 12) and found defects that the&lt;br&gt;
eight earlier rounds had missed: a chain scoreboard that was never&lt;br&gt;
evicted, silently inflating chain-miss statistics; a 2-D array shape check that&lt;br&gt;
passed validation and then died inside NumPy with an opaque broadcast error; a&lt;br&gt;
hazard check that could forget a reader still in flight; and a cluster of numpy&lt;br&gt;
type-aliasing holes across six functions that got unified into a single rule.&lt;br&gt;
Those are real bugs in shipped releases, each with a regression test now. Two&lt;br&gt;
honest caveats: those were whole-codebase audits, file by file — a different&lt;br&gt;
task from the single-snippet review the benchmark scores — and this is a&lt;br&gt;
hits-only recollection. The record isn't one-sided either: a CRAY-1&lt;br&gt;
floating-point format module it drafted failed four of six behavioral checks&lt;br&gt;
against the hardware manual. This&lt;br&gt;
is anecdote, not measurement — one builder's experience, not a controlled&lt;br&gt;
comparison. But it's why I don't read the 0.125 as the last word on DeepSeek.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'd measure next:&lt;/strong&gt; repeat runs (this is one run per model — no variance&lt;br&gt;
estimate yet), per-component and per-operator breakdowns, parse-failure counts&lt;br&gt;
per model, cross-language disguised variants (Python→Rust), repo-level audits&lt;br&gt;
with full codebase context, spec-dependent&lt;br&gt;
defects (the ~35% of real bugs that need requirements knowledge), and a human&lt;br&gt;
baseline — even 10 items reviewed by a competent engineer would calibrate what&lt;br&gt;
"good" means.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;One run per model, so every number above is a point estimate with no measured&lt;br&gt;
variance, and no definitive ranking is supportable. The hard tier is 8 items —&lt;br&gt;
component rates move in ~6-point steps (about 2 points on the composite per&lt;br&gt;
detection flip) and confidence intervals are wide. Keyword recall is a lexical&lt;br&gt;
proxy for explanation quality, not a judgment of it. Line-F1 rewards naming no&lt;br&gt;
lines on clean code, which is correct behavior but a different skill from&lt;br&gt;
localizing a real fault. The "Average" column weights all three tiers equally.&lt;br&gt;
Kaggle-side prompt templates, sampling parameters, and reasoning-mode settings&lt;br&gt;
were set by the harness — I neither controlled nor recorded them. No human&lt;br&gt;
baseline exists yet. The benchmark was private when these runs completed and&lt;br&gt;
has been public since October 11, 2026.&lt;/p&gt;

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

&lt;p&gt;Code review is where AI assistance is being deployed fastest and evaluated&lt;br&gt;
least rigorously. If we can't measure whether a model &lt;em&gt;finds&lt;/em&gt; defects — with&lt;br&gt;
location and reason, not just a vibe — we're flying blind on the highest-stakes&lt;br&gt;
use case.&lt;/p&gt;

&lt;p&gt;Red-Pen Bench is designed to survive its own publication: the four-variant&lt;br&gt;
structure means new defects can be planted quarterly from the operator taxonomy,&lt;br&gt;
retired items published with solutions (turning contamination into training&lt;br&gt;
data), and live items staying blind. Static benchmarks decay; this one has a&lt;br&gt;
refresh protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.kaggle.com/benchmarks/robertgilbertusa/red-pen-bench" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/robertgilbertusa/red-pen-bench&lt;/a&gt; — run your own model, or plant a defect and submit it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built for the Kaggle Benchmarking Challenge. 44 defects, 176 code variants,&lt;br&gt;
zero LLM judges, one red pen.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kagglechallenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
