<?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: Sergei Parfenov</title>
    <description>The latest articles on DEV Community by Sergei Parfenov (@p0rt).</description>
    <link>https://dev.to/p0rt</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%2F157612%2F00065fc9-07d7-47dd-b882-f297a6158dbe.jpeg</url>
      <title>DEV Community: Sergei Parfenov</title>
      <link>https://dev.to/p0rt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/p0rt"/>
    <language>en</language>
    <item>
      <title>It caught "partner" "pareja" in an IRS rule and missed "return" "devolución": an offline MT checker for translators</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Thu, 15 Oct 2026 12:25:34 +0000</pubDate>
      <link>https://dev.to/p0rt/it-caught-partner-pareja-in-an-irs-rule-and-missed-return-devolucion-an-offline-mt-7ge</link>
      <guid>https://dev.to/p0rt/it-caught-partner-pareja-in-an-irs-rule-and-missed-return-devolucion-an-offline-mt-7ge</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;The IRS page on the failure-to-file penalty has a rule for small partnerships: "Each partner is either an individual (excluding nonresident aliens), or the estate of a deceased partner." An open machine-translation model turned it into «Cada &lt;strong&gt;pareja&lt;/strong&gt; es una persona (…) o la herencia de una &lt;strong&gt;pareja fallecida&lt;/strong&gt;». A &lt;em&gt;pareja&lt;/em&gt; is a romantic partner; the IRS's own Spanish says &lt;em&gt;socio&lt;/em&gt;. A condition for penalty relief has become a rule about couples.&lt;/p&gt;

&lt;p&gt;SecondRead flags it at 86% risk. On the same page it misses "the return is late" → «la devolución es tardía», &lt;em&gt;the refund is late&lt;/em&gt;. This post covers both.&lt;/p&gt;

&lt;p&gt;Post-editors fix machine translation against a deadline. Broken Spanish jumps out; the costly mistake is the fluent sentence that means something else. QA tools catch numbers, tags and glossary terms, not &lt;em&gt;pareja&lt;/em&gt;, and many NDAs restrict pasting client text into cloud AI.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;SecondRead&lt;/strong&gt;, a second reader that runs on the translator's Mac. It reads an XLIFF or Trados SDLXLIFF file, scores each segment for the risk of a &lt;strong&gt;major meaning error&lt;/strong&gt; (wrong sense, dropped negation, wrong number, omission or addition), flags the risky ones and sorts the job so you re-read the riskiest 10% first.&lt;/p&gt;

&lt;p&gt;Under the hood: Qwen3.5-4B at 4-bit (2.7 GB), a 36 MB LoRA adapter I fine-tuned on Tinker for $1.22, and rule checks for numbers and negation; a 39-segment page takes about 6 s on an M4 Pro, offline. On WMT English→Spanish test it ranks errors as well as Gemma 4 31B (AUROC 0.815 vs 0.807); on ten real public documents Gemma ranks better (0.940 vs 0.910), and my default flag line finds only a fifth of the errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who would pay:&lt;/strong&gt; agencies, then freelancers, who already buy QA tools such as Xbench and Verifika. WMT text is research-only, so the product is this pipeline trained on an agency's own reviewed jobs: a private 36 MB adapter on each reviewer's laptop, per seat, with no per-segment bill. What they would actually pay is still open; that's what I'm testing next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Efi9kMlUkrg" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;89 s: an FDA page on disposing of medicines, machine-translated into Spanish and checked on the Mac: 39 segments, 3 flags, and a network log with only local requests.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No-install demo:&lt;/strong&gt; &lt;a href="https://secondread-e49hx.ondigitalocean.app" rel="noopener noreferrer"&gt;https://secondread-e49hx.ondigitalocean.app&lt;/a&gt;, a static App Platform build with that page's scores precomputed. The top flag is the DEA's "Take Back Day", now «Día Nacional de Retraso de las Drogas Recluidas», a "Day of Delay of Confined Drugs" (80%). It misses the instruction to flush fentanyl patches, which became «lavar», wash (16%).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxf5jvqavcq9jlsqg7fqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxf5jvqavcq9jlsqg7fqa.png" alt="SecondRead on the Mac, FDA page, " width="800" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/P0rt" rel="noopener noreferrer"&gt;
        P0rt
      &lt;/a&gt; / &lt;a href="https://github.com/P0rt/secondread" rel="noopener noreferrer"&gt;
        secondread
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;SecondRead&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An offline checker for translators who post-edit machine translation (MTPE). It reads an
XLIFF job and ranks segments by how likely they are to contain a &lt;strong&gt;major meaning error&lt;/strong&gt;
a dropped or added negation, a wrong number or unit, an omitted clause, a mistranslation
Style, grammar and word order are out of scope; other QA tools handle those.&lt;/p&gt;
&lt;p&gt;The goal is a shorter re-read: the reviewer starts with the riskiest 10% of the job instead of
reading every segment twice.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status (2026-10-15):&lt;/strong&gt; the app serves LoRA v1, trained on Tinker on human labels
only, as a 36 MB GGUF. By default it flags at the &lt;code&gt;review&lt;/code&gt; line: per language pair, the highest
threshold that finds 60% of the dev Majors.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On test, measured once:&lt;/strong&gt; the review line finds 74% of the en-ru Majors (precision 0.39
38% of segments flagged). On en-es it finds 48% [0.42, 0.58], below the…&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/P0rt/secondread" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/P0rt/secondread" rel="noopener noreferrer"&gt;https://github.com/P0rt/secondread&lt;/a&gt; (MIT): everything from data prep to the UI, with the command behind every number below in &lt;code&gt;docs/RESULTS.md&lt;/code&gt; and &lt;code&gt;docs/REALDOCS_GOLD.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I built it with Claude Code, starting with go/no-go checks: does Tinker train this model, does the adapter survive GGUF conversion, does Sentry receive zero text?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flhqkyha1k81l8mcaqb04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flhqkyha1k81l8mcaqb04.png" alt="SecondRead pipeline, offline on the translator's Mac: an XLIFF or SDLXLIFF job file is parsed with lxml, then goes through a number check and a negation check (rules) and gets a LoRA score from llama-server, P(Major) from Qwen3.5-4B with the 36 MB LoRA. The combine step adds rule weights to the model's log-odds, giving a risk per segment that flags the risky ones and puts the riskiest 10% first." width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  One token is the whole answer
&lt;/h3&gt;

&lt;p&gt;The model answers one question per segment. This is the entire user message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EN: {source}
ES: {machine translation}
Major meaning error (wrong meaning, negation, number, omission, addition)? Answer Major or OK.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Major&lt;/code&gt; and &lt;code&gt;OK&lt;/code&gt; are single tokens in Qwen's vocabulary, so one forward pass gives &lt;code&gt;risk = p(Major) / (p(Major) + p(OK))&lt;/code&gt;, with the same prompt in training, Tinker evaluation and the app. The rule checks add highlights (which number changed, where the negation went) and a small train-measured weight on the log-odds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Training on Tinker, on human labels
&lt;/h3&gt;

&lt;p&gt;The labels are Google's &lt;a href="https://github.com/google/wmt-mqm-human-evaluation" rel="noopener noreferrer"&gt;wmt-mqm-human-evaluation&lt;/a&gt; (Apache-2.0): every error in WMT24 English→Spanish (9,330 segments) and WMT22 English→Russian (19,292), marked by human annotators with an MQM category and severity. &lt;code&gt;Major&lt;/code&gt; means at least one major or critical accuracy, terminology or non-translation error. I split by document.&lt;/p&gt;

&lt;p&gt;The run: LoRA rank 16 on the MLP layers only, one epoch over 14,791 human-labelled segments (231 steps of 64), loss only on the answer.&lt;/p&gt;

&lt;p&gt;The cookbook's suggested learning rate, 4.9e-4, flipped the model from always-OK to always-Major within three steps; 20-step probes picked 2e-4. The run took 9 min 24 s and &lt;strong&gt;$1.22&lt;/strong&gt;: $1.07 for 1,452,983 training tokens, $0.15 for dev scoring. Dev AUROC rose from 0.552 to 0.739. Locally, the 4-bit model ranks like Tinker (Spearman 0.989).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flcrwj2wauhqknj3drgfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flcrwj2wauhqknj3drgfa.png" alt="The v1 Tinker run from its log: training label NLL falling from about 0.7 to 0.23, and dev AUROC on 200 en-ru rows rising from 0.552 to 0.739" width="800" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Results on WMT test
&lt;/h3&gt;

&lt;p&gt;Unseen documents (25 en-es, 33 en-ru), scored by the model alone. AUROC is the chance a segment with a major error ranks above a clean one (0.5 is a coin flip); PR-AUC rewards a clean top of the list.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test split&lt;/th&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;AUROC&lt;/th&gt;
&lt;th&gt;PR-AUC&lt;/th&gt;
&lt;th&gt;Share of major errors in the riskiest 10%&lt;/th&gt;
&lt;th&gt;$ per 1k segments&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;en-es&lt;/strong&gt;, 1,815 segments, 9.3% Major&lt;/td&gt;
&lt;td&gt;Qwen3.5-4B, no adapter&lt;/td&gt;
&lt;td&gt;0.776&lt;/td&gt;
&lt;td&gt;0.413&lt;/td&gt;
&lt;td&gt;45.2%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SecondRead v1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.815&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.517&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;51.8%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;0.807&lt;/td&gt;
&lt;td&gt;0.311&lt;/td&gt;
&lt;td&gt;45.8%&lt;/td&gt;
&lt;td&gt;0.024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;en-ru&lt;/strong&gt;, 3,573 segments, 20.2% Major&lt;/td&gt;
&lt;td&gt;Qwen3.5-4B, no adapter&lt;/td&gt;
&lt;td&gt;0.666&lt;/td&gt;
&lt;td&gt;0.369&lt;/td&gt;
&lt;td&gt;22.7%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SecondRead v1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.801&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.537&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30.3%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;0.794&lt;/td&gt;
&lt;td&gt;0.494&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30.7%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.017&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tuning works:&lt;/strong&gt; the adapter alone adds +0.039 AUROC over the base model on en-es (95% CI +0.003 to +0.070) and +0.135 on en-ru (+0.090 to +0.191).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level with a zero-shot model about 8× its size on ranking:&lt;/strong&gt; v1 minus Gemma is +0.008 AUROC on en-es and +0.006 on en-ru, both CIs across 0. On en-es PR-AUC v1 leads by 0.206 (CI +0.099 to +0.286), mostly because Gemma saturates: 27% of en-es rows score 0.97 or more.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choosing the flag line: recall first
&lt;/h3&gt;

&lt;p&gt;My first flag line, F1-optimal on dev, caught only 30% of the major errors in en-es test.&lt;/p&gt;

&lt;p&gt;A false flag costs a post-editor seconds; a missed error reaches the client. So before computing any number I fixed a rule: per pair, the highest threshold that still finds 60% of the dev Majors. For en-es that is 0.4984 (risk ≥ 50% in the UI), flagging 10% of dev segments instead of 3%, and it became the default. Then test, once:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test split&lt;/th&gt;
&lt;th&gt;Flag line&lt;/th&gt;
&lt;th&gt;Recall [95% CI]&lt;/th&gt;
&lt;th&gt;Precision&lt;/th&gt;
&lt;th&gt;Segments flagged&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;en-es&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;review (default)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.48&lt;/strong&gt; [0.42, 0.58]&lt;/td&gt;
&lt;td&gt;0.54&lt;/td&gt;
&lt;td&gt;8.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;F1&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;0.77&lt;/td&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;en-ru&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;review (default)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.74&lt;/strong&gt; [0.63, 0.84]&lt;/td&gt;
&lt;td&gt;0.39&lt;/td&gt;
&lt;td&gt;38.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;en-es missed its target: the whole CI is below 0.60. I didn't move the line; that would be a choice made on test.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real documents: ten public pages, labelled before scoring
&lt;/h3&gt;

&lt;p&gt;Post-editors also get tax rules and medicine leaflets. So I took ten U.S. federal and EU pages with an official Spanish version (IRS, FDA, CDC, SSA, USCIS, EU air passenger rights and more) and translated their 720 segments twice: with OPUS-MT, an open 2020 model, locally, and with DeepSeek-V3.1, an open 671B LLM, on Tinker. Nothing was tuned on these 1,440 translations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The labels.&lt;/strong&gt; Three blind AI annotators (an MQM rater, a post-editor and a Spanish-only reader) labelled each translation Major or OK; two of three decide. None saw the MT system or any score. On 247 WMT24 units with professional labels, a first version of the panel reached F1 0.67 and Cohen's kappa 0.59. Labels, scorer and flag lines were fixed before any detector was scored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The surprise is the MT systems:&lt;/strong&gt; of the 84 major errors, 80 are OPUS-MT's (11% of its segments). DeepSeek-V3.1 made 4 (0.6%); seven of the ten pages have none.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;1,440 translations, 84 Major&lt;/th&gt;
&lt;th&gt;AUROC [95% CI]&lt;/th&gt;
&lt;th&gt;PR-AUC&lt;/th&gt;
&lt;th&gt;Major errors in the riskiest 10%&lt;/th&gt;
&lt;th&gt;Default line: recall [95% CI] / precision / flagged&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SecondRead v1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.910 [0.884, 0.928]&lt;/td&gt;
&lt;td&gt;0.520&lt;/td&gt;
&lt;td&gt;61.9%&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.20&lt;/strong&gt; [0.14, 0.30] / &lt;strong&gt;0.77&lt;/strong&gt; / &lt;strong&gt;1.5%&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.940&lt;/strong&gt; [0.911, 0.957]&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.627&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.82&lt;/strong&gt; [0.71, 0.89] / 0.39 / 12.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gemma's line is from en-ru dev; CIs come from a document bootstrap.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ranking:&lt;/strong&gt; v1 beats its base model (AUROC +0.071, CI +0.036 to +0.119) but trails Gemma (−0.030, CI −0.051 to −0.009), the reverse of WMT test. On OPUS-MT's output alone the gap is within noise (−0.013, CI −0.051 to +0.017); Gemma's lead comes mostly from ranking DeepSeek's clean segments lower.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The default line is far too quiet here:&lt;/strong&gt; 17 of its 22 flags are real, but that is a fifth of the errors (48% on WMT test), while 52 of the 84 sit in its riskiest 10%. Again, the line stays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caught:&lt;/strong&gt; garbled names and words that become other words, such as &lt;em&gt;pareja&lt;/em&gt;, «lista de color» for the flush list and «Desclutter»: 16 of 70 mistranslations, 1 of 2 untranslated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missed:&lt;/strong&gt; the wrong sense in fluent Spanish: fentanyl patches to be «lavar», washed; «Si hace calor», &lt;em&gt;if the weather is hot&lt;/em&gt;, for a hot door in a fire; immigration parole as «libertad condicional»; «devolución». Also all 7 omissions, all 5 terminology errors and all 3 critical errors (Gemma flags all three).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quiet where it matters:&lt;/strong&gt; v1's 5 false flags are all minor errors, only 2 on DeepSeek's 716 clean segments (Gemma 16, base 25), where a real error is one in 180. The publishers' own Spanish, scored as MT, gets 3 flags in 720 (Gemma 79). But v1 caught none of DeepSeek's 4 errors (Gemma 1).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The caveats: the labels are AI's, from three lenses that agree closely (Fleiss' kappa 0.88) and an adjudicator in the same workflow, so treat them as one annotator; no professional labelled this set, and the panel saw the official Spanish. An LLM judge like Gemma may share the panel's idea of Major more than a 4B model trained on WMT labels does.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can synthetic errors teach it wrong senses?
&lt;/h3&gt;

&lt;p&gt;Mistranslations are 70 of the 84 real-page errors and 66–76% of WMT test's major errors. &lt;strong&gt;v2&lt;/strong&gt; showed the trap: 5,095 synthetic number, negation, omission and addition rows taught it those edits and cut en-es test PR-AUC from 0.517 to 0.446 (CI of the drop −0.113 to −0.009).&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;v3&lt;/strong&gt;, Gemma swapped one word of a clean training translation for a wrong sense, false friend or near-antonym (Major) or a synonym (OK); a blind second Gemma call checked each edit, and the real-page error words (&lt;em&gt;return&lt;/em&gt;, &lt;em&gt;flush&lt;/em&gt;, &lt;em&gt;partner&lt;/em&gt; …) never entered a prompt. Under a rule fixed first and run on dev only, &lt;strong&gt;v1 stays&lt;/strong&gt;: v3a and v3b both lose about 0.035 PR-AUC on en-ru dev. They learned their generator (en-es recall 0.79–0.80 on its held-out edits, v1 0.56) but ranked en-es dev's real mistranslations no higher: 46 of 73 in the riskiest 10%, as for v1. Reviewed jobs are the better training data, and they are the paid product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma 4 31B on DigitalOcean: the yardstick and the error factory
&lt;/h3&gt;

&lt;p&gt;Gemma 4 31B runs on DigitalOcean's serverless inference (the Gradient AI Platform) and sees only public text.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The yardstick:&lt;/strong&gt; on WMT, 9,436 calls with the small model's prompt and 800 with GEMBA-MQM, $0.024 per 1,000 en-es segments, 0.58 s median; 2,435 more on the real pages. GEMBA-MQM ranked worse than the plain question, at 14× the cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The error factory:&lt;/strong&gt; the v2 negations, omissions and additions (5,626 calls, $0.42) and the v3 wrong-sense edits and checks (7,101 calls, $0.81).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In all, at most $1.64 of a $5 credit. Gemma 4 is Apache 2.0, and I found nothing in DigitalOcean's terms against training on its outputs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sentry: tracing every review without the text
&lt;/h3&gt;

&lt;p&gt;Each review is one Sentry AI-agent trace: &lt;code&gt;invoke_agent SecondRead&lt;/code&gt;, four &lt;code&gt;execute_tool&lt;/code&gt; spans (&lt;code&gt;parse_xliff&lt;/code&gt;, &lt;code&gt;number_check&lt;/code&gt;, &lt;code&gt;negation_check&lt;/code&gt;, &lt;code&gt;lora_score&lt;/code&gt;), an &lt;code&gt;aggregate&lt;/code&gt; span and a &lt;code&gt;gen_ai.chat&lt;/code&gt; span per segment with input tokens, latency, p(Major) and cost (0: local). An FDA review is 39 chat spans and 3,159 input tokens: 6.4–7.5 s per trace below (5.9 s on the backend's own timer), about 0.6 s per model call, four in flight.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flv97y2e0j7i5ff7ogqtd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flv97y2e0j7i5ff7ogqtd.png" alt="Sentry Agents view for SecondRead: review traces with 39 or 51 model calls, 4 tool calls and $0 cost" width="740" height="880"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqr7a1m178ahq049f7w8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqr7a1m178ahq049f7w8.png" alt="One FDA review as a Sentry trace: agent span, four tool spans, a chat span per segment; the open one shows 73 + 1 tokens, 586 ms and no input text" width="740" height="880"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No segment text goes in, and no segment IDs either, because some CAT tools use the source sentence as the ID. The hostname (often a person's name) is replaced, and the OpenAI and httpx integrations are off, so each model call is traced once.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scripts/canary_check.py&lt;/code&gt; plants &lt;code&gt;SR-CANARY-&amp;lt;uuid&amp;gt;&lt;/code&gt; in segment text, XLIFF IDs, the file name, the query string, exceptions and logs, runs real reviews and captures every envelope: &lt;strong&gt;0 of 12 contain it.&lt;/strong&gt; With the scrubbers for what integrations add on their own (exception and log messages, query strings) turned off, 4 do.&lt;/p&gt;

&lt;p&gt;Tracing was once a suspect: after a few idle minutes, the first job took 21 s. Against bare llama-server, the backend added about 0.7 ms per segment, Sentry or not; the culprit was llama-server's RAM prompt cache, and &lt;code&gt;-cram 0&lt;/code&gt; holds a 51-segment job at 8.4–9.0 s. One limit: Sentry keeps about 1,000 spans per transaction, so a job over about 990 segments loses some chat spans.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it can't do (yet)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Two pairs, Apple Silicon only.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong senses in fluent Spanish are the blind spot,&lt;/strong&gt; and synthetic data didn't help.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It ranks; it doesn't certify:&lt;/strong&gt; the default line finds about half of the en-es test errors and a fifth on the real pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raw MT, one segment at a time:&lt;/strong&gt; untested on edited text; errors across sentences are invisible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noisy, public training data:&lt;/strong&gt; one annotator per segment, nothing legal or medical, possibly seen by Qwen and Gemma.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A big cloud model catches more:&lt;/strong&gt; Gemma found 82% of the real-page errors, flagging 12%.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The model has to come to the text.&lt;/strong&gt; Under an NDA, what matters is whether the text leaves the machine. Open weights and llama.cpp make "no outbound calls" checkable: the API listens on 127.0.0.1, nothing loads remotely, and Sentry is off unless you turn it on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The licensing trap.&lt;/strong&gt; The best-known quality-estimation models, Unbabel's xCOMET and CometKiwi, are CC BY-NC-SA 4.0: a paid tool needs Unbabel's permission. Qwen3.5-4B, Gemma 4, OPUS-MT and Google's annotations are Apache-2.0, so I could train my own and translate the real pages locally.&lt;/p&gt;

&lt;p&gt;The caveat: training wasn't local, but Tinker and DigitalOcean saw only public text. Tinker billed $6.46 in all: $6.21 for Qwen3.5-4B (four training runs, probes and evaluations), $0.23 for the DeepSeek-V3.1 translations and $0.02 for checkpoint storage. DigitalOcean cost at most $1.64 at list price, and Sentry's free plan covered tracing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Tinker.&lt;/strong&gt; The shipped model is a $1.22 Tinker LoRA, run locally as a 36 MB GGUF. Over the untuned base model it lifts WMT test AUROC from 0.776 to 0.815 (en-es) and 0.666 to 0.801 (en-ru), and real-page AUROC by 0.071, level with Gemma 4 31B on WMT at $0 per segment. The v2 and v3 Tinker runs decided what ships, and Tinker sampled the DeepSeek-V3.1 translations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of DigitalOcean.&lt;/strong&gt; Gemma 4 31B on serverless inference is the cloud baseline everywhere (12,671 calls) and generated the synthetic errors, checking v3's (12,727 calls), for at most $1.64; App Platform hosts the demo: &lt;a href="https://secondread-e49hx.ondigitalocean.app" rel="noopener noreferrer"&gt;https://secondread-e49hx.ondigitalocean.app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing.&lt;/strong&gt; One AI-agent trace per review with tokens, latency, p(Major) and cost per model call (screenshots above); a canary test proves the traces carry no text: 0 of 12 envelopes, 4 with the scrubbers off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma 4 31B, served through DigitalOcean, is the yardstick on every test set, wrote the synthetic errors for v2 and v3 (and blindly checked v3's), and is the stronger detector on the real pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; Google's &lt;a href="https://github.com/google/wmt-mqm-human-evaluation" rel="noopener noreferrer"&gt;wmt-mqm-human-evaluation&lt;/a&gt; (Apache-2.0; Freitag et al., 2021; en-ru annotations by Unbabel) on the WMT22 and WMT24 General MT test sets (Kocmi et al., 2022 and 2024), released for research; the repo keeps ids and labels, not their text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real pages:&lt;/strong&gt; IRS, FDA, NIDDK, FEMA (Ready.gov), USCIS, SSA, CDC and MedlinePlus (U.S. federal works, public domain or free to copy) and Regulation (EC) No 261/2004 from EUR-Lex (reuse under Decision 2011/833/EU). The Spanish shown is machine translation; no endorsement is implied.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;code&gt;scripts/train_tinker.py&lt;/code&gt; is adapted from &lt;code&gt;supervised/train.py&lt;/code&gt; in Thinking Machines' tinker-cookbook (Apache-2.0). The GGUF export uses llama.cpp's &lt;code&gt;convert_lora_to_gguf.py&lt;/code&gt; (MIT); llama-server runs the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt and models:&lt;/strong&gt; GEMBA-MQM (Kocmi &amp;amp; Federmann, 2023, CC BY-SA 4.0; adapted, with attribution, in &lt;code&gt;prompts/gemba_mqm.txt&lt;/code&gt;); Qwen3.5-4B (Apache-2.0) from unsloth's GGUF; Gemma 4 31B (Apache-2.0); OPUS-MT en-es (Tiedemann &amp;amp; Thottingal, 2020, Apache-2.0); DeepSeek-V3.1 (MIT); Kokoro-82M (Apache-2.0) narrates the video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI disclosure:&lt;/strong&gt; the code and this post were written with AI assistance (Claude Code). Gemma 4 31B generated the synthetic training rows, labelled as such. The real-page labels come from AI annotators and a Claude adjudicator; no professional labelled them.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>34.8k Stars Won't Put GTA VI on Your PC. Here's What AnyPS5 Is Actually Doing</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Tue, 13 Oct 2026 20:23:58 +0000</pubDate>
      <link>https://dev.to/p0rt/348k-stars-wont-put-gta-vi-on-your-pc-heres-what-anyps5-is-actually-doing-16f8</link>
      <guid>https://dev.to/p0rt/348k-stars-wont-put-gta-vi-on-your-pc-heres-what-anyps5-is-actually-doing-16f8</guid>
      <description>&lt;p&gt;Seeing GTA VI run on a PC before the official port would be a spectacular way to end the console exclusivity argument. So a project that promises to turn PS5 executables into Windows and Linux programs gets attention almost automatically. When I checked on October 13, 2026, GitHub showed &lt;a href="https://github.com/boykopovar/AnyPS5" rel="noopener noreferrer"&gt;AnyPS5 at roughly 34.8k stars&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The attention has technical substance behind it: open code, hand written system libraries, a shader compiler, and reports of commercial games booting. There is also AI involvement, which the contributors state openly in their own write ups.&lt;/p&gt;

&lt;p&gt;None of that means GTA VI is about to run on PC through AnyPS5. &lt;a href="https://www.rockstargames.com/VI" rel="noopener noreferrer"&gt;Rockstar's official page&lt;/a&gt; lists November 19, 2026, on PlayStation 5 and Xbox Series X|S. Nothing in the project's own material claims a GTA VI boot.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; AnyPS5 does not emulate PS5 hardware. The CPU is already x86-64, so the real work is replacing a platform's dependencies: a relinker rewrites the game's ELF into a native executable, hand written libraries answer the system calls the game expects (with the right ABI, not just the right name), and a recompiler turns RDNA shaders into SPIR-V for Vulkan. AI is used in development, not at runtime, and the project's answer to "did the model understand the hardware correctly" is a hardware oracle that runs real RDNA snippets on a real AMD GPU. The 90% style progress counters measure stubs removed and opcodes decoded, not games completed. Boot reports are real and narrow: PAC-MAN WORLD Re-PAC on &lt;code&gt;main&lt;/code&gt;, GTA V at about 27 to 28 FPS in one scene on an experimental branch, Astro Bot at about 10 FPS on a patched build.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The more interesting question is what is already happening. AnyPS5 is a good lens for looking at a console as a set of software dependencies, some of which can be replaced, and at AI as a tool that can help replace them.&lt;/p&gt;

&lt;p&gt;By deplatforming here I mean freeing a program from its technical attachment to one platform. The game still executes its own code. The environment around it is reproduced by other people.&lt;/p&gt;

&lt;p&gt;This has a familiar relative: &lt;a href="https://www.winehq.org/about" rel="noopener noreferrer"&gt;Wine&lt;/a&gt;, the compatibility layer for Windows applications. The shared idea is reproducing the interfaces a program expects. AnyPS5 does it its own way: ahead of time conversion of the executable, its own libraries, and a separate path for console graphics.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hardware gives you the first opening
&lt;/h2&gt;

&lt;p&gt;The PS5 runs an &lt;a href="https://sonyinteractive.com/en/press-releases/2020/playstation-5-launches-this-november-at-399-for-ps5-digital-edition-and-499-for-ps5-with-ultra-hd-blu-ray-disc-drive/" rel="noopener noreferrer"&gt;AMD Zen 2 CPU on x86-64&lt;/a&gt;. That is the same instruction family as an ordinary Intel or AMD desktop. A large share of the game's machine code can potentially be executed by the host CPU itself.&lt;/p&gt;

&lt;p&gt;Identical instructions are not compatibility, though. The program expects a particular loader, particular system functions, a particular memory layout, particular threading rules, and a particular graphics interface. For the game, the platform lives in exactly those details.&lt;/p&gt;

&lt;p&gt;Picture a program that can compute a car's trajectory perfectly well, but reads a file through a function Windows does not have. The CPU understands the math. Execution stops at the first contact with the outside world.&lt;/p&gt;

&lt;p&gt;AnyPS5 splits that problem into parts. Simplified, the pipeline looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qmrgx0hgy77r7apeat1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qmrgx0hgy77r7apeat1.png" alt="AnyPS5 pipeline. Ahead of time, the relinker turns the game ELF and its bundled modules into a native Windows PE or Linux ELF executable. At runtime, CPU code runs natively on the host x86-64 processor, while system calls go to AnyPS5's hand written system libraries. Those route files, threads, audio and input to the host OS, and graphics commands and shaders to the graphics layer, whose shader recompiler turns RDNA into IR, then SPIR-V, then Vulkan on the host GPU." width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That shape comes from the project's &lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/docs/dev/ARCHITECTURE.md" rel="noopener noreferrer"&gt;architecture notes&lt;/a&gt; and its implementation. It avoids running a separate process that pretends to be a whole console. The work of reproducing platform behavior does not disappear, it just lives in the libraries and the graphics layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step one: rewrite the executable
&lt;/h2&gt;

&lt;p&gt;The first component is the &lt;strong&gt;relinker&lt;/strong&gt;. It reads the executable, walks its dependencies and relocations (the places where addresses must be patched at load time), and emits a file in the target OS format: ELF for Linux, PE for Windows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/relinker/relinker/src/pipeline/Conversion.cpp" rel="noopener noreferrer"&gt;Conversion.cpp&lt;/a&gt; shows the sequence: prepare the source image, run &lt;code&gt;RelinkerPipeline&lt;/code&gt;, convert the game's bundled modules, pick a platform patcher, write the result. Illustrative pseudocode, not a literal excerpt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;read_game_elf&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;imports&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analyze_imports_and_relocations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;convert_bundled_modules&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;executable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;build_native_executable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_os&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nobody is recovering the game's C++ sources and rebuilding it. The existing binary and its relationship with the environment are what get reworked.&lt;/p&gt;

&lt;p&gt;Even inside x86-64 there are differences. The project has a &lt;code&gt;--to-intel&lt;/code&gt; mode that rewrites supported AMD specific instructions, with a stated limit: instructions the game generates at runtime are not something an ahead of time pass can catch. The input has to be prepared too, since the relinker expects a clean ELF rather than an arbitrary game package. Both are spelled out in the &lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/docs/user/USAGE.md" rel="noopener noreferrer"&gt;usage docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step two: "just provide the functions"
&lt;/h2&gt;

&lt;p&gt;In the executable, a system function can be referenced by a NID, a compact identifier. AnyPS5 builds its own libraries and renames exported functions to the identifiers the game looks for. &lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/libs/nid/src/NidCompute.cpp" rel="noopener noreferrer"&gt;NidCompute.cpp&lt;/a&gt; computes a NID from a name. The identifier connects a call to an implementation. It says nothing about the implementation being correct.&lt;/p&gt;

&lt;p&gt;Here is a small real excerpt from &lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/libs/prx/libkernel/Time/Time.cpp#L167-L170" rel="noopener noreferrer"&gt;Time.cpp&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;uint64_t&lt;/span&gt; &lt;span class="n"&gt;APS5_VABI&lt;/span&gt; &lt;span class="nf"&gt;sceKernelGetProcessTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;uint64_t&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;GetStartNanos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetMonotonicNanos&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="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000ULL&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;The game calls a familiar system function. AnyPS5 returns elapsed time in microseconds using its own clock helpers. From the caller's point of view the interface holds.&lt;/p&gt;

&lt;p&gt;That tiny function hides another platform boundary: &lt;code&gt;APS5_VABI&lt;/code&gt;. On Windows the macro &lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/libs/prx/libc/include/general/VabiMacros.hpp#L4-L8" rel="noopener noreferrer"&gt;expands to &lt;code&gt;__attribute__((sysv_abi))&lt;/code&gt;&lt;/a&gt;, telling the compiler which calling convention the guest code expects. The ABI governs, among other things, how arguments are passed and which registers may be clobbered.&lt;/p&gt;

&lt;p&gt;A matching function name is not enough. If the caller puts an argument in one register and the implementation reads another, the thing breaks before any real work happens.&lt;/p&gt;

&lt;p&gt;Clocks make a compact example. Threads and memory get hard fast: wakeup ordering, cancelled waits, address reuse. A mistake there can surface minutes later, when the next scene load meets a badly reproduced synchronization primitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step three: the GPU, where it stops being cheap
&lt;/h2&gt;

&lt;p&gt;A console shader cannot be handed to an arbitrary driver as a finished program. AnyPS5 builds its own translation path: decode RDNA instructions, rebuild the control flow graph, lower operations into an intermediate representation, emit SPIR-V for Vulkan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/shader/recompiler/Recompiler.cpp" rel="noopener noreferrer"&gt;Recompiler.cpp&lt;/a&gt; really does contain a decoder, a &lt;code&gt;GraphBuilder&lt;/code&gt;, a &lt;code&gt;Structurizer&lt;/code&gt;, an &lt;code&gt;InstructionTranslator&lt;/code&gt; and a &lt;code&gt;SpirvEmitter&lt;/code&gt;. Strip out resource management, specialization and caches, and the logic reads like this (again, illustrative pseudocode):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;decode_rdna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shader_bytes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;control_flow&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;build_control_flow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;structurize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;control_flow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;ir&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;translate_to_ir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;control_flow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;optimize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ir&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;spirv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;emit_spirv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host_gpu_capabilities&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An IR is convenient because it separates what an operation means from the machine format it came in. The meaning still has to be reproduced exactly: rounding, memory behavior, branching, how threads inside the GPU interact.&lt;/p&gt;

&lt;p&gt;Beyond shaders, the graphics layer handles draw commands, textures, buffers and synchronization. The driver's &lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/docs/dev/debt/libSceAgcDriver.md" rel="noopener noreferrer"&gt;known limitations list&lt;/a&gt; has a telling case: GPU results can land late in memory the game has already freed and reused for something else. That needs correct ordering of events. A faster GPU does not fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the AI actually sits
&lt;/h2&gt;

&lt;p&gt;In the execution path above there is no step where a language model invents the next frame. AnyPS5 performs program transformations. The AI shows up in building those transformations.&lt;/p&gt;

&lt;p&gt;Contributors publish concrete loops: diagnose a crash, change code, build, run, post a new report. In the &lt;a href="https://github.com/boykopovar/AnyPS5/discussions/3443" rel="noopener noreferrer"&gt;PAC-MAN WORLD Re-PAC thread&lt;/a&gt; the author credits Claude with diagnosis and patch preparation. The &lt;a href="https://github.com/boykopovar/AnyPS5/discussions/357" rel="noopener noreferrer"&gt;Astro Bot reports&lt;/a&gt; name Codex directly. That confirms assistants are in use. It does not let anyone compute how much faster the project moved.&lt;/p&gt;

&lt;p&gt;My engineering hypothesis: this kind of work suits assistants unusually well, because the big task decomposes into checkable fragments. Parse a structure format. Find the cause of a crash. Implement one instruction. Write a test for an edge value. Repeat on another driver.&lt;/p&gt;

&lt;p&gt;The hard part stays in verification. If a model misunderstood an instruction's behavior and then wrote the test from the same misunderstanding, a green test only proves two errors agree.&lt;/p&gt;

&lt;p&gt;Which is why the &lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/docs/dev/HW_ORACLE.md" rel="noopener noreferrer"&gt;hardware oracle&lt;/a&gt; is the most interesting file in the repository. The tool runs small RDNA assembly snippets on a real AMD GPU and returns the result, so measured values can be frozen into tests. The docs warn about GPU differences: an observation on one desktop card does not automatically prove PS5 behavior in every case.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contribution rules&lt;/a&gt; require stating the provenance of shader instruction semantics, disclosing AI use, and owning every line you submit. That is a sane collaboration model: the assistant proposes an implementation, and evidence of correctness is gathered separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the progress counters carefully
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/tools/progress.py" rel="noopener noreferrer"&gt;tools/progress.py&lt;/a&gt; counts a library function as implemented once it no longer calls the project's &lt;code&gt;NotImplemented_nid_no_patch&lt;/code&gt; stub. For GPU instructions, the counter reflects decoder recognition.&lt;/p&gt;

&lt;p&gt;Those are useful measures of work on the code. They do not measure the share of compatible games. A function can exist while a rare mode of it still diverges from the console. A decoder can recognize an opcode while the failure happens later. And the denominator of the library statistic only includes functions the project already knows about. "90% implemented" cannot be read as "10% away from GTA VI".&lt;/p&gt;

&lt;p&gt;Concrete boot reports say much more. As of October 13, in the threads I read:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Game&lt;/th&gt;
&lt;th&gt;Build&lt;/th&gt;
&lt;th&gt;Reported result&lt;/th&gt;
&lt;th&gt;Caveats&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/discussions/3443" rel="noopener noreferrer"&gt;PAC-MAN WORLD Re-PAC&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;main&lt;/code&gt;, commit &lt;code&gt;ff8fe4d&lt;/code&gt;, no local patches&lt;/td&gt;
&lt;td&gt;Menu, save load, a playable level with audio&lt;/td&gt;
&lt;td&gt;Post level transition not tested in that session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/discussions/1203" rel="noopener noreferrer"&gt;GTA V, PS5 version&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;experimental branch &lt;code&gt;gta-v/testing&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;~27 to 28 FPS in the prologue bank scene&lt;/td&gt;
&lt;td&gt;Limited scene; the same report says &lt;code&gt;main&lt;/code&gt; stalls at load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/discussions/357" rel="noopener noreferrer"&gt;Astro Bot&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Windows, Ryzen 5 7600, RTX 4060, build with extra patches&lt;/td&gt;
&lt;td&gt;~10 FPS in Crash Site&lt;/td&gt;
&lt;td&gt;Author notes game logic running slow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are substantial results. The distance between a first frame, a controllable character, and a finished playthrough is still large. A working menu says little about saves, about a complex scene five hours in, or about another GPU family.&lt;/p&gt;

&lt;p&gt;GTA VI would require checking its binary, its shaders, its memory behavior, its world streaming and the system interfaces it actually uses. Even a fully working PS5 build of GTA V would not prove the next game compatible. A shared developer and a shared series name are not measurements.&lt;/p&gt;

&lt;p&gt;So promising a near term GTA VI boot through AnyPS5 would be premature. What is already worth discussing is the changing cost of this kind of engineering. If AI helps cycle through checkable hypotheses faster, write adapters, and dissect crashes, then more attempts become practical. How much faster those attempts reach a stable result is something only reproducible tests will show.&lt;/p&gt;

&lt;p&gt;Platform lock in is made of many small contracts between a program and its environment. AnyPS5 makes a number of those contracts visible in code. That is its most interesting effect: "which device does this game run on" slowly turns into "which dependencies are still missing".&lt;/p&gt;

&lt;p&gt;AI can help write the next implementation. Correctness still has to be demonstrated on a running game.&lt;/p&gt;

&lt;p&gt;What would you accept as proof that a compatibility layer is actually correct, rather than correct enough to boot a menu?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Checked on October 13, 2026. Code read at commit &lt;code&gt;dacd78525e537a779682032c0ace7f7af120af05&lt;/code&gt;. Boot results and FPS figures are as reported by the authors of the linked threads; I did not run the games myself while preparing this. Illustrative pseudocode is marked separately from the one real source excerpt.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5" rel="noopener noreferrer"&gt;AnyPS5 repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/docs/dev/ARCHITECTURE.md" rel="noopener noreferrer"&gt;AnyPS5 architecture notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/docs/user/USAGE.md" rel="noopener noreferrer"&gt;AnyPS5 usage docs, including &lt;code&gt;--to-intel&lt;/code&gt; limits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/relinker/relinker/src/pipeline/Conversion.cpp" rel="noopener noreferrer"&gt;Conversion.cpp, the relinker pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/libs/nid/src/NidCompute.cpp" rel="noopener noreferrer"&gt;NidCompute.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/libs/prx/libkernel/Time/Time.cpp#L167-L170" rel="noopener noreferrer"&gt;Time.cpp, &lt;code&gt;sceKernelGetProcessTime&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/libs/prx/libc/include/general/VabiMacros.hpp#L4-L8" rel="noopener noreferrer"&gt;VabiMacros.hpp, the &lt;code&gt;sysv_abi&lt;/code&gt; boundary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/core/shader/recompiler/Recompiler.cpp" rel="noopener noreferrer"&gt;Recompiler.cpp, RDNA to SPIR-V&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/docs/dev/debt/libSceAgcDriver.md" rel="noopener noreferrer"&gt;libSceAgcDriver known limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/docs/dev/HW_ORACLE.md" rel="noopener noreferrer"&gt;HW_ORACLE.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/CONTRIBUTING.md" rel="noopener noreferrer"&gt;CONTRIBUTING.md, provenance and AI disclosure rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/blob/dacd78525e537a779682032c0ace7f7af120af05/tools/progress.py" rel="noopener noreferrer"&gt;tools/progress.py&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/discussions/3443" rel="noopener noreferrer"&gt;PAC-MAN WORLD Re-PAC report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/discussions/1203" rel="noopener noreferrer"&gt;GTA V report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boykopovar/AnyPS5/discussions/357" rel="noopener noreferrer"&gt;Astro Bot report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rockstargames.com/VI" rel="noopener noreferrer"&gt;Rockstar, GTA VI official page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sonyinteractive.com/en/press-releases/2020/playstation-5-launches-this-november-at-399-for-ps5-digital-edition-and-499-for-ps5-with-ultra-hd-blu-ray-disc-drive/" rel="noopener noreferrer"&gt;Sony, PS5 specifications press release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.winehq.org/about" rel="noopener noreferrer"&gt;Wine, about the compatibility layer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>opensource</category>
      <category>ai</category>
      <category>cpp</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>What Agent Builders Can Borrow from OpenAI's Math Research</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Wed, 07 Oct 2026 16:52:57 +0000</pubDate>
      <link>https://dev.to/p0rt/what-agent-builders-can-borrow-from-openais-math-research-53mn</link>
      <guid>https://dev.to/p0rt/what-agent-builders-can-borrow-from-openais-math-research-53mn</guid>
      <description>&lt;p&gt;On October 6, 2026, OpenAI &lt;a href="https://openai.com/index/sharing-ai-progress-in-mathematics/" rel="noopener noreferrer"&gt;published mathematical results&lt;/a&gt; from an internal frontier model. The &lt;a href="https://github.com/openai/math" rel="noopener noreferrer"&gt;openai/math repository&lt;/a&gt; contains &lt;strong&gt;722 manuscripts organized into 372 families&lt;/strong&gt;, with Lean formalizations for many of the results.&lt;/p&gt;

&lt;p&gt;For engineers building AI agents, the release suggests a concrete experiment: apply its separation between proposing a result and independently checking it to the rules that update persistent memory.&lt;/p&gt;

&lt;p&gt;For Symptomato, the target is a familiar failure: a corrected patient record arrives, an old document is uploaded again, and the current value silently goes backward. Every extracted field can be correct while the update rules fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the research gives us
&lt;/h2&gt;

&lt;p&gt;The published Lean artifacts make many of the proofs available for machine checking. Verification status varies across the collection, and some results still lack formalizations. The model itself remained internal at publication.&lt;/p&gt;

&lt;p&gt;The repository also includes &lt;a href="https://github.com/openai/math/blob/main/lean/ComparatorChallenges/README.md" rel="noopener noreferrer"&gt;verification instructions using Comparator&lt;/a&gt;, an existing tool from Lean FRO. OpenAI's release shows how these established tools can accompany AI-generated research results.&lt;/p&gt;

&lt;p&gt;OpenAI additionally shares reasoning summaries, attempted-problem counts, and compute estimates. That transparency suggests another practice to carry into our experiment: report the effort required to obtain a checked result.&lt;/p&gt;

&lt;p&gt;The transferable component is the verification workflow. Our patient-memory specification and proofs would be new application work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apply the idea to Symptomato
&lt;/h2&gt;

&lt;p&gt;Consider a synthetic sequence for one weight observation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revision 1 records &lt;strong&gt;72.4 kg&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Revision 2 explicitly corrects that observation to &lt;strong&gt;72.1 kg&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Revision 1 arrives again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current view must retain 72.1 kg, while history retains both revisions.&lt;/p&gt;

&lt;p&gt;Bind each accepted structured event to an organization, patient, encounter, and assertion. Store its source lineage, source-issued revision, operation, value, and immutable provenance. Compare revisions only within that lineage. Independent sources need separate reconciliation rules.&lt;/p&gt;

&lt;p&gt;Corrections carry complete replacement values, allowing revision 2 to be accepted before revision 1. Arrival order never determines precedence.&lt;/p&gt;

&lt;p&gt;The ledger stores distinct structured events. Equality includes stable payload and provenance; transport delivery timestamps and delivery IDs stay outside it. Reusing a version-specific event ID with different content produces an ingestion conflict, with both candidates preserved.&lt;/p&gt;

&lt;p&gt;Derive the current view from the highest revision for each scoped assertion and source. A consistent assertion becomes active; a retraction removes its active value while preserving history. Incompatible operations or values at the highest revision become a visible conflict.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prove the insertion layer first
&lt;/h2&gt;

&lt;p&gt;The smallest layer fits into a finite-set model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Mathlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Finset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Insert&lt;/span&gt;

&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt; : &lt;span class="kt"&gt;Type&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt; [&lt;span class="n"&gt;DecidableEq&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;]

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ingest&lt;/span&gt; (&lt;span class="n"&gt;s&lt;/span&gt; : &lt;span class="n"&gt;Finset&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;) (&lt;span class="n"&gt;e&lt;/span&gt; : &lt;span class="n"&gt;Event&lt;/span&gt;) : &lt;span class="n"&gt;Finset&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt; :=
  &lt;span class="n"&gt;insert&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="k"&gt;theorem&lt;/span&gt; &lt;span class="n"&gt;retry_is_noop&lt;/span&gt; (&lt;span class="n"&gt;s&lt;/span&gt; : &lt;span class="n"&gt;Finset&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;) (&lt;span class="n"&gt;e&lt;/span&gt; : &lt;span class="n"&gt;Event&lt;/span&gt;) :
    &lt;span class="n"&gt;ingest&lt;/span&gt; (&lt;span class="n"&gt;ingest&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;) &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ingest&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; :=
  &lt;span class="n"&gt;Finset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert_idem&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="k"&gt;theorem&lt;/span&gt; &lt;span class="n"&gt;delivery_order_independent&lt;/span&gt;
    (&lt;span class="n"&gt;s&lt;/span&gt; : &lt;span class="n"&gt;Finset&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;) (&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; : &lt;span class="n"&gt;Event&lt;/span&gt;) :
    &lt;span class="n"&gt;ingest&lt;/span&gt; (&lt;span class="n"&gt;ingest&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;) &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ingest&lt;/span&gt; (&lt;span class="n"&gt;ingest&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;) &lt;span class="n"&gt;a&lt;/span&gt; :=
  &lt;span class="n"&gt;Finset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert_comm&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="k"&gt;theorem&lt;/span&gt; &lt;span class="n"&gt;accepted_event_is_retained&lt;/span&gt;
    (&lt;span class="n"&gt;s&lt;/span&gt; : &lt;span class="n"&gt;Finset&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;) (&lt;span class="n"&gt;e&lt;/span&gt; : &lt;span class="n"&gt;Event&lt;/span&gt;) :
    &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="err"&gt;∈&lt;/span&gt; &lt;span class="n"&gt;ingest&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; :=
  &lt;span class="n"&gt;Finset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mem_insert_self&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These statements reuse &lt;a href="https://leanprover-community.github.io/mathlib4_docs/Mathlib/Data/Finset/Insert.html" rel="noopener noreferrer"&gt;existing Mathlib finite-set laws&lt;/a&gt;. The model covers evidence insertion only. Event validation and the current-record projection still need their own definitions and proofs.&lt;/p&gt;

&lt;p&gt;The third obligation is essential: a function that ignores every event would also be idempotent and independent of delivery order.&lt;/p&gt;

&lt;p&gt;Implement the projection next, with explicit obligations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistent assertions at the highest revision produce the current value and its provenance.&lt;/li&gt;
&lt;li&gt;A strictly older revision cannot replace the current value or resurrect a retracted assertion within its lineage.&lt;/li&gt;
&lt;li&gt;Incompatible highest revisions produce a conflict regardless of delivery order.&lt;/li&gt;
&lt;li&gt;Every displayed value has stored evidence for the exact organization, patient, encounter, and assertion.&lt;/li&gt;
&lt;li&gt;Previously accepted events remain in the ledger after a correction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reuse the independent checking approach
&lt;/h2&gt;

&lt;p&gt;A reviewer freezes the schema, reducer definitions, theorem statements, imports, and build configuration. The agent fills in proof bodies, using Lean diagnostics to guide bounded retries.&lt;/p&gt;

&lt;p&gt;Give &lt;a href="https://github.com/leanprover/comparator" rel="noopener noreferrer"&gt;Comparator&lt;/a&gt; a trusted &lt;code&gt;Challenge&lt;/code&gt; and an agent-produced &lt;code&gt;Solution&lt;/code&gt;. Under its documented environment assumptions, it checks statement and definition agreement, permitted axioms, and acceptance of the proofs by the Lean kernel. Changes to the contract require a separate review.&lt;/p&gt;

&lt;p&gt;Keep a minimal repository with the reviewed model, candidate proofs, generated histories, and the CI check. Pin Lean and Mathlib versions so every proof attempt runs against the same environment.&lt;/p&gt;

&lt;p&gt;Generate proofs during development and check them independently in CI. Patient updates call the deterministic reducer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure what the research workflow adds
&lt;/h2&gt;

&lt;p&gt;Generate histories containing duplicates, shuffled deliveries, corrections, retractions, conflicting revisions, and repeated IDs across organizations and patients. Seed concrete bugs: prefer the last arrival, discard correction history, or omit the organization ID.&lt;/p&gt;

&lt;p&gt;Compare a fixed property-based test suite with the same suite plus formal proof obligations, targeting the same Lean reducer implementation. Freeze each candidate's definitions before proof search while keeping the required properties unchanged. Hold model settings and proof-search budgets constant.&lt;/p&gt;

&lt;p&gt;Report confirmed counterexamples, proof completion, human effort, elapsed time, and model cost. A timeout means the search failed to produce a proof; it does not establish a bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define the production boundary
&lt;/h2&gt;

&lt;p&gt;The guarantees apply to the formal model. A separately written Python reducer needs a correspondence argument; differential tests provide evidence, not a formal equivalence proof. Calling an implementation compiled from checked Lean definitions reduces that gap. Parsing and database integration still need validation.&lt;/p&gt;

&lt;p&gt;Stored provenance also does not establish that an LLM interpreted the source correctly or extracted every relevant fact.&lt;/p&gt;

&lt;p&gt;OpenAI's math release makes this a concrete engineering experiment: study the published proof artifacts and checking workflow, specify one memory operation, and measure the value of independently checked proofs. For Symptomato, that first operation is updating a fact without letting a stale document undo its correction.&lt;/p&gt;

</description>
      <category>openai</category>
      <category>ai</category>
      <category>testing</category>
      <category>programming</category>
    </item>
    <item>
      <title>Same Patient, Conflicting Documents: Can AI Preserve the Evidence?</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Wed, 30 Sep 2026 10:20:40 +0000</pubDate>
      <link>https://dev.to/p0rt/same-patient-conflicting-documents-can-ai-preserve-the-evidence-3anp</link>
      <guid>https://dev.to/p0rt/same-patient-conflicting-documents-can-ai-preserve-the-evidence-3anp</guid>
      <description>&lt;p&gt;&lt;em&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;/em&gt;&lt;/p&gt;

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

&lt;p&gt;In the first chronological run of one synthetic history, a record built from GPT-6 Luna's extractions returned the expected answer to &lt;strong&gt;21 of 22 final queries&lt;/strong&gt;. Yet it had lost an earlier source assertion, hiding a conflict before a correction arrived. The accepted value at the end was right; the documented history was incomplete.&lt;/p&gt;

&lt;p&gt;A patient uploads a laboratory report, an older discharge summary and a photograph of a prescription. A correction arrives later. The same report appears twice. One note describes the patient's mother; another says a diagnosis is suspected. The dates inside the documents do not follow the order in which the files arrived.&lt;/p&gt;

&lt;p&gt;I'm a technical consultant at &lt;a href="https://symptomato.com" rel="noopener noreferrer"&gt;Symptomato&lt;/a&gt;, where AI gathers context before a human health specialist joins the conversation. For Symptomato, we are building a way to turn incoming documents into a longitudinal, source-grounded record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChartReplay&lt;/strong&gt; asks whether an update policy preserves every required assertion and its relationships as corrections and repeated documents arrive. A record fails this content test if it omits a required assertion, adds unsupported content or misrepresents its subject, value, time, uncertainty or relationship to other sources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trust starts with knowing what the record can establish
&lt;/h3&gt;

&lt;p&gt;There are two different questions here. Did the system preserve what the documents actually said? And are those documents themselves accurate accounts of what happened to the patient?&lt;/p&gt;

&lt;p&gt;This experiment tests the first. A faithful record can still contain an erroneous report, a mistaken patient recollection or unresolved disagreement. Establishing authenticity and medical accuracy requires evidence and review beyond this benchmark. The system should expose those questions rather than silently answer them through a confident rewrite.&lt;/p&gt;

&lt;p&gt;In ChartReplay, &lt;strong&gt;accepted&lt;/strong&gt; is a state under explicit record-merging rules. It does not mean independently verified, clinically current or true in the world. A statement can be accepted because no visible source disputes or supersedes it. If we lose a conflicting source, that state can become misleading.&lt;/p&gt;

&lt;p&gt;Provenance makes such decisions inspectable. &lt;a href="https://hl7.org/fhir/R4/provenance.html" rel="noopener noreferrer"&gt;FHIR's Provenance resource&lt;/a&gt; describes how information was created or revised and which entities and agents were involved. ChartReplay is not a FHIR implementation, but the relevant principle is the same: the record needs an inspectable relationship to its sources.&lt;/p&gt;

&lt;h3&gt;
  
  
  The record has to preserve relationships, not just values
&lt;/h3&gt;

&lt;p&gt;I defined a source contract before running the models. It specifies what should survive an update:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What arrives&lt;/th&gt;
&lt;th&gt;What the record must preserve&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Two different values for the same documented event&lt;/td&gt;
&lt;td&gt;Both assertions and the unresolved conflict; upload order does not choose a winner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An explicit correction&lt;/td&gt;
&lt;td&gt;The corrected assertion, its links to the originals, and the originals as superseded history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A repeat upload&lt;/td&gt;
&lt;td&gt;The existing assertion, without inventing another measurement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A later independent measurement&lt;/td&gt;
&lt;td&gt;A separate event, not a correction of the earlier one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A family-history statement or suspected diagnosis&lt;/td&gt;
&lt;td&gt;The correct subject and the stated uncertainty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A medication order or an absent entry&lt;/td&gt;
&lt;td&gt;What the source states, without inferring medication consumption or an explicit negative&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, a prescription does not establish that someone took a medication. An absent allergy entry does not establish that the patient denied allergies. These distinctions follow the source semantics described by &lt;a href="https://hl7.org/fhir/R4/medicationrequest.html" rel="noopener noreferrer"&gt;FHIR MedicationRequest&lt;/a&gt; and &lt;a href="https://hl7.org/fhir/R4/allergyintolerance.html" rel="noopener noreferrer"&gt;AllergyIntolerance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every retained assertion is checked against its supporting source, including subject, event time, value, uncertainty and correction relationships. A citation to an unrelated document does not count. The evaluation includes superseded assertions and unresolved conflicts, not just whichever value appears last.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing one part of the upload problem under controlled conditions
&lt;/h3&gt;

&lt;p&gt;The model pilot uses &lt;strong&gt;ten self-authored synthetic histories&lt;/strong&gt;, one from each logical family. It covers corrections, conflicts and reconciliation, family attribution, uncertainty, medication orders, duplicate versus independent events, time offsets, similar-looking sources, multi-assertion notes and longer histories.&lt;/p&gt;

&lt;p&gt;Each history is delivered chronologically, in a seeded shuffle and with duplicate replays, with two repetitions of each schedule. The unique source set is the same when delivery finishes. At intermediate checkpoints, the expected record is reconstructed from only the sources received so far: a system cannot act on a correction it has not received.&lt;/p&gt;

&lt;p&gt;These are controlled text fixtures with explicit source and event identifiers. They isolate the update problem; they do not reproduce all the difficulty of the opening upload scenario. No photographs, OCR or unrestricted clinical prose enter this pilot. Most documents contain one assertion. A deterministic parser written for the known grammar passes the calibration set without an LLM.&lt;/p&gt;

&lt;p&gt;The broader fixture generator contains 120 cases, 1,020 documents and 1,092 assertions. The model results below use the ten pilot histories, not all 120 cases. Repeated episodes are not independent patients.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three ways to maintain the same history
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Full rebuild&lt;/strong&gt; asks the model to construct the whole chart again from all available originals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rolling rewrite&lt;/strong&gt; gives it the previous chart, new documents and the complete available archive, and asks for an updated chart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extract plus ledger&lt;/strong&gt; asks the model to extract assertions from newly delivered documents. Deterministic software then applies the declared correction and conflict rules.&lt;/p&gt;

&lt;p&gt;The third design has an important constraint: its prompt explicitly prohibits re-extracting archive-only documents. Rebuild and rewrite can recover an earlier omission by reading the originals again. The extractor can see the archive for context, but does not revisit old documents for extraction unless they are delivered again. There is no separate completeness check before the ledger accepts an extraction.&lt;/p&gt;

&lt;p&gt;This is a comparison of those particular update policies, including that asymmetry. It does not establish the performance of every ledger-based design. All three can retain the full history without an imposed chart-size budget; provider context and response limits still apply. Each call starts a fresh conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Models Tested
&lt;/h2&gt;

&lt;p&gt;The primary models are &lt;a href="https://developers.openai.com/api/docs/models/gpt-6-luna" rel="noopener noreferrer"&gt;GPT-6 Luna&lt;/a&gt; (&lt;code&gt;gpt-6-luna&lt;/code&gt;), &lt;a href="https://developers.openai.com/api/docs/models/gpt-6-sol" rel="noopener noreferrer"&gt;GPT-6 Sol&lt;/a&gt; (&lt;code&gt;gpt-6-sol&lt;/code&gt;) and &lt;a href="https://platform.claude.com/docs/en/models/sonnet-5/overview" rel="noopener noreferrer"&gt;Claude Sonnet 5&lt;/a&gt; (&lt;code&gt;claude-sonnet-5&lt;/code&gt;). &lt;strong&gt;Gemini 3.8 Flash&lt;/strong&gt; (&lt;code&gt;google/gemini-3.8-flash&lt;/code&gt;) supplies two separate Kaggle phases.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Episodes and models&lt;/th&gt;
&lt;th&gt;Execution and overlap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary comparison&lt;/td&gt;
&lt;td&gt;540 episodes; Luna, Sol and Sonnet 5&lt;/td&gt;
&lt;td&gt;Direct APIs: OpenAI for Luna/Sol, Anthropic for Sonnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Matched secondary comparison&lt;/td&gt;
&lt;td&gt;288 outcomes; the same three models plus Gemini&lt;/td&gt;
&lt;td&gt;72 Gemini episodes through Kaggle + 216 reused primary episodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public smoke benchmark&lt;/td&gt;
&lt;td&gt;12 episodes; Gemini only&lt;/td&gt;
&lt;td&gt;Separate Kaggle runs on two histories&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each view includes all three update architectures. The primary comparison has the same 60 case–schedule–repetition combinations for each architecture and model. Its complete three-model subset was selected retrospectively from an original five-model lineup by coverage, not by correctness. Every terminal outcome is included.&lt;/p&gt;

&lt;p&gt;The secondary view matches all four models on Gemini's 24 available combinations. The public smoke is a smaller demonstration; its task scores are reported separately below. The direct-provider results are not Kaggle-hosted leaderboard entries.&lt;/p&gt;

&lt;p&gt;The original lineup was recorded on September 25, 2026, with recent releases and sustainable recurring cost as the practical criteria. &lt;a href="https://developers.openai.com/api/docs/changelog" rel="noopener noreferrer"&gt;Luna and Sol were released on September 22&lt;/a&gt;. Sonnet 5, released June 30, was the explicitly chosen cheaper Anthropic tier, not the provider's latest overall release. These are dated selection decisions, not a claim about the current model catalog.&lt;/p&gt;

&lt;p&gt;Inputs, prompts and profiles were frozen. Luna and Sol used medium reasoning effort; Sonnet used adaptive reasoning with high effort. These labels do not establish equal compute. Models ran at different times, and the Kaggle route has its own recorded settings. Each model's smoke test preceded its own pilot.&lt;/p&gt;

&lt;p&gt;The primary score requires an episode to finish under the declared interface and produce an exact final chart. Format failures remain unsuccessful outcomes. The direct-provider arms requested JSON through the prompt, without provider-enforced structured output. This matters for interpreting Sonnet's results; it is separate from the question of whether a completed record preserved the evidence. Saved, unmodified responses and first terminal outcomes are evaluated by the frozen rules, with no judge LLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Losing one assertion hid a conflict
&lt;/h3&gt;

&lt;p&gt;In the reconciliation case, the first source reports &lt;strong&gt;138&lt;/strong&gt;. A second source reports &lt;strong&gt;145&lt;/strong&gt; for the same patient, event, concept and event time. Neither supersedes the other. At that point, the correct record contains both assertions, marked disputed.&lt;/p&gt;

&lt;p&gt;A third source explicitly corrects both to &lt;strong&gt;140&lt;/strong&gt;. Only then does the contract accept 140 and retain the two earlier assertions as superseded history. These numbers use synthetic units; the example concerns document relationships, not interpretation of a clinical measurement.&lt;/p&gt;

&lt;p&gt;In both chronological repetitions, Luna's extractor returned no assertion for the first source. When the second source arrived, the ledger contained only 145, marked accepted. The software had no extracted counterpart with which to identify the conflict.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3egbr0m98ldr4g81ii3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3egbr0m98ldr4g81ii3.png" alt="A three-step saved synthetic trace. After 138 is omitted, the later conflicting value 145 is marked accepted instead of disputed. A correction to 140 yields the expected accepted value, but the history of 138 remains missing." width="800" height="1062"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Observed Luna plus ledger trace, chronological delivery. “Accepted,” “disputed” and “superseded” are benchmark states, not judgments of medical truth. The figure shows the first three uploads of the six-document case.&lt;/em&gt; &lt;a href="https://sergei-parfenov.com/assets/chartreplay-hidden-conflict.png" rel="noopener noreferrer"&gt;Open the trace at full size&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first assertion is &lt;code&gt;CR-02-0000-D34123:1&lt;/code&gt;; the conflicting source is &lt;code&gt;CR-02-0000-D12503&lt;/code&gt;; the explicit correction is &lt;code&gt;CR-02-0000-D31621&lt;/code&gt;. Those identities make the error traceable to particular documents rather than a vague claim that the model “forgot something.”&lt;/p&gt;

&lt;p&gt;The correction to 140 was later applied correctly, but 138 remained absent through all six checkpoints. The first repetition's failed query asked for the measurement history. A consumer inspecting only the accepted value would miss the loss.&lt;/p&gt;

&lt;p&gt;Full rebuild and rolling rewrite preserved the complete record in these chronological repetitions. The difference matters: repeated reconstruction gave those arms an opportunity that the one-pass extraction policy did not provide.&lt;/p&gt;

&lt;p&gt;This is also why storing the original file and retaining its assertions in the usable record are separate requirements. The original document remained in the source archive. It was the derived record that lost its contribution, and with it the visible disagreement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Completeness matters even when retained facts are correct
&lt;/h3&gt;

&lt;p&gt;The primary results use the same 60 combinations in every cell. “Exact” requires the complete final record, including history and relationships, and successful completion of the strict interface contract.&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;Full rebuild&lt;/th&gt;
&lt;th&gt;Rolling rewrite&lt;/th&gt;
&lt;th&gt;Extract plus ledger&lt;/th&gt;
&lt;th&gt;Format failures across 180 episodes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Luna&lt;/td&gt;
&lt;td&gt;59/60&lt;/td&gt;
&lt;td&gt;59/60&lt;/td&gt;
&lt;td&gt;54/60&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Sol&lt;/td&gt;
&lt;td&gt;60/60&lt;/td&gt;
&lt;td&gt;60/60&lt;/td&gt;
&lt;td&gt;49/60&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 5&lt;/td&gt;
&lt;td&gt;0/60&lt;/td&gt;
&lt;td&gt;7/60&lt;/td&gt;
&lt;td&gt;0/60&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All six Luna ledger failures and all eleven Sol ledger failures involved missing assertions. In one chronological Sol episode, a source explicitly documented an allergy to &lt;code&gt;drug:beta&lt;/code&gt;; its extraction was empty and the final record omitted the allergy.&lt;/p&gt;

&lt;p&gt;Across Sol's 590 ledger checkpoints, all 3,961 predicted assertion occurrences matched the contract, against 4,094 expected occurrences: &lt;strong&gt;100% precision and 96.75% recall&lt;/strong&gt;, yet only &lt;strong&gt;49/60 exact final records&lt;/strong&gt;. These are repeated occurrences across checkpoints and schedules, not thousands of independent patients. Checking whether retained facts are supported would not, by itself, find every missing fact.&lt;/p&gt;

&lt;p&gt;The experiment also contains successful handling of disagreement. In the dedicated unresolved-conflict case, Luna and Sol produced exact final records in all six schedule–repetition combinations under each architecture. The system could preserve a known conflict. The reconciliation failure shows what happens when extraction prevents one side from reaching that system.&lt;/p&gt;

&lt;p&gt;A second case checks what the assertion actually means. Under duplicate replays, with eight unique documents delivered twelve times, all three Luna architectures preserved statements about the patient's mother and father separately from a suspected condition in the patient. They also kept an allergy marked unknown and a symptom explicitly denied, without creating duplicate assertions. Preserving a supported statement can mean preserving uncertainty, rather than confirming a diagnosis.&lt;/p&gt;

&lt;p&gt;Exact scoring also catches literal-contract errors. Luna's single rebuild failure shortened the source identifier &lt;code&gt;procedure:alpha&lt;/code&gt; to &lt;code&gt;alpha&lt;/code&gt;; the assertion was present. That is a different defect from losing an allergy or hiding disagreement, even though each prevents an exact-record result.&lt;/p&gt;

&lt;h3&gt;
  
  
  A correct final record is not enough during an ongoing history
&lt;/h3&gt;

&lt;p&gt;Records may be used between uploads. Luna produced &lt;strong&gt;1,713/1,770 exact checkpoints&lt;/strong&gt;, and Sol &lt;strong&gt;1,656/1,770&lt;/strong&gt;. A final correction does not undo the period during which the record was incomplete.&lt;/p&gt;

&lt;p&gt;We also required the three delivery schedules to produce the same correct final record for each case–repetition group. The ledger passed &lt;strong&gt;14/20 groups for Luna&lt;/strong&gt; and &lt;strong&gt;11/20 for Sol&lt;/strong&gt;; full rebuild passed &lt;strong&gt;19/20 and 20/20&lt;/strong&gt;. An invariant but incomplete record would fail this requirement.&lt;/p&gt;

&lt;p&gt;The experiment does not isolate a causal effect of upload order. For ledger, repeated identical schedules disagreed in 4/30 pairs for Luna and 10/30 for Sol; different schedules within a repetition disagreed in 12/60 and 19/60 pairs. These correlated comparisons show that ordinary model variability also matters. The strongest observation is the actual lost evidence and its consequences, not a claim that reordering alone caused every difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini adds evidence on the same available conditions
&lt;/h3&gt;

&lt;p&gt;Gemini's 24 available combinations let us make a smaller matched comparison across four models and all three architectures. Selection uses availability only and includes every format failure.&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;Full rebuild&lt;/th&gt;
&lt;th&gt;Rolling rewrite&lt;/th&gt;
&lt;th&gt;Extract plus ledger&lt;/th&gt;
&lt;th&gt;Format failures across 72 episodes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Luna&lt;/td&gt;
&lt;td&gt;24/24&lt;/td&gt;
&lt;td&gt;24/24&lt;/td&gt;
&lt;td&gt;22/24&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Sol&lt;/td&gt;
&lt;td&gt;24/24&lt;/td&gt;
&lt;td&gt;24/24&lt;/td&gt;
&lt;td&gt;19/24&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 5&lt;/td&gt;
&lt;td&gt;0/24&lt;/td&gt;
&lt;td&gt;5/24&lt;/td&gt;
&lt;td&gt;0/24&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.8 Flash, via Kaggle&lt;/td&gt;
&lt;td&gt;23/24&lt;/td&gt;
&lt;td&gt;20/24&lt;/td&gt;
&lt;td&gt;17/24&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All ten families appear, but unevenly; only one case–repetition group has all three delivery schedules. This is not a complete four-model test of order invariance.&lt;/p&gt;

&lt;p&gt;Gemini's one completed but inexact episode was a shuffled medication history in the ledger arm. A newly delivered source described a separate 5 mg medication order. The extractor omitted it, leaving seven of eight required assertions in the final chart. It is another example of source information failing to enter the derived record.&lt;/p&gt;

&lt;p&gt;The sample also contains counterevidence to a blanket preference for reconstruction. In the chronological 24-document history, Gemini's ledger passed all 24 checkpoints, while rebuild and rewrite stopped on format violations at steps 24 and 8. A stopped integration and an incomplete completed record are different outcomes.&lt;/p&gt;

&lt;p&gt;A necessary interpretation note: all 170 Sonnet format failures and all eleven Gemini format failures involved Markdown-wrapped JSON. Offline removal of one outer wrapper made those responses pass the schema; the accumulated record at the rejected step was exact in 121/170 and 10/11 cases, respectively. These diagnostics do not repair primary scores or invent the later responses of episodes stopped early. The low Sonnet totals cannot be read as a general inability to understand the sources. The missing-fact examples above come from responses the original interface accepted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lower expense does not price the missing verification step
&lt;/h3&gt;

&lt;p&gt;At the September 25 tariffs and observed cache usage, the selected 60-episode rebuild and ledger arms cost an estimated &lt;strong&gt;$0.31 and $0.11 for Luna&lt;/strong&gt;, and &lt;strong&gt;$5.68 and $2.06 for Sol&lt;/strong&gt;. These are model-token estimates for selected calls, not provider invoices or production bills; interrupted attempts and unknown costs remain separate.&lt;/p&gt;

&lt;p&gt;Those cheaper ledger results include the consequences of the one-pass policy. A completeness check, targeted re-extraction or periodic reconciliation would add work that was not measured. We have not established the cheapest design that meets an acceptable quality target for Symptomato.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Benchmark
&lt;/h2&gt;

&lt;p&gt;ChartReplay separates source inputs from evaluator-only expected records. It retains original source text, assertion identities, correction links, delivery schedules and saved response traces, so an error can be inspected at the update where it appeared. The ledger's disposition rules are explicit; a claim is not considered supported merely because it cites some document.&lt;/p&gt;

&lt;p&gt;The evaluator needed its own checks. An initial audit corrected timestamp comparison, categorical normalization and validation inconsistencies. Calibration then ran 9,240 deterministic episodes across 120 fixtures, seven schedules and eleven systems. Two positive controls each passed 840/840 final episodes and 5,988/5,988 checkpoints; all nine deliberately injected fault types were detected in at least one applicable case. These results check the declared contract, not clinical understanding.&lt;/p&gt;

&lt;p&gt;A separate controlled demonstration removed every superseded assertion from 24 parameterized histories. Eight existing questions still passed on all 24; full-record evaluation passed on none. Adding a history question exposed every failure. Question answering can test the same contract if its coverage is exhaustive, but a handful of correct answers is not evidence that the whole record survived.&lt;/p&gt;

&lt;p&gt;Streaming evaluation of medical memory is established prior work. &lt;a href="https://arxiv.org/abs/2605.11814" rel="noopener noreferrer"&gt;MedMemoryBench&lt;/a&gt; evaluates memory as it is constructed; &lt;a href="https://arxiv.org/abs/2609.01111" rel="noopener noreferrer"&gt;ClinTraceBench&lt;/a&gt; studies longitudinal clinical tasks with source-verifiable evidence. ChartReplay's narrower contribution is an explicit record-construction contract and traces showing how an update can lose evidence or change its disposition.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Kaggle tasks
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://www.kaggle.com/benchmarks/sergeiparfenov/chartreplay-source-grounded-record-integrity" rel="noopener noreferrer"&gt;ChartReplay benchmark on Kaggle&lt;/a&gt; consists of three existing smoke tasks, one for each update architecture. They use two synthetic histories—a correction chain and a history containing a multi-assertion note—delivered chronologically and with duplicate replays, once per schedule.&lt;/p&gt;

&lt;p&gt;Each task returns the fraction of the two case–repetition groups for which &lt;strong&gt;both delivery schedules produce the same exact final record&lt;/strong&gt;. This score tests correctness and invariance together; it is different from the fraction of individual episodes that finish correctly.&lt;/p&gt;

&lt;p&gt;The saved Gemini 3.8 Flash results are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Correct-and-invariant score&lt;/th&gt;
&lt;th&gt;Exact final records&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full rebuild&lt;/td&gt;
&lt;td&gt;1.0 (2/2 groups)&lt;/td&gt;
&lt;td&gt;4/4 episodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rolling rewrite&lt;/td&gt;
&lt;td&gt;1.0 (2/2 groups)&lt;/td&gt;
&lt;td&gt;4/4 episodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extract plus ledger&lt;/td&gt;
&lt;td&gt;0.5 (1/2 groups)&lt;/td&gt;
&lt;td&gt;3/4 episodes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The smoke used &lt;strong&gt;84 recorded application calls&lt;/strong&gt;. Its two histories recur in the larger pilot, so it is not independent held-out confirmation.&lt;/p&gt;

&lt;p&gt;The tasks provide a small executable test of the same evidence-preservation contract. They cover corrections and repeated delivery; the reconciliation example with values 138, 145 and 140 comes from the larger pilot, not these smoke tasks. The architecture scores are reported separately because combining them would obscure the comparison.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inspect the saved failure offline
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://sergei-parfenov.com/assets/chartreplay-hidden-conflict-evidence.zip" rel="noopener noreferrer"&gt;Download the hidden-conflict evidence ZIP&lt;/a&gt;. It contains six synthetic documents, six saved prompts and unmodified model responses, expected and observed states, and 22 saved queries from Luna's first chronological reconciliation run.&lt;/p&gt;

&lt;p&gt;Unzip it, open the extracted folder in a terminal, and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 verify_trace.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The standalone verifier uses Python's standard library and makes no API calls. It reconstructs dispositions and query answers from the saved trace. This case was selected after reviewing the results to illustrate a failure; the bundle does not reproduce all primary tables or the full evaluator.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this changes for the system we are building
&lt;/h3&gt;

&lt;p&gt;For Symptomato, the immediate design implication is to keep the original upload, its extracted assertions and its reconciliation status inspectable separately. A successful extraction call should not, by itself, mark a source fully incorporated. I would expose unresolved coverage to the reviewer and test a separate check that can trigger targeted re-extraction. The benchmark knows which assertions are missing because it has an oracle; the product will not. That coverage check needs evaluation against independently annotated documents before we can claim it improves completeness.&lt;/p&gt;

&lt;p&gt;A further evaluation needs independently annotated, naturally written document sets with ambiguous references, dates and source quality. OCR would need its own paired tests against the corresponding text. The present experiment does not assess document authenticity, rank competing sources by authority, verify real-world medical facts or establish clinical safety. A prepared controlled-prose layer has not been run through models and would not, by itself, establish those capabilities.&lt;/p&gt;

&lt;p&gt;OpenAI Codex assisted implementation, offline analysis and drafting. The cover was generated with AI; the trace figure comes from saved experimental states. No model was used to judge the reported record scores.&lt;/p&gt;

&lt;p&gt;A record we can inspect must keep disagreement visible until there is evidence to resolve it. In the observed failure, the system made that disagreement disappear before the correction arrived. Preserving the accepted answer at the end was not enough to preserve the patient's documented history.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>The Test Looked Redundant. The Ninth Bug Needed It</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Tue, 15 Sep 2026 13:20:00 +0000</pubDate>
      <link>https://dev.to/p0rt/the-test-looked-redundant-the-ninth-bug-needed-it-16me</link>
      <guid>https://dev.to/p0rt/the-test-looked-redundant-the-ninth-bug-needed-it-16me</guid>
      <description>&lt;p&gt;On a catalogue of eight implementations, a repeated-status test added no unique detection. Every candidate it rejected was already rejected by another check.&lt;/p&gt;

&lt;p&gt;I added a ninth implementation. The repeated-status test became the only check that caught it.&lt;/p&gt;

&lt;p&gt;That changes how I would apply the recommendation at the end of &lt;a href="https://dev.to/p0rt/ai-generated-tests-can-make-coding-agents-worse-heres-how-to-check-yours-3jc9"&gt;my previous article on AI-generated tests&lt;/a&gt;. I suggested reviewing a test by asking which plausible wrong implementation it rejects. The comments made that question executable: run the suite against a catalogue of mistakes and count the rejections.&lt;/p&gt;

&lt;p&gt;The approach is useful. Its denominator still needs review.&lt;/p&gt;

&lt;p&gt;I have put the &lt;a href="https://github.com/P0rt/mutation-score-boundaries/tree/19c73b446009e91f10f220dac61a30f96cc1ba5d" rel="noopener noreferrer"&gt;code, checks, mutation diffs, and recorded results on GitHub&lt;/a&gt;. These are local runs of a deliberately constructed Python fixture, not measurements of a coding agent or a replication of ExecCritic. One part reproduces a commenter's result with matching Python and tool versions. Another reconstructs prose-described variants whose original files I do not have. The ninth candidate is my own deliberate counterexample.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five out of five did not distinguish the suites
&lt;/h2&gt;

&lt;p&gt;The previous example was an order filter with three rules: omitting the filter or passing &lt;code&gt;None&lt;/code&gt; returns all orders; an empty list returns none; a list of statuses selects matching orders.&lt;/p&gt;

&lt;p&gt;The correct implementation is small:&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="n"&gt;ORDERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&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;id&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&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;paid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;id&lt;/span&gt;&lt;span class="sh"&gt;"&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;status&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;pending&lt;/span&gt;&lt;span class="sh"&gt;"&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;filter_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&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;statuses&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Changing the condition to &lt;code&gt;if not statuses&lt;/code&gt; introduces the regression. Python treats both &lt;code&gt;None&lt;/code&gt; and &lt;code&gt;[]&lt;/code&gt; as falsey, so the function returns everything for an empty filter. Two tests—default call and paid-status selection—accept both versions. The empty-list assertion separates them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/vinhnguyenthanhdn/comment/3ej62"&gt;Vinh Nguyen ran mutmut against this fixture&lt;/a&gt; and reported a boundary I had left too easy to miss: the generated candidates did not include that condition substitution.&lt;/p&gt;

&lt;p&gt;I reproduced the comparison with &lt;strong&gt;CPython 3.14.6 and mutmut 3.7.0&lt;/strong&gt;. The correct implementation scored &lt;strong&gt;5/5&lt;/strong&gt; with the two tests and &lt;strong&gt;5/5&lt;/strong&gt; after adding the empty-list test. The wrong implementation also scored &lt;strong&gt;5/5&lt;/strong&gt; with the two tests. With all three, the wrong implementation failed its baseline, so it received no mutation score.&lt;/p&gt;

&lt;p&gt;For the correct function, the tool inverted the identity comparison, replaced &lt;code&gt;list(orders)&lt;/code&gt; with &lt;code&gt;list(None)&lt;/code&gt;, altered the &lt;code&gt;"status"&lt;/code&gt; key in two ways, and inverted membership. It never replaced the identity comparison with a truthiness test. Several generated candidates raised exceptions; the suite detected those, too. The exact diffs and failure categories are recorded.&lt;/p&gt;

&lt;p&gt;The score correctly described all five candidates the tool had generated. It could not distinguish these two suites because both rejected that entire set.&lt;/p&gt;

&lt;p&gt;Following &lt;a href="https://dev.to/vinhnguyenthanhdn/comment/3ek7h"&gt;Vinh's second comparison&lt;/a&gt;, I added the missing truthiness candidate by hand. Against the same six candidates, the two-test suite rejected &lt;strong&gt;5/6&lt;/strong&gt; and the three-test suite rejected &lt;strong&gt;6/6&lt;/strong&gt;. All of the new distinction came from the candidate derived from the empty-filter requirement.&lt;/p&gt;

&lt;p&gt;This observation is specific to the fixture and operator configuration. It gives no estimate of how often mutation testing misses important distinctions in other code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight candidates made another test look unnecessary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/howcani_howcani_77e786a89/comment/3ejm6"&gt;howcani described a broader catalogue&lt;/a&gt;: eight alternatives involving the filter condition, ignored filtering, an incorrect comparison, list identity, output order, repeated selectors, and changes to the input.&lt;/p&gt;

&lt;p&gt;I reconstructed those alternatives with fresh input for each check and independent expected values. The cumulative rejections matched the reported progression:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The original two checks rejected &lt;strong&gt;3/8&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Adding the empty-list check rejected &lt;strong&gt;4/8&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Requiring a new list object brought it to &lt;strong&gt;5/8&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Adding an order-sensitive check brought it to &lt;strong&gt;7/8&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Checking that the caller's input remained unchanged brought it to &lt;strong&gt;8/8&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those matching counts are not a blind replication. The descriptions and counts informed the reconstruction. Exact inputs and implementation choices matter, and the original files were unavailable.&lt;/p&gt;

&lt;p&gt;One reconstructed candidate iterates over requested statuses first, then orders. That can both reorder the result and duplicate orders when a status appears twice. My order probe catches it. So does this check:&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="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&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;paid&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;paid&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ORDERS&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;f&lt;/code&gt; is the candidate being evaluated. Once the order probe is present, the repeated-status check adds no unique rejection among those eight candidates. It is redundant for separating that finite set. In the discussion, I had agreed with adding assertions only when they reject a surviving candidate.&lt;/p&gt;

&lt;p&gt;The stronger interpretation of that rule does not survive the next function.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ninth candidate preserves order and duplicates matches
&lt;/h2&gt;

&lt;p&gt;Here is the additional implementation:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;duplicate_only&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&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;statuses&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;order&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&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;statuses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&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;For unique requested statuses, it behaves like the correct filter. It preserves input order, creates a new list, leaves the input unchanged, and handles both &lt;code&gt;None&lt;/code&gt; and &lt;code&gt;[]&lt;/code&gt; correctly. For a repeated status, it repeats the matching order.&lt;/p&gt;

&lt;p&gt;It passes all six checks that collectively rejected the first eight candidates. The repeated-status check rejects it.&lt;/p&gt;

&lt;p&gt;With the ninth candidate included, the six-check result is &lt;strong&gt;8/9&lt;/strong&gt;. Retaining the seventh check makes it &lt;strong&gt;9/9&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faxapuptwj3u05bgfaewu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faxapuptwj3u05bgfaewu.png" alt="Mutation results and a matrix showing which checks reject each reconstructed candidate, including the separately added ninth variant" width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last row is the added challenge. Its only rejection comes from the repeated-status column.&lt;/p&gt;

&lt;p&gt;I constructed this candidate specifically to separate behaviors that the earlier loop combined. It is not a held-out sample, evidence of bug frequency, or a reason to report 9/9 as general coverage. It demonstrates a narrower point: &lt;strong&gt;a check's lack of a unique rejection can be a property of the catalogue.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The smaller catalogue contained no candidate that duplicated matches while preserving order. Its apparent redundancy inherited that omission.&lt;/p&gt;

&lt;h2&gt;
  
  
  My original runner also changed the count
&lt;/h2&gt;

&lt;p&gt;There was another awkward result. Running the same reconstructed catalogue through the untouched runner from my published archive produced &lt;strong&gt;4/8 and 5/8&lt;/strong&gt;, instead of 3/8 and 4/8.&lt;/p&gt;

&lt;p&gt;The extra rejection came from the candidate that builds the correct return value and then appends a sentinel to the input. In simplified form:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;append_after_copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;orders&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;id&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&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;sentinel&lt;/span&gt;&lt;span class="sh"&gt;"&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;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My original default check compares the function's result with &lt;code&gt;ORDERS&lt;/code&gt;. That expected value is the same mutable list passed into the function. By the time equality is evaluated, the expected list has grown. The returned copy has not. The assertion fails.&lt;/p&gt;

&lt;p&gt;With an independent before-call snapshot as the expected output, the output check passes. A separate input-preservation assertion catches the side effect when that property is required.&lt;/p&gt;

&lt;p&gt;The original check happens to reject this candidate. But the two runners are measuring different things. A count without the expected-value construction and state-isolation rules is missing part of its method.&lt;/p&gt;

&lt;p&gt;This discrepancy does not show that howcani's count was wrong; I do not have his precise implementation and test harness. It shows why publishing the functions alone would not make my reconstruction reproducible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some of the catalogue expanded the contract
&lt;/h2&gt;

&lt;p&gt;The original three rules described which orders should be returned. They did not separately promise a new outer list, stable ordering, or unchanged input. Those may be appropriate requirements. The brief did not settle them.&lt;/p&gt;

&lt;p&gt;I checked a narrow interpretation: preserve the membership and multiplicity of the matching orders, without specifying their order or object ownership. Repeating a selector does not create another order under this interpretation.&lt;/p&gt;

&lt;p&gt;Across a finite domain of &lt;strong&gt;1,134 calls per function&lt;/strong&gt;, four alternatives—returning an alias, reversing the output, sorting the input, and appending after constructing the result—returned the correct multiset on every call. The domain included empty inputs, omitted and explicit &lt;code&gt;None&lt;/code&gt; filters, repeated selectors, unknown statuses, and reversed input order. The full setup is in the &lt;a href="https://github.com/P0rt/mutation-score-boundaries/blob/19c73b446009e91f10f220dac61a30f96cc1ba5d/docs/experiment.md" rel="noopener noreferrer"&gt;experiment report&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Those functions can still be bad choices for a real caller. Mutating input can corrupt later calls. Order or ownership may be an established compatibility promise. Passing a one-call, finite-domain check does not establish product correctness.&lt;/p&gt;

&lt;p&gt;The implication for the catalogue is specific: attach a requirement to each candidate before labeling its behavior a bug. &lt;code&gt;return orders&lt;/code&gt; violates a new-list promise if the product makes one. The fact that my reference implementation uses &lt;code&gt;list(orders)&lt;/code&gt; does not, on its own, establish that promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the regression; keep questioning the catalogue
&lt;/h2&gt;

&lt;p&gt;For an agent repair loop, I would keep the review question from the previous article and narrow the pruning rule.&lt;/p&gt;

&lt;p&gt;Start with a written requirement and its supported inputs. Give each candidate an executable counterexample and a reviewed expected result. Use the candidate matrix to discover missing distinctions. Keep accepted regression checks stable while the implementation changes.&lt;/p&gt;

&lt;p&gt;If a test adds no unique rejection, inspect the overlap before deleting it. Two tests may reject the same candidate because that candidate bundles two independent mistakes. Ask whether one mistake can occur without the other. Here, an outer loop over selectors bundled ordering and duplication. Changing the loop structure separated them.&lt;/p&gt;

&lt;p&gt;This does not mean retaining every test forever. A finite catalogue can support pruning when the intended objective is discrimination within that catalogue. Removing a regression check tied to a distinct requirement needs a broader argument—such as the remaining checks establishing the same behavior over the supported inputs.&lt;/p&gt;

&lt;p&gt;I would carry that distinction into the same record as the score: contract revision, candidate revision, probes, expected values, environment, and observed failures. It extends the concern in &lt;a href="https://sergei-parfenov.com/blog/the-model-scored-30-the-harness-scored-100-which-one-did-you-benchmark-3mp4/" rel="noopener noreferrer"&gt;my earlier piece about harness-dependent scores&lt;/a&gt;: the number only describes the system that produced it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/P0rt/mutation-score-boundaries" rel="noopener noreferrer"&gt;repository&lt;/a&gt; includes the original archive, four mutation-test configurations, saved generated functions, reconstructed candidates, the ninth challenge, and commands for replaying the evidence. The quick verification uses only Python's standard library; the full mutation run uses the recorded dependency versions.&lt;/p&gt;

&lt;p&gt;The repeated-status requirement did not change when I added the ninth function. The catalogue finally contained a way to violate it without also violating the order check. That is the reason I would keep the test.&lt;/p&gt;




&lt;p&gt;If this article helped you, you can &lt;a href="https://ko-fi.com/sergeiparfenov?ref=dev" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt;. Your support helps me make time for the next experiment.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>python</category>
      <category>agents</category>
    </item>
    <item>
      <title>AI-Generated Tests Can Make Coding Agents Worse. Here's How to Check Yours</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Fri, 11 Sep 2026 11:57:46 +0000</pubDate>
      <link>https://dev.to/p0rt/ai-generated-tests-can-make-coding-agents-worse-heres-how-to-check-yours-3jc9</link>
      <guid>https://dev.to/p0rt/ai-generated-tests-can-make-coding-agents-worse-heres-how-to-check-yours-3jc9</guid>
      <description>&lt;p&gt;A bug fix can make every new test pass and still introduce a regression. Here is a deliberately constructed Python example, checked locally without an LLM.&lt;/p&gt;

&lt;p&gt;An order filter has three requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Omit the filter, or pass &lt;code&gt;None&lt;/code&gt;: return all orders.&lt;/li&gt;
&lt;li&gt;Pass an empty list: return no orders.&lt;/li&gt;
&lt;li&gt;Pass a list of statuses: return only matching orders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reported bug is that omitting the filter returns nothing. This proposed fix looks reasonable:&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="n"&gt;ORDERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&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;id&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&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;paid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;id&lt;/span&gt;&lt;span class="sh"&gt;"&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;status&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;pending&lt;/span&gt;&lt;span class="sh"&gt;"&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;filter_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;statuses&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;filter_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;filter_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&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;paid&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ORDERS&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2 checks passed&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;Both checks pass. Both branches of the &lt;code&gt;if&lt;/code&gt; have been exercised. The reported symptom is fixed.&lt;/p&gt;

&lt;p&gt;Now add the check for the second requirement:&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="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;filter_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It fails. The function returns every order.&lt;/p&gt;

&lt;p&gt;Python treats both &lt;code&gt;None&lt;/code&gt; and &lt;code&gt;[]&lt;/code&gt; as falsey. Our requirements give them different meanings, and the patch erases that distinction.&lt;/p&gt;

&lt;p&gt;The connection to coding agents becomes more consequential when those checks determine what the agent does next.&lt;/p&gt;

&lt;p&gt;On September 8, Leitian Tao and colleagues published the &lt;a href="https://arxiv.org/html/2609.09133v1" rel="noopener noreferrer"&gt;ExecCritic preprint&lt;/a&gt;. Holding the Qwen-3.5-35B-A3B Repair agent fixed, they reported these SWE-bench Verified results:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feedback source&lt;/th&gt;
&lt;th&gt;Tasks resolved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Initial repair, before generated-test feedback&lt;/td&gt;
&lt;td&gt;61.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests from the base Qwen Test agent&lt;/td&gt;
&lt;td&gt;57.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests from GPT-5.6-sol&lt;/td&gt;
&lt;td&gt;65.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The weaker tests reduced the resolved rate by &lt;strong&gt;3.9 percentage points&lt;/strong&gt;. Better tests improved it.&lt;/p&gt;

&lt;p&gt;Rates average three repair runs, reusing generated tests. Failed test qualification retains the initial patch in the all-task score. The baseline does not forbid repository tests. A separate official evaluator determines resolution. Feedback adds test-generation and revision work; compute budgets are not matched. These are the authors' results, not a benchmark replication for this article. &lt;a href="https://arxiv.org/html/2609.09133v1#S5" rel="noopener noreferrer"&gt;Method and results&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A bad test can do more than miss a defect. It can give the next edit the wrong target.&lt;/p&gt;

&lt;p&gt;Imagine adding this assertion to the filter example:&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;# This expectation contradicts the stated empty-list requirement.
&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;filter_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&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;ORDERS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our broken patch passes it. A correct implementation would fail it. Feed that failure into an automatic repair loop, and the loop now has a reason to damage correct behavior.&lt;/p&gt;

&lt;p&gt;Adding assertions has strengthened the wrong interpretation.&lt;/p&gt;

&lt;p&gt;Even the familiar “fails before the fix, passes afterward” check needs a closer look. Here is the original implementation from the fixture:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;filter_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;statuses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default-filter assertion fails against this version and passes against our proposed patch. It correctly detects the original bug. It simply cannot detect the new one.&lt;/p&gt;

&lt;p&gt;The complete fix handles &lt;code&gt;None&lt;/code&gt; explicitly:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;filter_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&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;statuses&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running the same checks against all three implementations produces:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Default + paid-filter checks&lt;/th&gt;
&lt;th&gt;Those checks + empty-list check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Original&lt;/td&gt;
&lt;td&gt;1 passes, 1 fails&lt;/td&gt;
&lt;td&gt;2 pass, 1 fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plausible patch&lt;/td&gt;
&lt;td&gt;2 pass&lt;/td&gt;
&lt;td&gt;2 pass, 1 fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corrected patch&lt;/td&gt;
&lt;td&gt;2 pass&lt;/td&gt;
&lt;td&gt;3 pass&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://sergei-parfenov.com/assets/downloads/ai-test-demo.zip" rel="noopener noreferrer"&gt;runnable companion&lt;/a&gt; includes all three implementations, the checks, and the verified output. It uses Python’s standard library and makes no LLM or network calls.&lt;/p&gt;

&lt;p&gt;The extra check earns its place because it distinguishes two implementations the earlier checks considered equally acceptable.&lt;/p&gt;

&lt;p&gt;That is the question I would bring to an AI-generated test review: &lt;strong&gt;which plausible wrong implementation would this test reject?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the filter, the candidate mistakes are easy to name: ignore the filter entirely, treat every missing filter as empty, or treat every empty filter as missing. They correspond to different misunderstandings of the contract. Tests that separate those cases tell us more than several additional examples of paid orders.&lt;/p&gt;

&lt;p&gt;This is also where &lt;a href="https://mutmut.readthedocs.io/en/latest/" rel="noopener noreferrer"&gt;mutation testing&lt;/a&gt; can help: make small changes to the implementation and check whether the suite detects them. Inspect surviving mutations to understand what they change; some are equivalent for the supported inputs. For this fixture, changing &lt;code&gt;statuses is None&lt;/code&gt; to &lt;code&gt;not statuses&lt;/code&gt; is a useful manual mutation because it has a known, observable effect on required behavior.&lt;/p&gt;

&lt;p&gt;For an agent workflow, I would make four changes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write down the expected behavior before reviewing the patch.&lt;/strong&gt; Include the ordinary case, the reported failure, and the neighboring case most likely to be confused with it. Here, &lt;code&gt;None&lt;/code&gt; and &lt;code&gt;[]&lt;/code&gt; belong on separate rows. If the issue leaves that distinction unspecified, get a product decision before turning either interpretation into a test.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Review expected values as carefully as production code.&lt;/strong&gt; An assertion is a claim about the product. Trace that claim to a requirement, an established compatibility promise, or an independently checked example. Copying the current output into an expected value can preserve the exact behavior you meant to question.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep an accepted regression check stable during repair.&lt;/strong&gt; Let the agent change the implementation while a separate runner evaluates it with the reviewed tests. Protect the test command and configuration too: an unchanged test file helps little if the patch can skip its execution. If the test itself is wrong, revise and review it explicitly, then evaluate the candidate again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inspect the failure before asking the agent to fix it.&lt;/strong&gt; An assertion showing the wrong returned orders is actionable behavioral evidence. A missing dependency, an import failure, or a command that selected zero tests needs a different response. Record what ran and why it failed.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ExecCritic separates test creation from repair, qualifies tests on the original repository, and keeps them unchanged during revision. That limits the repairer's ability to change its target. Separate contexts and permissions still cannot guarantee that both agents understood the issue correctly. &lt;a href="https://arxiv.org/html/2609.09133v1#S2" rel="noopener noreferrer"&gt;Paper&lt;/a&gt;; &lt;a href="https://github.com/MSR-Orchard/execcritic" rel="noopener noreferrer"&gt;released implementation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The four steps above are a review procedure you can try in an existing project. They do not require training a model. Their value should be judged by the bugs and mistaken expectations they expose.&lt;/p&gt;

&lt;p&gt;For your next AI-assisted fix, keep the original code, the proposed patch, and the new tests. Identify one plausible alternative implementation that violates the requirement. Run the tests against it.&lt;/p&gt;

&lt;p&gt;If both implementations get the same green result, you have found a specific question the suite still cannot answer. Add the check that separates them, and review its expected result before trusting the next repair.&lt;/p&gt;




&lt;p&gt;If this article helped you, you can &lt;a href="https://ko-fi.com/sergeiparfenov?ref=dev" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt;. Your support helps me make time for the next experiment.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>python</category>
      <category>agents</category>
    </item>
    <item>
      <title>Can Your AI Use What It Remembers?</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Sat, 05 Sep 2026 14:09:59 +0000</pubDate>
      <link>https://dev.to/p0rt/can-your-ai-use-what-it-remembers-57c</link>
      <guid>https://dev.to/p0rt/can-your-ai-use-what-it-remembers-57c</guid>
      <description>&lt;p&gt;An assistant correctly recalls a user's tree-nut allergy. Given a request for macarons, it supplies an almond-flour recipe without applying that allergy to the user.&lt;/p&gt;

&lt;p&gt;This is a recorded example from &lt;a href="https://arxiv.org/html/2607.24368v1#S12" rel="noopener noreferrer"&gt;InMind, a July 2026 study of agent memory&lt;/a&gt;, using xMemory. The evaluations ask two different things: can the system retrieve a fact when the question names it, and can it bring that fact into a decision that needs it?&lt;/p&gt;

&lt;p&gt;The second question is the reason to give an assistant memory in the first place. A user should not need to know which past conversation to reference before every request.&lt;/p&gt;

&lt;p&gt;For a coding agent, the equivalent might be remembering that a service runs in short-lived processes, then proposing an in-process timer for hourly cleanup. That is an illustrative test case, not a result reported in the paper. It has the same useful structure: the current request does not repeat the architectural constraint, but the constraint changes what a correct solution looks like.&lt;/p&gt;

&lt;p&gt;InMind makes that distinction measurable. Its 125 synthetic tasks pair a stored personal fact with a later request whose relevance depends on background knowledge. The authors deliberately remove obvious lexical and semantic retrieval cues. This is a stress test for a particular failure mode, not a sample of everyday assistant traffic.&lt;/p&gt;

&lt;p&gt;For the study's A-Mem configuration with text-embedding-3-large, &lt;a href="https://arxiv.org/html/2607.24368v1#S4.T1" rel="noopener noreferrer"&gt;Table 1&lt;/a&gt; reports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% direct recall:&lt;/strong&gt; a passing score on all 125 questions that directly ask for the stored fact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12% target recall:&lt;/strong&gt; the necessary fact is judged present in the model's context for 15 of the 125 indirect requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;9.6% application:&lt;/strong&gt; the combined memory-and-answer evaluation passes 12 of those 125 requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are separate measurements. The &lt;a href="https://github.com/imlrz/InMind/blob/5a2ab2686d3d5b832575f0288d41ecc93eab358b/evaluation/README.md#standard-protocol" rel="noopener noreferrer"&gt;released evaluation protocol&lt;/a&gt; calls for direct questions and indirect requests to use the same frozen memory state, without letting the first answer supply a hint for the second.&lt;/p&gt;

&lt;p&gt;The application number needs care. Its rubric requires both the personal fact in context and a relevant warning or reminder in the answer. When the authors score only the answer, the same A-Mem configuration reaches &lt;strong&gt;25.6%&lt;/strong&gt;, not 9.6%. A model can produce a useful caution from general knowledge without retrieving anything about this particular user. That answer may be good; it is not evidence that the memory system worked. The paper's &lt;a href="https://arxiv.org/html/2607.24368v1#S14.SS1" rel="noopener noreferrer"&gt;answer-only evaluation&lt;/a&gt; and &lt;a href="https://arxiv.org/html/2607.24368v1#S14.SS2" rel="noopener noreferrer"&gt;human audit&lt;/a&gt; expose exactly this ambiguity.&lt;/p&gt;

&lt;p&gt;The cleanest signal here is the missing fact: direct questions find it, while indirect requests usually do not deliver it to the answerer.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://arxiv.org/html/2607.24368v1#S15.SS7" rel="noopener noreferrer"&gt;A-Mem setup&lt;/a&gt; appends a raw target note to a prebuilt, read-only bank. This tests selection when the fact is available; it does not establish survival through weeks of memory rewriting.&lt;/p&gt;

&lt;p&gt;In a retrieve-then-answer pipeline, the order is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;new request
    → choose memories
    → put selected memories in context
    → generate a response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The selection step must decide what matters before the answerer sees the candidate facts together with the request. If selection misses a constraint, the answerer may produce a perfectly reasonable solution for a different environment.&lt;/p&gt;

&lt;p&gt;This does not mean embeddings cannot encode useful associations, or that an agent cannot discover them through additional searches. It means those capabilities need testing on requests that do not already identify the required memory. Bigger retrieval scores on direct questions do not settle that question.&lt;/p&gt;

&lt;p&gt;Related work already reaches beyond factual recall. &lt;a href="https://arxiv.org/abs/2602.10715" rel="noopener noreferrer"&gt;LoCoMo-Plus&lt;/a&gt; examines whether agents retain and apply implicit conversational constraints. InMind's useful contribution here is its paired diagnosis of stored facts whose relevance requires an unstated knowledge connection. It is not the discovery that memory should affect behavior.&lt;/p&gt;

&lt;p&gt;For a project assistant, I would turn that diagnosis into a small set of regression cases. Start with a requirement whose effect can be checked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stored constraint:
Processes can terminate at any time. Recurring jobs must
continue running even when no web request is active.

Direct question:
What execution constraints does this service have?

Indirect task:
Implement hourly cleanup of expired exports.

Behavior to check:
Does the proposed solution keep recurring execution outside
the lifetime of a single web process?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use independent copies of the same starting state. One receives the direct question. Another receives only the task. A third receives the task with the relevant constraint explicitly included. Keep unrelated context and budgets matched where possible; the explicit-fact condition is an intervention, not an ordinary retrieval result.&lt;/p&gt;

&lt;p&gt;Record the context the model actually received. That gives a failure somewhere to belong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the fact is absent from storage, investigate capture or updates.&lt;/li&gt;
&lt;li&gt;If it exists but does not reach the answerer, investigate selection and context assembly.&lt;/li&gt;
&lt;li&gt;If it reaches the answerer but the implementation violates it, investigate application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Score the implementation separately from memory delivery. A model might choose a durable scheduler without knowing the project's constraint. That can pass the functional test while telling us little about retrieval. Conversely, mentioning the constraint in an explanation should earn no credit if the generated code still relies on a process-local timer.&lt;/p&gt;

&lt;p&gt;The test also needs requests where the constraint should have no effect. A button-label change should not become a lecture about background workers. And it needs a later instruction that legitimately changes the requirement: if recurring execution is explicitly removed from scope, the old rule should not silently override the new task.&lt;/p&gt;

&lt;p&gt;Without those controls, a system that recites every restriction on every turn can look surprisingly competent. InMind itself notes that its rubric does not penalize excessive warnings. That makes it useful for finding missed associations, but insufficient for deciding whether an assistant applies memory appropriately across ordinary work.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://sergei-parfenov.com/assets/downloads/agent-memory-probe.zip" rel="noopener noreferrer"&gt;accompanying probe&lt;/a&gt; contains 12 developer-constraint fixtures and isolated inputs for these conditions. A local BM25 run, returning at most three records, delivered the target fact for &lt;strong&gt;12 of 12 direct questions and 4 of 12 indirect tasks&lt;/strong&gt;. The cases were deliberately written with vocabulary mismatches. This is a transparent illustration of lexical retrieval, not a measurement of a modern agent's memory quality.&lt;/p&gt;

&lt;p&gt;No LLM was run in that probe. Whether a generated implementation follows the constraint remains a separate evaluation. The inputs and behavioral rubrics are included so those checks can be run against an actual agent. InMind's public release also still lacks baseline adapters and paper-aligned per-task results, so the published model scores above are reported findings, not a replication performed for this article.&lt;/p&gt;

&lt;p&gt;Keeping selected constraints visible in every task is one option to test. The engineering problem then moves to which constraints deserve that space, which project or environment they apply to, and when they expire. A remembered fact can be correct and still be irrelevant to the current branch, obsolete after a migration, or superseded by an explicit instruction.&lt;/p&gt;

&lt;p&gt;For an initial implementation, I would keep a small set of active project requirements with an explicit scope, while leaving detailed history searchable. Then I would test both omissions and unnecessary enforcement. That is a design proposal, not a fix established by the paper.&lt;/p&gt;

&lt;p&gt;The benchmark is small and deliberately difficult; GPT-5-mini serves as both answerer and judge, and the human audit found scoring errors. Its numbers do not establish how often a particular production agent will fail. They do establish a question that a direct-recall demo cannot answer.&lt;/p&gt;

&lt;p&gt;Ask the agent what it remembers. Then, from a fresh copy of the same state, ask it to do something that depends on that memory. Check what reached the model, check what it built, and check when the remembered rule should stop applying.&lt;/p&gt;

&lt;p&gt;The useful promise of memory is that you can stop repeating yourself.&lt;/p&gt;

&lt;p&gt;That is the promise the test should measure.&lt;/p&gt;




&lt;p&gt;Sources: Ruizhe Li, Mingxuan Du, Benfeng Xu, and Zhendong Mao, &lt;a href="https://arxiv.org/html/2607.24368v1" rel="noopener noreferrer"&gt;Keep It InMind, v1, July 27, 2026&lt;/a&gt; (CC BY 4.0); &lt;a href="https://github.com/imlrz/InMind" rel="noopener noreferrer"&gt;InMind repository&lt;/a&gt;; Yifei Li et al., &lt;a href="https://arxiv.org/abs/2602.10715" rel="noopener noreferrer"&gt;LoCoMo-Plus, February 11, 2026&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;If this article helped you, you can &lt;a href="https://ko-fi.com/sergeiparfenov?ref=dev" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt;. Your support helps me make time for the next experiment.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>The Agent Knew It Was Wrong. The System Let It Ship</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Tue, 01 Sep 2026 17:49:00 +0000</pubDate>
      <link>https://dev.to/p0rt/the-agent-knew-it-was-wrong-the-system-let-it-ship-dgp</link>
      <guid>https://dev.to/p0rt/the-agent-knew-it-was-wrong-the-system-let-it-ship-dgp</guid>
      <description>&lt;p&gt;In 660 of 800 autonomous research runs, the agent found a serious flaw in its own work.&lt;/p&gt;

&lt;p&gt;It wrote the flaw down.&lt;/p&gt;

&lt;p&gt;Then it delivered the report anyway.&lt;/p&gt;

&lt;p&gt;The model did not fail to notice.&lt;/p&gt;

&lt;p&gt;The system failed to make noticing consequential.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AutoResearchEval labeled 82.5% of its 800 trajectories with “uncorrected self-awareness”: the agent identified a critical flaw, then continued without fixing or gating it&lt;/li&gt;
&lt;li&gt;A separate abstention benchmark found agents sometimes performed an irreversible action and only then claimed they had refused&lt;/li&gt;
&lt;li&gt;In a 3,621-trial policy study, an output reviewer ran after exposure and backend effects; moving enforcement to the tool boundary cut trace failures from 57.6% to 0.2% in the primary comparison&lt;/li&gt;
&lt;li&gt;A review that cannot change execution state is observability, not control&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The failure was not awareness
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2608.14905" rel="noopener noreferrer"&gt;AutoResearchEval&lt;/a&gt; took 100 research tasks across seven scientific domains and ran each through eight harness–model combinations.&lt;/p&gt;

&lt;p&gt;The result was 800 complete trajectories, roughly 73,000 tool calls, and an average of 92.3 steps per run. The evaluator inspected the reports, code, generated data, retrieval logs, and execution artifacts rather than scoring only the final answer.&lt;/p&gt;

&lt;p&gt;Its most common failure pattern was not hallucination.&lt;/p&gt;

&lt;p&gt;It was &lt;strong&gt;uncorrected self-awareness&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Trajectories&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Uncorrected self-awareness&lt;/td&gt;
&lt;td&gt;660 / 800&lt;/td&gt;
&lt;td&gt;The agent identified a fatal or critical flaw and made no consequential correction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Method–conclusion disconnect&lt;/td&gt;
&lt;td&gt;620 / 800&lt;/td&gt;
&lt;td&gt;The written conclusion was not supported by the method actually executed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure to gate critical flaws&lt;/td&gt;
&lt;td&gt;502 / 800&lt;/td&gt;
&lt;td&gt;A critical issue was recorded but did not block delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report–trace gap&lt;/td&gt;
&lt;td&gt;484 / 800&lt;/td&gt;
&lt;td&gt;Claims could not be traced to the code, data, or logs produced in the same run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Those categories overlap. They are not four independent populations and should not be added together.&lt;/p&gt;

&lt;p&gt;The useful part is the shape of the failure.&lt;/p&gt;

&lt;p&gt;The evidence was already inside the trajectory. The agent had the report, the code, the logs, and—in 660 cases—a written recognition that something was seriously wrong.&lt;/p&gt;

&lt;p&gt;Nothing in the execution loop required that recognition to change the result.&lt;/p&gt;

&lt;p&gt;We keep describing this as a reasoning problem because the visible artifact is text. The agent writes a bad answer, then writes a good critique of the bad answer, so the system appears to contain both failure and correction.&lt;/p&gt;

&lt;p&gt;But correction is not a paragraph.&lt;/p&gt;

&lt;p&gt;Correction is a state transition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RUNNING → REVIEW_REQUIRED → BLOCKED → REMEDIATED → COMMITTABLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If “this result is invalid” and “publish this result” can both be true in the same system state, the review stage is decorative.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-review is usually just another generation
&lt;/h2&gt;

&lt;p&gt;A common agent loop looks approximately like this:&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="n"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;worker&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="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;review&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;review&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;revise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;review&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;final&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can improve an answer. It can also produce a more articulate failure.&lt;/p&gt;

&lt;p&gt;The same probabilistic system proposes the work, selects the evidence, interprets the evidence, judges itself, and decides whether the judgment matters. The review has no independent authority and frequently no independent source of truth.&lt;/p&gt;

&lt;p&gt;Even adding a second model does not automatically fix that. Two actors are not two control planes if both operate inside the same mutable context and either can still call the production tool.&lt;/p&gt;

&lt;p&gt;The distinction I would make is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A reviewer produces a judgment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A gate changes what the system is allowed to do&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first is information.&lt;/p&gt;

&lt;p&gt;The second is authority.&lt;/p&gt;

&lt;p&gt;I call the distance between them the &lt;strong&gt;review-to-effect gap&lt;/strong&gt;: the part of the pipeline between detecting a problem and the final point where the system can still prevent an externally visible result.&lt;/p&gt;

&lt;p&gt;The wider that gap, the easier it is for a correct diagnosis to become an irrelevant log entry.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent refused after it acted
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2607.10059" rel="noopener noreferrer"&gt;AgentAbstain&lt;/a&gt; tested 17 frontier models in four agent harnesses on 263 paired tasks across 42 executable sandbox environments.&lt;/p&gt;

&lt;p&gt;Each pair contained a normal task and a minimally changed version where the correct behavior was to stop. The best tested agent achieved 59.5% paired accuracy: it correctly handled both the act and abstain sides in fewer than three out of five pairs.&lt;/p&gt;

&lt;p&gt;The paper also separated what the agent &lt;strong&gt;said&lt;/strong&gt; from what it &lt;strong&gt;did&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In 115 trajectories, 2.6% of the aggregate abstention-run breakdown, the agent crossed an irreversible action boundary and then verbally claimed restraint. The authors call this &lt;strong&gt;post-hoc abstention&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Their sandbox examples included agents canceling a flight before noticing conflicting rebooking constraints and submitting unauthorized simulated bank transfers after acknowledging that a required verifier was unavailable.&lt;/p&gt;

&lt;p&gt;The final message could say “I cannot proceed.”&lt;/p&gt;

&lt;p&gt;The tool trace said it already had.&lt;/p&gt;

&lt;p&gt;This is the same structural failure as the research report. The model discovers the trigger, generates the correct language, and reaches that language after the effect boundary has been crossed.&lt;/p&gt;

&lt;p&gt;An apology is not a rollback.&lt;/p&gt;

&lt;p&gt;A refusal is not a refusal if the transaction log contains a commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reviewer arrived after the side effect
&lt;/h2&gt;

&lt;p&gt;The clearest timing experiment I found is &lt;a href="https://arxiv.org/abs/2608.27646" rel="noopener noreferrer"&gt;Out-of-Band Policy Enforcement at a Trusted Tool Boundary&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The authors ran 3,621 trials against controlled Jira and ServiceNow mocks. Their trace-level failure definition included any of three events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;protected data entered model context&lt;/li&gt;
&lt;li&gt;an exact protected value appeared in the answer&lt;/li&gt;
&lt;li&gt;a forbidden backend effect completed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Detailed prompt rules alone still produced a 57.6% trace-failure rate in the primary comparison. Adding an enforcement boundary between the agent and the backend reduced it to 0.2%.&lt;/p&gt;

&lt;p&gt;The paper then compared two mechanisms directly on Claude Sonnet 4.6.&lt;/p&gt;

&lt;p&gt;One left the tool path untouched and asked a fixed reviewer model to pass or replace every assistant message. The other mediated the request before dispatch and the response before it re-entered agent context.&lt;/p&gt;

&lt;p&gt;The output-review arm had a 58.6% deterministic trace-failure rate and 19.7% safe-useful completion.&lt;/p&gt;

&lt;p&gt;The full boundary had 0.0% trace failure in that arm and 63.0% safe-useful completion.&lt;/p&gt;

&lt;p&gt;The reviewer also required 930 additional model calls.&lt;/p&gt;

&lt;p&gt;The important result is not that one reviewer prompt was weak. The paper explicitly says this is one mechanism comparison, not a ranking of every possible guardrail.&lt;/p&gt;

&lt;p&gt;The important result is that the reviewer saw the assistant message &lt;strong&gt;after the tools had returned&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It could suppress unsafe text.&lt;/p&gt;

&lt;p&gt;It could not remove data already placed in context.&lt;/p&gt;

&lt;p&gt;It could not undo a backend mutation.&lt;/p&gt;

&lt;p&gt;A post-output safety filter is a censor. It is not a transaction boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review before dispatch helps — but it is still probabilistic
&lt;/h2&gt;

&lt;p&gt;Moving the reviewer earlier is useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2604.27233" rel="noopener noreferrer"&gt;Reinforced Agent&lt;/a&gt; puts a specialized reviewer in front of provisional tool calls. The call is reviewed before execution, and the worker can revise it before anything changes outside the agent.&lt;/p&gt;

&lt;p&gt;That architecture improved the reported tool-calling benchmarks. It also exposed the reviewer’s own failure rate.&lt;/p&gt;

&lt;p&gt;With o3-mini as reviewer, 36.8% of base-agent errors were corrected while 11.7% of previously correct cases were damaged. The reported benefit-to-risk ratio was 3.1 to 1.&lt;/p&gt;

&lt;p&gt;That is a useful component.&lt;/p&gt;

&lt;p&gt;It is not a proof boundary.&lt;/p&gt;

&lt;p&gt;A model reviewer is good for semantic questions that deterministic code cannot answer cheaply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this action satisfy the user’s actual intent&lt;/li&gt;
&lt;li&gt;Is the evidence sufficient for this conclusion&lt;/li&gt;
&lt;li&gt;Does the requested operation conflict with a policy expressed in natural language&lt;/li&gt;
&lt;li&gt;Is the proposed scope disproportionate to the task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It should not be the only thing standing between a stochastic plan and production credentials.&lt;/p&gt;

&lt;p&gt;The reviewer may recommend &lt;code&gt;ALLOW&lt;/code&gt;, &lt;code&gt;HOLD&lt;/code&gt;, or &lt;code&gt;DENY&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The trusted boundary must decide whether a valid capability exists for the exact operation about to execute.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture I would ship
&lt;/h2&gt;

&lt;p&gt;The planner, reviewer, policy engine, and effect adapter have different jobs. Collapsing them into one “agent” object hides the boundary that matters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UNTRUSTED DECISION PLANE

user intent
    ↓
planner
    ↓
proposed action + evidence bundle
    ↓
semantic reviewer

TRUSTED CONTROL PLANE

schema and invariant checks
    ↓
policy and authorization decision
    ↓
exact action manifest
    ↓
short-lived commit capability

EFFECT PLANE

effect adapter holding credentials
    ↓
provider commit
    ↓
terminal receipt or durable uncertainty state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;“Untrusted” here does not mean malicious. It means &lt;strong&gt;non-authoritative&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The planner may be brilliant. The reviewer may be more capable than the planner. Neither should be able to convert its own text directly into an authenticated side effect.&lt;/p&gt;

&lt;p&gt;The effect adapter should accept something closer to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proposal_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"refund_0184"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payments.refund"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payment_intent:pi_7F..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:9fa..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:1bd..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policy_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"refunds@7.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provider_state_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"captured@2026-09-01T10:42:18Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"review"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"risk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reason_codes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"amount_within_limit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"recipient_verified"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"commit_capability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cap_opaque_single_use"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The adapter then verifies the hashes, policy version, current provider state, capability scope, expiry, and single-use status before it calls the provider.&lt;/p&gt;

&lt;p&gt;The natural-language conversation is evidence for constructing the manifest.&lt;/p&gt;

&lt;p&gt;It is not the manifest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five invariants that turn review into control
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1 Critical findings must change system state
&lt;/h3&gt;

&lt;p&gt;A critical finding cannot coexist with a committable action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;review.severity == critical
    ⇒ run.state == BLOCKED
    ⇒ commit_capability == null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not rely on the worker to “take the feedback into account.” Make remediation create a new proposal and a new review record.&lt;/p&gt;

&lt;h3&gt;
  
  
  2 Approval must bind the exact action
&lt;/h3&gt;

&lt;p&gt;“Refund the customer” is not sufficient authorization.&lt;/p&gt;

&lt;p&gt;The gate should bind the operation, acting identity, resource, arguments, evidence version, policy version, and relevant external state. If any bound field changes, the old approval is invalid.&lt;/p&gt;

&lt;h3&gt;
  
  
  3 The credential holder must sit below the gate
&lt;/h3&gt;

&lt;p&gt;The worker and reviewer should not hold direct production credentials.&lt;/p&gt;

&lt;p&gt;Otherwise the controlled path is optional. An agent that can bypass the gateway eventually will—through a bug, a fallback, an alternate connector, or a tool call the policy layer never saw.&lt;/p&gt;

&lt;h3&gt;
  
  
  4 Uncertain delivery must not mint fresh authority
&lt;/h3&gt;

&lt;p&gt;A timeout does not mean no effect occurred.&lt;/p&gt;

&lt;p&gt;If the provider may have committed but the response was lost, the original authorization must remain occupied until reconciliation reaches a terminal result. Creating a fresh approval for a blind retry can turn one user decision into two external effects.&lt;/p&gt;

&lt;h3&gt;
  
  
  5 The final answer must be generated from the effect receipt
&lt;/h3&gt;

&lt;p&gt;Do not let the agent report operational state from memory.&lt;/p&gt;

&lt;p&gt;The user-facing response should be projected from the durable provider result or uncertainty record. That makes “I refused” impossible when the effect ledger says “committed.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The gate has to survive retries and recovery
&lt;/h2&gt;

&lt;p&gt;Admission is only the start of authority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2608.21159" rel="noopener noreferrer"&gt;AID-Guard&lt;/a&gt; frames the remaining problem as &lt;strong&gt;authorization-to-effect closure&lt;/strong&gt;. It revalidates the exact approved request and provider state at commit, keeps the original reservation while delivery is ambiguous, and permits release or one successor only after terminal evidence or certified no effect.&lt;/p&gt;

&lt;p&gt;Its target invariant is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;one approval lineage → at most one provider effect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the paper’s bounded evaluation, all 210 Stripe test-mode provider-contract trials matched their declared outcomes, and the tested recovery and confirm/cancel schedules produced no duplicate effect.&lt;/p&gt;

&lt;p&gt;That is not a universal exactly-once guarantee. The authors used bounded provider schedules, test-mode contracts, synthetic credentials, and a high-latency prototype. Their strict exact-manifest profile also reduced benign utility substantially.&lt;/p&gt;

&lt;p&gt;But the architecture names a production bug most agent diagrams skip:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Retry and recovery are authority transitions, not transport details&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A gate that protects the first call but disappears during timeout recovery is not end-to-end enforcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What these numbers do not prove
&lt;/h2&gt;

&lt;p&gt;I am not claiming that 82.5% of all production agents knowingly ship invalid work.&lt;/p&gt;

&lt;p&gt;That number is the label rate for one new prerelease dataset of autonomous scientific-research trajectories. Most of its 800 annotations were produced by an artifact-aware agent judge calibrated against 50 human-labeled trajectories. The paper found the pattern across all eight tested systems, but it did not test the orchestration intervention I am proposing.&lt;/p&gt;

&lt;p&gt;AgentAbstain uses generated tasks in executable sandboxes. Its post-hoc abstention rate is a benchmark result, not an estimate of real banking or travel incidents.&lt;/p&gt;

&lt;p&gt;The policy-boundary study used controlled Jira and ServiceNow mocks and intentionally concentrated on cases where policy should intervene. Its 0.2% headline is conditional effectiveness inside that test design, not a promise for arbitrary production traffic. Durable approval and broad write controls were outside its primary evaluation.&lt;/p&gt;

&lt;p&gt;AID-Guard tested finite provider schedules and does not establish arbitrary provider linearizability.&lt;/p&gt;

&lt;p&gt;What survives those caveats is the mechanism.&lt;/p&gt;

&lt;p&gt;Across research reports, abstention tasks, data exposure, and state-changing tools, the same failure appears:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The system detects the problem&lt;/li&gt;
&lt;li&gt;The detection is represented as text&lt;/li&gt;
&lt;li&gt;The text has no binding relationship to the effect path&lt;/li&gt;
&lt;li&gt;The effect proceeds or has already happened&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is not a missing sentence in the system prompt.&lt;/p&gt;

&lt;p&gt;It is a missing control boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next boundary
&lt;/h2&gt;

&lt;p&gt;My last article asked who owns the harness.&lt;/p&gt;

&lt;p&gt;This one asks who owns the commit.&lt;/p&gt;

&lt;p&gt;The model can propose an action. It can criticize the action. It can explain exactly why the action is unsafe and still take it, because awareness and authority are different capabilities.&lt;/p&gt;

&lt;p&gt;A review that cannot block the effect is not a control.&lt;/p&gt;

&lt;p&gt;It is a log entry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What in your agent stack can actually stop the commit—and does it run before or after the side effect?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2608.14905" rel="noopener noreferrer"&gt;How Do Agents Fail on AutoResearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2607.10059" rel="noopener noreferrer"&gt;AgentAbstain — Do LLM Agents Know When Not to Act&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2608.27646" rel="noopener noreferrer"&gt;Out-of-Band Policy Enforcement at a Trusted Tool Boundary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2604.27233" rel="noopener noreferrer"&gt;Reinforced Agent — Inference-Time Feedback for Tool-Calling Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2608.21159" rel="noopener noreferrer"&gt;AID-Guard — Stateful Authorization for Delegated Agent Effects&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I wrote the original drafts in my native language and conducted the research, source selection, analysis, and conclusions myself. AI was used only for translation and English-language editing.&lt;/p&gt;




&lt;p&gt;If this article helped you, you can &lt;a href="https://ko-fi.com/sergeiparfenov?ref=dev" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt;. Your support helps me make time for the next experiment.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>mlops</category>
    </item>
    <item>
      <title>Your Agent Planned the Right Tools. It Still Crashed the Machine.</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Wed, 26 Aug 2026 13:51:56 +0000</pubDate>
      <link>https://dev.to/p0rt/your-agent-planned-the-right-tools-it-still-crashed-the-machine-58hf</link>
      <guid>https://dev.to/p0rt/your-agent-planned-the-right-tools-it-still-crashed-the-machine-58hf</guid>
      <description>&lt;p&gt;Your agent needs four independent facts before it can approve a refund:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the order record,&lt;/li&gt;
&lt;li&gt;the fraud score,&lt;/li&gt;
&lt;li&gt;the customer's history,&lt;/li&gt;
&lt;li&gt;the policy that applies.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It correctly sees that all four calls can run in parallel.&lt;/p&gt;

&lt;p&gt;So it launches all four.&lt;/p&gt;

&lt;p&gt;The order lookup is cheap. The policy search is cheap. The fraud model loads a large checkpoint. The history job scans two years of events. Together they cross the worker's memory limit, the container restarts, and the refund never happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The plan was correct. The execution was not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most agent benchmarks collapse those into one score.&lt;/p&gt;

&lt;p&gt;A new preprint submitted on August 25, &lt;a href="https://arxiv.org/abs/2608.24509" rel="noopener noreferrer"&gt;PeakBench&lt;/a&gt;, argues that this hides an entire class of production failures: the agent may understand every dependency and still overload the machine that executes them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A dependency graph tells you what &lt;em&gt;may&lt;/em&gt; run in parallel. It does not tell you what your machine can run safely.&lt;/li&gt;
&lt;li&gt;Across eight tested models, planning accuracy had almost zero correlation with capacity violations on the same workflows.&lt;/li&gt;
&lt;li&gt;Resource metadata helped, but model-generated schedules were not reliably safe for every model.&lt;/li&gt;
&lt;li&gt;In production, let the model build the DAG. Let deterministic infrastructure enforce the resource envelope.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The DAG is not the schedule
&lt;/h2&gt;

&lt;p&gt;If step C needs the output of step A, C waits. If A and B are independent, the framework can run them concurrently.&lt;/p&gt;

&lt;p&gt;That is a logical property. It says what &lt;em&gt;may&lt;/em&gt; run at the same time.&lt;/p&gt;

&lt;p&gt;It says nothing about what the machine can survive.&lt;/p&gt;

&lt;p&gt;Two independent calls might each need 6 GB of memory on an 8 GB worker. Four browser sessions might fit logically but exceed a provider concurrency limit. Ten embedding jobs may be valid in parallel and still saturate their shared network connection.&lt;/p&gt;

&lt;p&gt;PeakBench calls this the peak-load problem: runtimes translate logical independence into immediate execution while implicitly assuming infinite capacity.&lt;/p&gt;

&lt;p&gt;When that assumption stays hidden, a crash gets blamed on “the agent.” The benchmark cannot tell you whether the failure came from reasoning, scheduling, or infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What PeakBench separates
&lt;/h2&gt;

&lt;p&gt;The authors assembled roughly 1,200 MCP-compatible tools from about 130 servers and constructed 300 executable workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;150 easy,&lt;/li&gt;
&lt;li&gt;100 medium,&lt;/li&gt;
&lt;li&gt;50 hard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The workflows run inside containers. The benchmark records data flow, perturbs execution order, and watches for failures. This produces an execution-grounded dependency graph instead of relying only on an annotator's guess.&lt;/p&gt;

&lt;p&gt;In a manual audit of about 100 workflows, 94% of those graphs matched the auditors' optimal structure.&lt;/p&gt;

&lt;p&gt;PeakBench then scores two jobs independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Logical planning
&lt;/h3&gt;

&lt;p&gt;The model receives the task and tool descriptions. It must recover which calls are prerequisites and which may run concurrently.&lt;/p&gt;

&lt;p&gt;The benchmark reports graph edit distance and edge F1.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Physical scheduling
&lt;/h3&gt;

&lt;p&gt;The model receives the &lt;em&gt;verified&lt;/em&gt; dependency graph, so planning ambiguity is removed. It only has to assign start times under small, medium, and large machine profiles.&lt;/p&gt;

&lt;p&gt;The schedule is scored on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;completion time,&lt;/li&gt;
&lt;li&gt;capacity violation area: how badly, and for how long, the schedule exceeds a resource limit,&lt;/li&gt;
&lt;li&gt;strict mean resource utilization: utilization that counts only while the schedule remains feasible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That split is the useful contribution. A failed run no longer has to disappear into one end-to-end number.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result that matters
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2608.24509" rel="noopener noreferrer"&gt;PeakBench evaluated eight models&lt;/a&gt; under one prompting and parsing protocol: GPT-5, o3, GPT-4.1, Claude Sonnet 4.6, GLM-5, Kimi-K2.5, DeepSeek-V4-Pro, and DeepSeek-V4-Flash.&lt;/p&gt;

&lt;p&gt;GPT-5 was the strongest logical planner in the reported table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Graph edit distance:&lt;/strong&gt; 0.42&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge F1:&lt;/strong&gt; 0.839&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacity violation area:&lt;/strong&gt; 3.698 for its resource-blind schedule&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DeepSeek-V4-Flash recovered the graph less accurately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Graph edit distance:&lt;/strong&gt; 0.81&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge F1:&lt;/strong&gt; 0.733&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacity violation area:&lt;/strong&gt; 3.458 once given the verified graph&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That comparison is not a model ranking. The case-level result is more important.&lt;/p&gt;

&lt;p&gt;Across all eight models, the correlation between edge F1 and capacity violations was almost zero. The reported coefficients ranged from roughly &lt;strong&gt;-0.045 to 0.000&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A model understanding a workflow's dependencies told you almost nothing about whether it would schedule that same workflow safely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your planner benchmark is not a scheduler benchmark.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resource data helped. It did not solve scheduling.
&lt;/h2&gt;

&lt;p&gt;The authors added a Resource-Aware Scheduling Context, or RASC. For each tool call, the model sees estimated duration, average and peak CPU, peak memory, machine capacity, and verified dependencies.&lt;/p&gt;

&lt;p&gt;No weights change. The model simply stops scheduling blind.&lt;/p&gt;

&lt;p&gt;The aggregate trade-off is easier to read without a wide table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Launch everything ASAP:&lt;/strong&gt; 8.62 s completion, 5.865 violation area, 0.080 safe utilization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run everything serially:&lt;/strong&gt; 15.19 s, 2.925 violation area, 0.097 safe utilization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best rule-based scheduler:&lt;/strong&gt; 9.13 s, 2.925 violation area, 0.141 safe utilization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best RASC result:&lt;/strong&gt; 9.11 s, 2.938 violation area, 0.165 safe utilization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blind parallelism was fastest and most dangerous. Serial execution reduced overload by paying almost twice the latency. Resource-aware context nearly matched the best rule-based violation score while producing higher safe utilization.&lt;/p&gt;

&lt;p&gt;But the effect was model-dependent. RASC improved most models, not all. DeepSeek-V4-Flash slightly increased its violation area. Kimi-K2.5 and GPT-4.1 lost strict utilization even while finishing faster.&lt;/p&gt;

&lt;p&gt;Resource metadata is necessary input. It is not an admission controller.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would change in production
&lt;/h2&gt;

&lt;p&gt;The tempting fix is another system-prompt sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be careful with resources.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not an architecture.&lt;/p&gt;

&lt;p&gt;I would make three artifacts explicit.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The planner emits a dependency graph
&lt;/h3&gt;

&lt;p&gt;The planner decides which outputs are required and which calls are logically independent. It should not decide that every ready call starts now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fraud"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"history"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"fraud"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"history"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"policy"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. A scheduler owns physical execution
&lt;/h3&gt;

&lt;p&gt;Give every tool a versioned resource profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fraud_score@3.4.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"duration_p95_s"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cpu_peak_cores"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"memory_peak_mb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6144&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"network_slots"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provider_concurrency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then enforce the envelope outside the model with queues, per-resource semaphores, rate-limit budgets, and backpressure.&lt;/p&gt;

&lt;p&gt;The model may propose a schedule. Deterministic infrastructure should decide whether it is allowed to run.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The trace records what actually ran
&lt;/h3&gt;

&lt;p&gt;A configured concurrency limit of four does not prove that an SDK did not add three hidden retries inside one call.&lt;/p&gt;

&lt;p&gt;For every attempt, record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requested and actual start time,&lt;/li&gt;
&lt;li&gt;queue delay,&lt;/li&gt;
&lt;li&gt;resource-profile version,&lt;/li&gt;
&lt;li&gt;observed peak resources,&lt;/li&gt;
&lt;li&gt;retry and fallback attempts,&lt;/li&gt;
&lt;li&gt;the dependency state that made the call eligible,&lt;/li&gt;
&lt;li&gt;the limiter or scheduler decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that trace, a passing benchmark tells you what the agent intended to do, not what the runtime did.&lt;/p&gt;

&lt;h2&gt;
  
  
  A production drill you can run this week
&lt;/h2&gt;

&lt;p&gt;This is not a reproduction of PeakBench. It is a smaller test for your own runtime.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick one real workflow with at least two expensive independent calls.&lt;/li&gt;
&lt;li&gt;Capture each tool's p95 duration, peak memory, peak CPU, and external concurrency limits.&lt;/li&gt;
&lt;li&gt;Run the same workflow under three envelopes:

&lt;ul&gt;
&lt;li&gt;normal production capacity,&lt;/li&gt;
&lt;li&gt;degraded or burst-constrained capacity,&lt;/li&gt;
&lt;li&gt;a generous diagnostic capacity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Compare three policies:

&lt;ul&gt;
&lt;li&gt;launch every ready call,&lt;/li&gt;
&lt;li&gt;serialize every call,&lt;/li&gt;
&lt;li&gt;enforce a resource-aware queue.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Report task correctness and resource feasibility separately.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A correct answer that violates the capacity envelope is not a pass. A safe schedule that serializes everything is not automatically good either.&lt;/p&gt;

&lt;p&gt;The goal is maximum &lt;em&gt;safe&lt;/em&gt; parallelism.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the comments mattered
&lt;/h2&gt;

&lt;p&gt;Comments on my previous harness article kept returning to the same missing fields: publish the action budget, retry policy, and actual route taken, not only the model and final score.&lt;/p&gt;

&lt;p&gt;PeakBench made the operational half of that argument measurable.&lt;/p&gt;

&lt;p&gt;That comment signal helped identify the question. It is not the evidence for the answer; the benchmark is.&lt;/p&gt;

&lt;p&gt;An agent run is defined not only by the model, prompt, tools, and dependency graph. It is also defined by the machine profile and the scheduler that turns readiness into execution.&lt;/p&gt;

&lt;p&gt;If those fields are absent, a successful plan can still become an outage—and the model will get blamed for a failure the runtime created.&lt;/p&gt;

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

&lt;p&gt;PeakBench is a version-one preprint. Its workflows are synthesized, its capacity profiles are simulated, and the reported results should not be treated as measurements of your cluster.&lt;/p&gt;

&lt;p&gt;The benchmark is best read as a diagnostic: it shows that logical planning and physical scheduling can fail independently. The exact numbers still need validation against real production traces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources &amp;amp; further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2608.24509" rel="noopener noreferrer"&gt;PeakBench paper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Czzzk/Staggering-the-Peaks" rel="noopener noreferrer"&gt;PeakBench code repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If this article helped you, you can &lt;a href="https://ko-fi.com/sergeiparfenov?ref=dev" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt;. Your support helps me make time for the next experiment.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>devops</category>
      <category>mlops</category>
    </item>
    <item>
      <title>The Model Scored 30%. The Harness Scored 100%. Which One Did You Benchmark?</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Mon, 24 Aug 2026 13:38:40 +0000</pubDate>
      <link>https://dev.to/p0rt/the-model-scored-30-the-harness-scored-100-which-one-did-you-benchmark-3mp4</link>
      <guid>https://dev.to/p0rt/the-model-scored-30-the-harness-scored-100-which-one-did-you-benchmark-3mp4</guid>
      <description>&lt;p&gt;On July 24, ARC Prize verified Claude Opus 5 at 30.16% on the ARC-AGI-3 public set. On August 21, NVIDIA reported the same model at 100.00 on the same set. The weights did not change. The code around them did.&lt;/p&gt;

&lt;p&gt;In between, MIT did the same thing (August 5), a group led by Impossible Research got to 98.98 (July 15), and OpenAI tripled GPT-5.6 Sol's score by flipping two API settings (July 29). Then Microsoft published a framework that trains the model &lt;em&gt;through&lt;/em&gt; the harness (August 18), and Google published one that gives the environment a harness of its own (August 20).&lt;/p&gt;

&lt;p&gt;In July I wrote that self-editing harnesses have a provenance problem. This month the problem moved up a level: the benchmark score itself has no provenance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; On ARC-AGI-3's public set, the spread between "model in the official harness" and "model in the best harness" is 25 to 70 points, on a benchmark designed to resist exactly this. None of the 100s are verified on the private set, and every author says so. Microsoft's Agent Lightning v1.0 runs RL with the deploy-time harness owning the loop, so the harness is becoming part of the weights, and its reward-hacking section is the checklist my July post warned about. A benchmark number without a harness version, memory state and action budget attached is a self-reported claim with an unmarked type. Unmarked means self-reported.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Five harnesses, one public set
&lt;/h2&gt;

&lt;p&gt;ARC-AGI-3 scores agents with RHAE (Relative Human Action Efficiency). Per level, &lt;code&gt;score = (human_baseline_actions / ai_actions)^2&lt;/code&gt;, with the ratio capped at 1.15x the human baseline. Game scores are level-weighted averages, you must finish the last level to get full credit, and the overall number is the mean over games. A 100.00 means the agent finished every level at least as efficiently as a first-time human.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Harness&lt;/th&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Public RHAE&lt;/th&gt;
&lt;th&gt;Actions&lt;/th&gt;
&lt;th&gt;Verified by ARC Prize&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Official ARC Prize harness&lt;/td&gt;
&lt;td&gt;ARC Prize&lt;/td&gt;
&lt;td&gt;Jul 24&lt;/td&gt;
&lt;td&gt;Claude Opus 5 (high)&lt;/td&gt;
&lt;td&gt;30.16%&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official harness, default settings&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Jul 29&lt;/td&gt;
&lt;td&gt;GPT-5.6 Sol (max)&lt;/td&gt;
&lt;td&gt;13.3%&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official harness + retained reasoning + compaction&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Jul 29&lt;/td&gt;
&lt;td&gt;GPT-5.6 Sol (max)&lt;/td&gt;
&lt;td&gt;38.3%&lt;/td&gt;
&lt;td&gt;6x fewer output tokens&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;Impossible Research (+ UC Berkeley, CMU)&lt;/td&gt;
&lt;td&gt;Jul 15&lt;/td&gt;
&lt;td&gt;Opus 4.8 / Fable 5&lt;/td&gt;
&lt;td&gt;98.98&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VISTA&lt;/td&gt;
&lt;td&gt;MIT (Han, Hu, Qiu, Wu, He)&lt;/td&gt;
&lt;td&gt;Aug 5&lt;/td&gt;
&lt;td&gt;Claude Opus 5&lt;/td&gt;
&lt;td&gt;100.00&lt;/td&gt;
&lt;td&gt;7,542 (humans: 17,135)&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVO&lt;/td&gt;
&lt;td&gt;NVIDIA&lt;/td&gt;
&lt;td&gt;Aug 21&lt;/td&gt;
&lt;td&gt;Claude Opus 5&lt;/td&gt;
&lt;td&gt;100.00&lt;/td&gt;
&lt;td&gt;6,624&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The number that matters is not in the table. It is the gap between the first row and the last: 70 points, same model, same 25 games, same metric.&lt;/p&gt;

&lt;p&gt;The official harness is not a neutral baseline. OpenAI's write-up quotes ARC's intent: an "intentionally generic harness, without tools or special features" built to make "model shortcomings more visible." In practice it discarded all private reasoning after each game action and used a rolling truncation window, so older actions vanished as history grew. Retaining reasoning and enabling compaction took Sol from 13.3% to 38.3% and cut output tokens by 6x. The harness was wiping the model's mind between moves.&lt;/p&gt;

&lt;p&gt;So the leaderboard measures "model plus a harness built to expose the model." The 100s measure "model plus a harness built to cover for the model." Neither measures the model, and nobody has isolated which part of the 70 points is which.&lt;/p&gt;

&lt;p&gt;The authors are unusually honest about this. NVIDIA: the AVO-versus-VISTA comparison "should not be interpreted as a controlled ablation," and the results "should not be interpreted as a direct measurement of the performance contribution of AVO." VISTA: the models "were released after the public ARC-AGI-3 games," overlap cannot be excluded, and "the private set remains the real test of generalization." Schema: "no frozen-harness or held-out-performance claim." Every 100 on that table is a public-set number on games the models may have seen in training.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the 70 points are made of
&lt;/h2&gt;

&lt;p&gt;Read the harness papers side by side and the same three components appear under different names.&lt;/p&gt;

&lt;p&gt;Memory. VISTA keeps a "lossless visual memory" of every past observation. AVO carries forward "prior implementations, evaluation results, compiler and profiler outputs, and accumulated reasoning." OpenAI's two settings are memory settings: keep the reasoning, compact instead of truncate.&lt;/p&gt;

&lt;p&gt;Supervision. AVO runs a monitor that watches "the broader trajectory for stagnation or repeated unproductive cycles and can redirect the main agent." That is the layer that turns a model that gives up into an agent that does not.&lt;/p&gt;

&lt;p&gt;An action budget. RHAE squares the efficiency ratio, so wasted moves are punished quadratically. AVO's headline against VISTA is 12% fewer actions. That is a harness optimization target, not a model property.&lt;/p&gt;

&lt;p&gt;In July I split harness work into two piles: compensatory layers that patch what the model cannot do yet, and protective layers that constrain what it must not do. I predicted pile one depreciates with every model release. All three components above are pile one, and on a benchmark built to resist static tricks they are currently worth 25 to 70 points with the newest frontier models. Either my prediction is early or it is wrong about magnitude. I will take the second reading until the private-set numbers say otherwise.&lt;/p&gt;

&lt;p&gt;One more thing about compaction, since it is the setting that tripled OpenAI's score. In my preregistered compaction experiment, the same operation produced 3.47% false proceeds on irreversible-action gates: the agent went through a gate it should have stopped at, because the compacted context no longer carried the provenance the gate depended on. Not a contradiction. ARC-AGI-3 scores task completion; my gates scored whether the agent still knew &lt;em&gt;why&lt;/em&gt; it was allowed to act. Compaction improves the first, degrades the second, and a benchmark only sees the first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then Microsoft put the harness inside the training loop
&lt;/h2&gt;

&lt;p&gt;Agent Lightning v1.0 (arXiv, August 18) names something the July thread never got to: RL where the harness is not a bystander. In their words, "the harness owns this loop, while the training engine observes only a sequence of LLM request-response pairs." The deploy-time scaffold (mini-SWE-agent in their coding runs) executes the task inside Kubernetes; the trainer sits behind a gateway that looks like a normal LLM endpoint and collects the traffic.&lt;/p&gt;

&lt;p&gt;The result is real: Qwen3.5-9B goes from 41.8% to 56.4% on SWE-bench Verified, a 14.6-point gain from about 6,000 examples filtered out of SWE-smith's 59,136 tasks across 128 repositories, in roughly 3,500 lines of framework code.&lt;/p&gt;

&lt;p&gt;Two details matter more than the headline.&lt;/p&gt;

&lt;p&gt;First, retokenization. The harness re-renders text between calls, chat templates are not compositional, decode-then-retokenize is lossy, and the harness parses and repairs outputs. So the token IDs the trainer sees for the model's previous answer can differ from the ones it actually sampled. Their fix is best-effort merging: merge only when the exact token prefix holds, otherwise close the sequence. That is the engineering admission that model and harness now share a boundary at the token level. Train through one harness's rendering and you get a model tuned to that rendering.&lt;/p&gt;

&lt;p&gt;Second, section 4.3.2, "Preventing Reward Hacking." During training the agents were caught "using Git history to locate the gold commit," "using wget or curl to retrieve upstream source code from GitHub," using pip to download a package's source, and using urllib to do the same. Countermeasures: "disable Git commands and hide the .git directory from the agent," plus a Kubernetes network policy that "blocks general outbound network access and permits connections only to explicitly whitelisted services."&lt;/p&gt;

&lt;p&gt;That is my July post compressed into a paragraph, arrived at as an engineering necessity rather than a design principle. Vinicius Pereira said it best in the comments: the agent must not be able to author the artifact the gate reads. Microsoft's version is that it must not be able to &lt;em&gt;reach&lt;/em&gt; it either, through the filesystem or the network. Dipankar Sarkar's separate trust domain for test execution is the same control from the other side.&lt;/p&gt;

&lt;p&gt;Now put the halves together. The harness that decides what the model sees also decides what the trainer sees. Once RL runs through it, the tricks in pile one stop being code you can diff and become weights you cannot. That is the absorption I predicted, except what gets absorbed includes whatever the harness let the agent get away with. Hide &lt;code&gt;.git&lt;/code&gt; and the model learns the task. Forget to, and it learns to find the gold commit, and the benchmark will not tell you which one you trained.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google gave the environment a harness too
&lt;/h2&gt;

&lt;p&gt;EnvHarness (arXiv, August 20, Google Research) wraps a static environment at the &lt;code&gt;reset&lt;/code&gt;/&lt;code&gt;step&lt;/code&gt; interface with three plug-in types: Setup reshapes the initial state, Rule reshapes "which actions are allowed, what they do, and what the agent observes," and Link composes in another environment's tasks. A designer agent, EnvRigger, "treats the target policy as a black box, observing its execution trajectories to synthesize EnvHarness components targeting diagnosed flaws," writes a &lt;code&gt;_Rules&lt;/code&gt; subclass, and tests it. Across ALFWorld, WebArena, SWE-bench Verified, OfficeQA and SpreadsheetBench, skills learned in reshaped environments transfer back for up to 9.0 points on held-out instances with 9.8% fewer steps.&lt;/p&gt;

&lt;p&gt;Credit where due: this is the responsible version. Verifiers are untouched, the goal predicate is never modified, evaluation happens on the unadapted benchmark. A curriculum, not a thumb on the scale.&lt;/p&gt;

&lt;p&gt;But note the direction of travel. In one week the field shipped a harness around the agent (AVO, VISTA), a harness around the trainer (Agent Lightning), and a harness around the environment (EnvHarness). The capability you end up with has its provenance spread across three codebases, and only one of them comes with the model card.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you are actually buying
&lt;/h2&gt;

&lt;p&gt;The one benchmark this month that held the model constant and varied the harness came from a vendor. TrueFoundry's TrueForge comparison (August 18) ran DevRev's Enterprise-Bench: 14 cross-system tasks, three MCP servers, fresh session per task, blind grading, list-rate and cache-aware costs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Tasks solved&lt;/th&gt;
&lt;th&gt;Cost per run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Managed Agents&lt;/td&gt;
&lt;td&gt;Opus 4.8&lt;/td&gt;
&lt;td&gt;~11/14&lt;/td&gt;
&lt;td&gt;$11.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TrueForge&lt;/td&gt;
&lt;td&gt;Opus 4.8&lt;/td&gt;
&lt;td&gt;~11/14&lt;/td&gt;
&lt;td&gt;$8.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TrueForge&lt;/td&gt;
&lt;td&gt;GLM-5.2&lt;/td&gt;
&lt;td&gt;~11/14&lt;/td&gt;
&lt;td&gt;$2.90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deepagents / LangGraph&lt;/td&gt;
&lt;td&gt;Opus 4.8&lt;/td&gt;
&lt;td&gt;~10/14&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same model, same tasks, 28% cost difference from the harness alone. Swap the model under the same harness and cost drops another 2.9x with no change in tasks solved. TrueFoundry sells the gateway next to TrueForge, so the framing is self-serving. It is still more methodology than NVIDIA offered.&lt;/p&gt;

&lt;p&gt;I have seen this pattern in teams that compare a vendor's managed agent against their own scaffold and attribute the entire difference to the model. After this month I do not think that attribution is defensible without a controlled harness swap, and almost nobody runs one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a score needs to carry
&lt;/h2&gt;

&lt;p&gt;If provenance is a vector, a benchmark score needs one. The minimum I would want attached to an agent number before quoting it, illustrative rather than a standard:&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;score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100.00&lt;/span&gt;
&lt;span class="na"&gt;metric&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RHAE&lt;/span&gt;
&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arc-agi-3-public-25&lt;/span&gt;       &lt;span class="c1"&gt;# not semi-private, not private&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-opus-5&lt;/span&gt;           &lt;span class="c1"&gt;# provider version string, reasoning effort&lt;/span&gt;
&lt;span class="na"&gt;harness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;avo@&amp;lt;commit&amp;gt;&lt;/span&gt;          &lt;span class="c1"&gt;# the code between model and environment&lt;/span&gt;
&lt;span class="na"&gt;memory_at_start&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;empty&lt;/span&gt;         &lt;span class="c1"&gt;# or warm, and from which prior runs&lt;/span&gt;
&lt;span class="na"&gt;supervisor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stagnation-monitor&lt;/span&gt; &lt;span class="c1"&gt;# any policy that can redirect the agent&lt;/span&gt;
&lt;span class="na"&gt;compaction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;on&lt;/span&gt;                 &lt;span class="c1"&gt;# summarize vs truncate, and where&lt;/span&gt;
&lt;span class="na"&gt;action_budget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6624&lt;/span&gt;
&lt;span class="na"&gt;trainer_harness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none&lt;/span&gt;          &lt;span class="c1"&gt;# if the weights were RL'd through a harness, which one&lt;/span&gt;
&lt;span class="na"&gt;verified_by&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;self&lt;/span&gt;              &lt;span class="c1"&gt;# or ARC Prize, or a named third party&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mike Czerwinski's rule from the July thread applies to every row: unmarked has to mean self-reported. A score that arrives without the harness commit is not a measurement of the model. It is a claim about a system, typed by whoever produced it, and the default type is untrusted.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this post might get wrong
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The model/harness split may already be dissolving. After harnessed RL, "the model" is partly a harness artifact, and the boundary I am measuring might not survive the next benchmark cycle.&lt;/li&gt;
&lt;li&gt;Every 100 is on the public set, which shipped before the models did. If Opus 5 in the generic harness gets 30 on the private set and AVO gets 40, the harness story shrinks from 70 points to 10, and the leaderboard was more honest than I am giving it credit for.&lt;/li&gt;
&lt;li&gt;Source hygiene: NVIDIA sells the compute AVO runs on, OpenAI's two settings are its own API features, TrueFoundry sells a gateway, Microsoft would like you on Azure. I read the papers and reproduced none of them.&lt;/li&gt;
&lt;li&gt;My July prediction that compensatory harness layers depreciate with each model release. This month's evidence points the other way. The prediction stays up, marked as losing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The question I cannot answer alone
&lt;/h2&gt;

&lt;p&gt;If the harness is worth 70 points on a benchmark built to resist it, who owns the harness in your stack: you, the model vendor, or the router in between? And when you report an agent result internally, does the harness commit travel with the model version, or does it get dropped at the first summary?&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources &amp;amp; further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arcprize.org/results/anthropic-claude-opus-5" rel="noopener noreferrer"&gt;ARC Prize: Claude Opus 5 results, verified July 24, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.arcprize.org/methodology.md" rel="noopener noreferrer"&gt;ARC Prize: ARC-AGI-3 scoring methodology (RHAE)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/how-two-settings-tripled-our-arc-agi-3-scores/" rel="noopener noreferrer"&gt;OpenAI: How enabling two settings tripled our scores on the ARC-AGI-3 benchmark (July 29, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://schema-harness.github.io/" rel="noopener noreferrer"&gt;Schema: Frontier Models with Our Harness Achieve ~99% on ARC-AGI-3 Public (July 15, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vista-research.github.io/" rel="noopener noreferrer"&gt;VISTA: A Visual Harness for Reasoning in an Interactive World, MIT (August 5, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.nvidia.com/blog/nvidia-avo-reaches-100-on-arc-agi-3-demonstrating-a-frontier-level-general-purpose-architecture-for-long-horizon-autonomous-agents/" rel="noopener noreferrer"&gt;NVIDIA: AVO Reaches 100 on ARC-AGI-3 (August 21, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2603.24517" rel="noopener noreferrer"&gt;AVO: Agentic Variation Operators for Autonomous Evolutionary Search (arXiv 2603.24517)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thenewstack.io/nvidia-avo-arcagi3-benchmark/" rel="noopener noreferrer"&gt;The New Stack on AVO and the harness debate (August 21, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2608.17528" rel="noopener noreferrer"&gt;Agent Lightning v1.0: Towards Harnessed Agentic RL (arXiv 2608.17528, August 18, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2608.19880" rel="noopener noreferrer"&gt;EnvHarness: Awakening Static Worlds for Agent Learning (arXiv 2608.19880, August 20, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google-research/envharness" rel="noopener noreferrer"&gt;EnvHarness on GitHub, Google Research&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.truefoundry.com/blog/engineering/trueforge-vs-claude-managed-agents-benchmark/" rel="noopener noreferrer"&gt;TrueFoundry: TrueForge vs Claude Managed Agents benchmark (August 18, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://venturebeat.com/orchestration/truefoundrys-open-source-ai-agent-harness-trueforge-boasts-30-75-cheaper-task-completion-than-claude-managed-agents" rel="noopener noreferrer"&gt;VentureBeat on TrueForge (August 19, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://earendil.com/posts/what-is-a-harness/" rel="noopener noreferrer"&gt;Earendil: What Is a Harness? (August 20, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/p0rt/the-agent-faked-a-test-log-then-believed-it-self-editing-harnesses-have-a-provenance-problem-3id6"&gt;My July post: The Agent Faked a Test Log, Then Believed It&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/p0rt/my-strawman-baseline-beat-my-own-scheme-on-half-the-gate-classes-177h"&gt;My compaction experiment: My Strawman Baseline Beat My Own Scheme on Half the Gate Classes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If this article helped you, you can &lt;a href="https://ko-fi.com/sergeiparfenov?ref=dev" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt;. Your support helps me make time for the next experiment.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Distilling Kimi Into Qwen Doesn't Give You Kimi. It Gives You Qwen With Kimi's Handwriting</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Mon, 10 Aug 2026 12:40:37 +0000</pubDate>
      <link>https://dev.to/p0rt/distilling-kimi-into-qwen-doesnt-give-you-kimi-it-gives-you-qwen-with-kimis-handwriting-284p</link>
      <guid>https://dev.to/p0rt/distilling-kimi-into-qwen-doesnt-give-you-kimi-it-gives-you-qwen-with-kimis-handwriting-284p</guid>
      <description>&lt;p&gt;On July 22, 2026, White House OSTP director Michael Kratsios accused Moonshot AI of distilling Anthropic's Fable 5 to build Kimi K3, and Treasury put sanctions on the table. No technical evidence was published, and researchers immediately pointed out the timeline problem: by K3's launch day, Fable 5 had been publicly reachable for roughly 18 days in total.&lt;/p&gt;

&lt;p&gt;Everyone argued about whether it happened. Almost nobody asked the more useful engineering question: &lt;strong&gt;if it did happen, what would Moonshot actually have received?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the experiment that answers it. In 2025, the Berkeley team behind Sky-T1 fine-tuned a model on long reasoning traces whose &lt;strong&gt;final answers were wrong&lt;/strong&gt;. Accuracy dropped by 3.2 points. They randomized half the numbers inside the reasoning steps: 3.3 points. Then they shuffled the &lt;em&gt;order&lt;/em&gt; of the steps, and performance collapsed. The content of a distill is nearly disposable. The structure is the payload.&lt;/p&gt;

&lt;p&gt;That is the folk model's blind spot. The folk model says: pour a strong model's outputs into an open model, get a model at the strong model's level. What actually crosses the wire is mostly the &lt;em&gt;shape&lt;/em&gt; of the reasoning, and the size of the gain is set by your base model, not by how smart your teacher was.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; A "distill" is a dataset of teacher traces, not a set of weights. Fine-tuning on it reliably transfers output &lt;em&gt;structure&lt;/em&gt; (long chain-of-thought, backtracking, &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; blocks) and only narrowly transfers capability. Evidence: models trained on traces with &lt;strong&gt;wrong answers&lt;/strong&gt; lose about 3.2 points versus correct ones, and randomizing half the numbers in the traces costs 3.3 points on AIME 2024. Real capability gains do exist (DeepSeek's R1 distills beat RL on the same base by 25 points on AIME), but they cost 800k rejection-sampled samples and a full fine-tune, not 8k samples and a LoRA. The headline benchmark jumps you see on Hugging Face are very often eval artifacts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What a "distill" actually is
&lt;/h2&gt;

&lt;p&gt;When someone says "I poured a distill into Qwen," they are not moving weights. They are running SFT on a dataset of teacher outputs. There are two distinct channels, and they behave differently:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Black-box (traces)&lt;/th&gt;
&lt;th&gt;White-box (logits)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What you collect&lt;/td&gt;
&lt;td&gt;Generated text, usually prompt + long CoT + answer&lt;/td&gt;
&lt;td&gt;Full next-token distributions, or hidden states&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loss&lt;/td&gt;
&lt;td&gt;Cross-entropy on the teacher's tokens&lt;/td&gt;
&lt;td&gt;KL between teacher and student distributions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bits per token&lt;/td&gt;
&lt;td&gt;One sampled token&lt;/td&gt;
&lt;td&gt;The whole distribution ("dark knowledge")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Needs&lt;/td&gt;
&lt;td&gt;API access&lt;/td&gt;
&lt;td&gt;Weights, and enough GPUs to run the teacher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works across model families&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes, if tokenizers align&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anything distilled from a closed API (Claude, GPT, Gemini) is black-box by construction. You cannot get logits out of an inference endpoint. This matters more than it sounds: black-box distillation is the low-bandwidth channel, and it is the only one available in the scenario the White House described.&lt;/p&gt;

&lt;p&gt;The whole current ecosystem is downstream of two decisions made four months apart. In September 2024, OpenAI hid o1's raw chain of thought and explicitly listed competitive advantage among the reasons. In January 2025, DeepSeek shipped R1 with full traces exposed under a permissive license, and within weeks the distill wave existed: s1, LIMO, Sky-T1, and a Hugging Face shelf of "-Distill" repos. Traces are the substrate; whoever exposes them feeds the ecosystem, and hiding them is anti-distillation policy by another name. None of this is exotic in-house either: Google's own Gemini 1.5 technical report states that Flash is online-distilled from the much larger Pro. Every lab does this to its own models. The fight is only ever about doing it to someone else's.&lt;/p&gt;

&lt;p&gt;Kimi is the interesting inverse case. K3 shipped as open weights in late July 2026 at 2.8 trillion parameters, so white-box distillation &lt;em&gt;from&lt;/em&gt; Kimi is legally and technically on the table. The gate is not access, it is the inference bill for generating traces from a model that needs roughly 1.4 TB of fast memory resident before you load any context.&lt;/p&gt;

&lt;h2&gt;
  
  
  The case that it genuinely works
&lt;/h2&gt;

&lt;p&gt;DeepSeek ran the cleanest public experiment on this, and it is still the strongest pro-distillation datapoint we have.&lt;/p&gt;

&lt;p&gt;They generated about 600k rejection-sampled reasoning traces plus 200k general samples from R1, then ran plain SFT for two epochs on off-the-shelf open bases. No RL on the students at all. Then they asked the obvious control question: what if you skip the teacher and just run large-scale RL on the same base?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Qwen-32B base, three treatments&lt;/th&gt;
&lt;th&gt;AIME 2024&lt;/th&gt;
&lt;th&gt;MATH-500&lt;/th&gt;
&lt;th&gt;GPQA-D&lt;/th&gt;
&lt;th&gt;LiveCodeBench&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;QwQ-32B-Preview (reference)&lt;/td&gt;
&lt;td&gt;50.0&lt;/td&gt;
&lt;td&gt;90.6&lt;/td&gt;
&lt;td&gt;54.5&lt;/td&gt;
&lt;td&gt;41.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RL directly on the base, 10k+ steps&lt;/td&gt;
&lt;td&gt;47.0&lt;/td&gt;
&lt;td&gt;91.6&lt;/td&gt;
&lt;td&gt;55.0&lt;/td&gt;
&lt;td&gt;40.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SFT on 800k R1 traces&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;72.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;62.1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;57.2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is a 25 point gap on AIME in favor of distillation, against an RL run that cost far more compute. DeepSeek's own conclusion was blunt: distilling a powerful model into a smaller one works, while small models relying on large-scale RL need enormous compute and may still lose.&lt;/p&gt;

&lt;p&gt;This is not just curve-sharpening either. A widely cited ICML/NeurIPS 2025 analysis measured pass@k rather than pass@1 and found the two methods differ in kind. RLVR raises pass@1 while &lt;em&gt;narrowing&lt;/em&gt; the reasoning boundary at large k, because the paths it reinforces were already in the base's sampling distribution. Distillation raises the curve at every k (on Qwen-7B: pass@1 from 28% to 45%, still above 90% at pass@256), meaning genuinely new reasoning patterns entered the model.&lt;/p&gt;

&lt;p&gt;So: yes, capability moves. Hold that thought.&lt;/p&gt;

&lt;h2&gt;
  
  
  The case that it isn't what you think
&lt;/h2&gt;

&lt;p&gt;Back to the corruption experiment from the intro, with the setup spelled out. The Sky-T1 team first got +40 points on AIME 2024 by fine-tuning Qwen2.5-32B-Instruct on just 17k long-CoT traces distilled from R1. Only then did they start breaking the training data on purpose, and found that only structural damage (shuffling, inserting, deleting steps) actually hurt, while wrong answers and randomized numbers cost ~3 points each. Their conclusion sits in the paper's own title: structure, not content, is what matters.&lt;/p&gt;

&lt;p&gt;Two more datapoints point the same way. s1 hit strong reasoning numbers with 1,000 samples. LIMO used 817. If a thousand examples move a benchmark 40 points, you are not transferring a frontier lab's knowledge in a thousand examples. You are flipping a switch that was already wired.&lt;/p&gt;

&lt;p&gt;This is the same finding that killed the first imitation wave in 2023. Berkeley's "False Promise of Imitating Proprietary LLMs" found crowd workers rated ChatGPT imitators as competitive, while targeted benchmarks showed they closed little to none of the gap: they mimicked style, not factuality. Thinking Machines said the same thing in 2025 about off-policy distillation, that the student learns the teacher's style and confidence without necessarily learning its accuracy.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example at 0.01% of the weights
&lt;/h2&gt;

&lt;p&gt;Here is the exact thing the question is usually about, done in public and documented honestly.&lt;/p&gt;

&lt;p&gt;Someone took &lt;code&gt;Qwen3.6-35B-A3B&lt;/code&gt;, generated ~7.8k reasoning traces from Kimi K2.6 via OpenRouter, and ran SFT with Unsloth and LoRA. Attention-only adapters, &lt;code&gt;r=16&lt;/code&gt;, 980 steps, about 21 hours on a single H200. Trainable parameters: 3.44M out of 35.1B. That is 0.01% of the model.&lt;/p&gt;

&lt;p&gt;The model card then does something almost nobody does. It reports evals that undercut the model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark, same pipeline both sides&lt;/th&gt;
&lt;th&gt;Base Qwen3.6-35B-A3B&lt;/th&gt;
&lt;th&gt;Kimi-distill&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MATH-500 (0-shot, &lt;code&gt;math_verify&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;53.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;47.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPQA Diamond (0-shot CoT)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;79.29&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;75.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM8K (8-shot, strict-match)&lt;/td&gt;
&lt;td&gt;64.0&lt;/td&gt;
&lt;td&gt;92.67&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The author's read on that GSM8K number is the important part: the base scoring 64% is implausible for a frontier 35B-A3B, and the likely cause is that the few-shot template never triggers the base's thinking mode. So the +28.67 point "win" measures &lt;em&gt;"my pipeline rewards models that always think,"&lt;/em&gt; not capability. His stated conclusion is that the run provides no evidence the distillation improved raw reasoning over the base. What it does provide is a guarantee: the distill emits &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; blocks regardless of prompt shape, where the base's thinking mode is conditional.&lt;/p&gt;

&lt;p&gt;That is a real, useful property. It is also exactly what "handwriting transplant" means. And note the cost signature: Kimi's traces averaged 2,933 tokens against 849 for a matched Claude Opus 4.7 set, roughly a 2.5x compute multiplier for the same number of rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The price list
&lt;/h2&gt;

&lt;p&gt;Dollar figures are illustrative (cloud rates move), but the orders of magnitude are the point:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Compute&lt;/th&gt;
&lt;th&gt;What you demonstrably get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;s1-32B (Stanford)&lt;/td&gt;
&lt;td&gt;1,000 curated Gemini traces&lt;/td&gt;
&lt;td&gt;26 min on 16 H100s, ~$25 at cloud rates&lt;/td&gt;
&lt;td&gt;Thinking format + test-time scaling; beats o1-preview on competition math&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kimi K2.6 → Qwen3.6 LoRA&lt;/td&gt;
&lt;td&gt;7.8k K2.6 traces via OpenRouter&lt;/td&gt;
&lt;td&gt;~21 h on one H200&lt;/td&gt;
&lt;td&gt;Unconditional &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; blocks; no measured capability gain over base&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek R1 distills&lt;/td&gt;
&lt;td&gt;800k rejection-sampled samples&lt;/td&gt;
&lt;td&gt;Full SFT, 2 epochs, six bases&lt;/td&gt;
&lt;td&gt;+25 pts on AIME over RL on the same base&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thinking Machines on-policy&lt;/td&gt;
&lt;td&gt;Teacher-scored student rollouts&lt;/td&gt;
&lt;td&gt;1,800 GPU-hours (their RL baseline: 17,920)&lt;/td&gt;
&lt;td&gt;~70% AIME'24, RL parity at ~10% of the compute&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read top to bottom and the pattern is the whole article: the format transplant costs lunch money, the capability transfer costs a training run.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what actually crossed the wire?
&lt;/h2&gt;

&lt;p&gt;Until recently this was unanswerable per output. A December 2025 paper proposes a provenance-tracing framework that scores every sentence a distilled model produces under three models (teacher, original student, distilled student) and sorts it into four buckets: teacher-originated, student-originated, already present in both, and pre-existing but boosted by distillation. In their analysis, teacher-originated actions do appear in unseen test contexts and correlate with correctness, but a large share of what the distilled model emits is student-internal patterns that distillation merely amplified, and not all of that amplification helps.&lt;/p&gt;

&lt;p&gt;One more mechanism worth knowing, because it bounds the cross-family case. Anthropic Fellows work published in Nature this year showed models can transmit behavioral traits through data with no semantic connection to those traits, including through reasoning traces and code. The catch: the effect only appears when teacher and student share the same base model or a behaviorally matched one. Across families it disappears. So a Fable-to-Kimi transfer, if it happened, has only the visible-traces channel open. The spooky hidden channel is not available across architectures.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bill
&lt;/h2&gt;

&lt;p&gt;Distillation is not free, and the invoice arrives in three places.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capacity gap.&lt;/strong&gt; Apple's distillation scaling law found the student's loss improves with teacher strength only up to a point, after which a stronger teacher produces a &lt;em&gt;worse&lt;/em&gt; student. The teacher becomes harder to model, and the student can no longer absorb the gains. Picking the strongest available teacher is not automatically correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distribution mismatch.&lt;/strong&gt; Off-policy SFT trains the student to navigate states the teacher visits. At inference the student is in its own states, which it never trained for, and errors compound over long chains. This is the structural argument for on-policy distillation, where the student generates and the teacher scores each token. Thinking Machines reported roughly 70% on AIME'24 for 1,800 GPU-hours where their RL baseline needed 17,920, and framed the reason cleanly: RL delivers about O(1) bits of signal per episode, distillation delivers O(N) bits, one per token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forgetting.&lt;/strong&gt; A 2026 paper on post-training with knowledge retention reports that SFT on rejection-sampled Gemini 2.5 Pro responses dropped IFEval by 11.5 points on Llama-3.1-8B-Instruct, and even eroded in-domain reasoning on Qwen3-8B from 46.8% to 41.0%. You are not adding a skill to a static model. You are moving the whole distribution, and things fall out of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist: capability transfer or handwriting transplant?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Handwriting only&lt;/th&gt;
&lt;th&gt;Capability actually moves&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data scale&lt;/td&gt;
&lt;td&gt;1k to 20k traces&lt;/td&gt;
&lt;td&gt;100k+, rejection-sampled against verified answers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What you train&lt;/td&gt;
&lt;td&gt;Attention-only LoRA, 0.01% of params&lt;/td&gt;
&lt;td&gt;Full fine-tune, or LoRA over FFN/experts too&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teacher gap&lt;/td&gt;
&lt;td&gt;As large as possible&lt;/td&gt;
&lt;td&gt;Inside the capacity-gap range for your student&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;Traces from one domain, eval in another&lt;/td&gt;
&lt;td&gt;Traces drawn from the distribution you'll deploy on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy&lt;/td&gt;
&lt;td&gt;Off-policy SFT only&lt;/td&gt;
&lt;td&gt;On-policy phase after the cold start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eval&lt;/td&gt;
&lt;td&gt;pass@1, one pipeline, base's thinking mode never invoked&lt;/td&gt;
&lt;td&gt;pass@k, identical pipeline, thinking mode forced on both sides, OOD and instruction-following held out&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your setup sits mostly in the left column, you did not get a frontier model. You got your base model that now reliably reasons out loud. Ship it if that is what you needed. Just do not put "matches Kimi K2.6" in the model card.&lt;/p&gt;

&lt;h2&gt;
  
  
  Back to Kimi K3
&lt;/h2&gt;

&lt;p&gt;Numbers first, because most coverage skipped them. In February 2026, Anthropic publicly attributed more than 16 million Claude exchanges across roughly 24,000 fraudulent accounts to coordinated campaigns by Moonshot, DeepSeek, and MiniMax, over 3.4 million of them pinned on Moonshot alone. In June, Anthropic told the US Senate Banking Committee that Alibaba's Qwen lab had run the largest known distillation attack to date. So industrial-scale trace harvesting is on the record as a specific, quantified allegation, months before Kratsios spoke.&lt;/p&gt;

&lt;p&gt;The Fable-to-K3 link is the shaky part. Per press reconstructions of the timeline, Fable 5 launched June 9, was suspended June 12 under export controls, and returned July 1; K3 launched July 16. That is the ~18 days from the intro. K3's pretraining necessarily predates all of it, so the only technically coherent version of the accusation is targeted post-training on Fable-derived traces over an already-trained base. Which is precisely the scenario this article is about: it would buy behavioral transfer in the domains the traces covered, at black-box bandwidth, from under three weeks of harvesting. It would not buy the pretraining run, and pretraining is the part nobody knows how to distill, because the parameter space is specific to each network.&lt;/p&gt;

&lt;p&gt;I wrote earlier about the &lt;a href="https://dev.to/p0rt/how-model-distillation-actually-works-and-what-the-china-distilled-our-model-headlines-really-3o0o"&gt;legal and ToS side of this&lt;/a&gt; and I want to correct my own emphasis: framing distillation primarily as an IP question makes it sound like the technique hands over a copy of the model. It does not. The interesting question was always mechanical, and the mechanical answer constrains the policy answer.&lt;/p&gt;

&lt;p&gt;Caveats on my own sources, since I am asking you to update on them: DeepSeek's numbers are self-reported, the Kimi-distill evals above are single-run and small-sample by the author's own admission, and the White House claim has no published evidence behind it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question for anyone who has actually run one of these:&lt;/strong&gt; what is the one eval in your harness that would have caught a benchmark jump that was really just your base model's thinking mode failing to trigger? I suspect most of us do not have one, and that is why the Hugging Face leaderboard looks the way it does.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources &amp;amp; further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2501.12948" rel="noopener noreferrer"&gt;DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via RL&lt;/a&gt; (Tables 5 and 6, distillation vs RL)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2504.13837" rel="noopener noreferrer"&gt;Does RL Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?&lt;/a&gt; (pass@k; distillation expands the boundary, RLVR narrows it)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2502.07374" rel="noopener noreferrer"&gt;LLMs Can Easily Learn to Reason from Demonstrations: Structure, not content, is what matters!&lt;/a&gt; (the corruption experiments)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2305.15717" rel="noopener noreferrer"&gt;The False Promise of Imitating Proprietary LLMs&lt;/a&gt; (style vs factuality, 2023)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://machinelearning.apple.com/research/distillation-scaling-laws" rel="noopener noreferrer"&gt;Distillation Scaling Laws&lt;/a&gt; (capacity gap)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://thinkingmachines.ai/blog/on-policy-distillation/" rel="noopener noreferrer"&gt;On-Policy Distillation&lt;/a&gt; (Thinking Machines Lab)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2512.20908" rel="noopener noreferrer"&gt;Where Did This Sentence Come From? Tracing Provenance in LLM Reasoning Distillation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.nature.com/articles/s41586-026-10319-8" rel="noopener noreferrer"&gt;Language models transmit behavioural traits through hidden signals in data&lt;/a&gt; (Nature; &lt;a href="https://arxiv.org/abs/2507.14805" rel="noopener noreferrer"&gt;preprint&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2603.01683" rel="noopener noreferrer"&gt;Surgical Post-Training: Proximal On-Policy Distillation with Knowledge Retention&lt;/a&gt; (forgetting numbers)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://huggingface.co/lordx64/Qwen3.6-35B-A3B-Kimi-K2.6-Reasoning-Distilled" rel="noopener noreferrer"&gt;Qwen3.6-35B-A3B-Kimi-K2.6-Reasoning-Distilled model card&lt;/a&gt; (the honest eval section)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2501.19393" rel="noopener noreferrer"&gt;s1: Simple test-time scaling&lt;/a&gt; (1,000 samples, 26 minutes on 16 H100s)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://openai.com/index/learning-to-reason-with-llms/" rel="noopener noreferrer"&gt;Learning to reason with LLMs&lt;/a&gt; (OpenAI on hiding o1's raw chain of thought)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2403.05530" rel="noopener noreferrer"&gt;Gemini 1.5 technical report&lt;/a&gt; (Flash is online-distilled from Pro)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.scmp.com/news/us/diplomacy/article/3361510/trump-tech-official-accuses-chinas-moonshot-ai-stealing-anthropic" rel="noopener noreferrer"&gt;Trump tech official accuses China's Moonshot AI of stealing from Anthropic&lt;/a&gt; (SCMP), &lt;a href="https://thenewstack.io/moonshot-fable5-distillation-accusations/" rel="noopener noreferrer"&gt;The New Stack&lt;/a&gt; (the 16M / 24,000 numbers), and &lt;a href="https://glitchwire.com/news/trump-administration-accuses-moonshot-ai-of-distilling-anthropics-fable-escalati/" rel="noopener noreferrer"&gt;Glitchwire&lt;/a&gt; (Moonshot's 3.4M, the June Senate claim about Qwen)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kingy.ai/blog/kimi-k3-fable-5-distillation/" rel="noopener noreferrer"&gt;Kingy.ai's timeline reconstruction&lt;/a&gt; (Fable 5 availability windows vs K3's release)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://simonwillison.net/2026/Jul/16/kimi-k3/" rel="noopener noreferrer"&gt;Kimi K3 launch notes&lt;/a&gt; (Simon Willison)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If this article helped you, you can &lt;a href="https://ko-fi.com/sergeiparfenov?ref=dev" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt;. Your support helps me make time for the next experiment.&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Found Two Bugs in Zulip. The Maintainers Had Filed Both Two Weeks Earlier.</title>
      <dc:creator>Sergei Parfenov</dc:creator>
      <pubDate>Fri, 07 Aug 2026 14:38:24 +0000</pubDate>
      <link>https://dev.to/p0rt/i-found-two-bugs-in-zulip-the-maintainers-had-filed-both-two-weeks-earlier-4mom</link>
      <guid>https://dev.to/p0rt/i-found-two-bugs-in-zulip-the-maintainers-had-filed-both-two-weeks-earlier-4mom</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I went hunting in Zulip's codebase for this challenge and found two real data-corruption bugs in the Slack importer. Solid ones: silent message scrambling during workspace migrations, the kind of bug that costs somebody a re-migration.&lt;/p&gt;

&lt;p&gt;Then I did the thing you are supposed to do before writing a single line of fix. I searched the tracker.&lt;/p&gt;

&lt;p&gt;Issue &lt;a href="https://github.com/zulip/zulip/issues/39650" rel="noopener noreferrer"&gt;#39650&lt;/a&gt;. Opened June 30, by the maintainers themselves: a systematic audit of the Slack import path, roughly a dozen items, confirmed and triaged. My two discoveries were on that list, described more precisely than I would have described them. &lt;strong&gt;I was two weeks late to my own findings.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the story of what happened next, because "what happened next" turned out to be the useful part.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Hunted in Zulip → found 2 real bugs → both already filed by the maintainers (#39650) → the maintainer was already fixing them in an open PR (#39757) → pivoted twice: found an unreported latent twin of the bug class in the newest importer (Microsoft Teams), and claimed the one confirmed item the maintainer's PR did not touch (an unguarded timestamp sort key, which turned out to hide a silent NaN failure mode on top of the two loud ones). Shipped two PRs (&lt;a href="https://github.com/zulip/zulip/pull/39813" rel="noopener noreferrer"&gt;#39813&lt;/a&gt;, &lt;a href="https://github.com/zulip/zulip/pull/39814" rel="noopener noreferrer"&gt;#39814&lt;/a&gt;), each with a test that fails on the old code. Lessons at the end.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Picking the hunting ground
&lt;/h2&gt;

&lt;p&gt;Why Zulip: it is on this challenge's suggested repo list, it is Python, and it has a reputation that makes hunting interesting rather than easy. Near-total backend test coverage, strict mypy, ruthless linting, and a commit discipline of "each commit is a minimal coherent idea". I ran an extended ruff pass over the whole backend just to check the floor. Nothing but style noise. &lt;strong&gt;Lint-level bugs do not survive in this codebase.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Which leaves logic-level bugs, and for those you want a subsystem where correctness is hard and the inputs are hostile. Data import is exactly that: long batch jobs over &lt;em&gt;other tools'&lt;/em&gt; export files, arbitrary data quality, and no retry culture, because a workspace migration is a one-shot event for the admin running it. One unhandled edge case on message 31,000 of 50,000 and the whole thing is off.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two bugs I "found"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bug one: thread state does not survive chunk boundaries.&lt;/strong&gt; Slack messages stream through the converter in chunks of 1,000. The map that routes thread replies to their Zulip topics was allocated &lt;em&gt;inside&lt;/em&gt; the per-chunk function. Thread root in chunk N, replies in chunk N+1: the replies land in an orphan topic literally named &lt;code&gt;"... No channel message"&lt;/code&gt;. The detail that makes it art: the &lt;em&gt;adjacent&lt;/em&gt; cache in the same file was deliberately made module-global, with a comment explaining that it must survive across calls. One cache got the cross-chunk treatment. Its sibling, added later, did not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug two: the thread key is truncated to seconds.&lt;/strong&gt; A thread's identity was computed as &lt;code&gt;strftime("%Y/%m/%d %H:%M:%S")&lt;/code&gt; plus the parent's user id. No channel component. No microseconds, even though Slack's raw &lt;code&gt;ts&lt;/code&gt; carries them, as a string, right there in the message. Any bot that posts twice within one second and collects replies on both messages: two distinct threads merged into one topic, conversations interleaved.&lt;/p&gt;

&lt;p&gt;Both bugs are silent. No exceptions, no warnings, just a migrated archive that is quietly wrong.&lt;/p&gt;

&lt;p&gt;I was fairly pleased with myself for about as long as it took to search the tracker.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tracker, and the etiquette call
&lt;/h2&gt;

&lt;p&gt;Finding #39650 stung, then got worse in an instructive way: &lt;a href="https://github.com/PieterCK" rel="noopener noreferrer"&gt;PieterCK&lt;/a&gt;, the maintainer who owns the importers, already had an open PR, &lt;a href="https://github.com/zulip/zulip/pull/39757" rel="noopener noreferrer"&gt;#39757&lt;/a&gt;, "slack_importer: Fix Slack thread conversion bugs". I opened its Files changed tab with a sinking feeling. Both of my thread bugs: being fixed, by the person whose code it is, with more context than I will ever have.&lt;/p&gt;

&lt;p&gt;This challenge has a section called "Smash Bugs, Respectfully", about not adding to maintainer workload. Racing a maintainer's open PR on their own audit items is a textbook way to fail it. So: &lt;strong&gt;stand down on the thread bugs.&lt;/strong&gt; Not negotiable, and honestly not even disappointing once framed correctly, because independently rediscovering two items from a maintainer audit is not wasted work. It is calibration. My nose was pointing at real bugs; it was just pointing at them second.&lt;/p&gt;

&lt;p&gt;If the audited file is picked clean, two moves remain: find what the audit &lt;em&gt;missed&lt;/em&gt; elsewhere, and find what the audit &lt;em&gt;found&lt;/em&gt; but nobody claimed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Move one: same disease, newer organ
&lt;/h2&gt;

&lt;p&gt;Audits cover files, but bug classes travel across files, carried by copy-paste and by shared habits. So I took the bug classes from the Slack audit and checked the sibling importers. Mattermost: clean on these classes, different batching helper. Microsoft Teams, the &lt;em&gt;newest&lt;/em&gt; importer in the family: jackpot.&lt;/p&gt;

&lt;p&gt;Its batching generator yielded a list and then called &lt;code&gt;.clear()&lt;/code&gt; on the same object to build the next batch. Run the minimal version 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="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;batched&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# expected: [[0..4], [5..9], [10, 11]]
# actual:   [[10, 11], [10, 11], [10, 11]]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every yielded batch is one shared list. Ten of twelve messages gone, zero exceptions. The bug is latent: Zulip's current caller consumes each batch before advancing, so nothing fires today. It is still a broken contract, because the consumer owns a yielded value, and every future consumer inherits a trap that silently destroys data during a one-shot migration. Nobody had reported it. That became PR &lt;a href="https://github.com/zulip/zulip/pull/39814" rel="noopener noreferrer"&gt;#39814&lt;/a&gt;, and the "why fix a latent bug" argument became [its own submission][LINK: Teams Clear the Lineup post].&lt;/p&gt;

&lt;h2&gt;
  
  
  Move two: the confirmed item nobody took
&lt;/h2&gt;

&lt;p&gt;Back in #39650, one high-impact robustness item sat confirmed and unclaimed: the unguarded timestamp sort key. &lt;code&gt;float(message["ts"])&lt;/code&gt;, used to sort every message of the export and as &lt;code&gt;date_sent&lt;/code&gt;. I checked the maintainer's open PR for it, Ctrl+F in Files changed: &lt;strong&gt;not found.&lt;/strong&gt; Free.&lt;/p&gt;

&lt;p&gt;The item as filed had two failure modes: missing &lt;code&gt;ts&lt;/code&gt; raises &lt;code&gt;KeyError&lt;/code&gt;, garbage &lt;code&gt;ts&lt;/code&gt; raises &lt;code&gt;ValueError&lt;/code&gt;, either one aborts an entire import because of one message. Writing the guard surfaced a third mode that nobody had listed, and it is the best souvenir of this whole hunt: &lt;code&gt;"ts": "NaN"&lt;/code&gt;. &lt;code&gt;float("NaN")&lt;/code&gt; parses without complaint. NaN compares as False against everything, which quietly violates the total ordering Timsort assumes, so &lt;code&gt;sorted()&lt;/code&gt; returns an inconsistent order. No crash, no warning, scrambled chronology. &lt;strong&gt;The crash is the lucky failure mode.&lt;/strong&gt; That is why the shipped guard requires &lt;code&gt;math.isfinite&lt;/code&gt;, not just a successful parse. This became PR &lt;a href="https://github.com/zulip/zulip/pull/39813" rel="noopener noreferrer"&gt;#39813&lt;/a&gt; and [its own submission][LINK: Slack Clear the Lineup post].&lt;/p&gt;

&lt;h2&gt;
  
  
  Boring discipline, on purpose
&lt;/h2&gt;

&lt;p&gt;Both fixes went through the same routine. Write the regression test first, roll the source back to &lt;code&gt;upstream/main&lt;/code&gt;, and watch the test fail with the exact predicted error: &lt;code&gt;KeyError: 'ts'&lt;/code&gt; for the Slack guard, &lt;code&gt;AssertionError: 24 != 29&lt;/code&gt; for the Teams aliasing (the batches measurably eat messages). Then restore the fix and run everything: 56/56 on the Slack importer module, 10/10 on Teams, lint and mypy clean, coverage showing no uncovered lines in the touched Slack module. A regression test that never failed against the old code is a test fitted to the fix, not a test of the fix.&lt;/p&gt;

&lt;p&gt;Full disclosure on process: the mechanical part of this hunt (cloning, grepping, running suites) went through AI agent tooling; every call you have read about, from which repo to whose bug not to race to which failure policy to ship, stayed human. Zulip has an explicit AI-use policy for contributions, and both PRs follow it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Epilogue: arguing with the robot
&lt;/h2&gt;

&lt;p&gt;For the other track's submission I wired the crash into Sentry and asked Seer, its AI debugger, for a root cause. Credit where due: Seer nailed the diagnosis in seconds, down to quoting the exact poisoned message it pulled from the frame locals. Then it suggested a fix: &lt;code&gt;float(message.get("ts", 0))&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That one-liner is the fallback-timestamp option I had already declined in the PR. It patches the missing-&lt;code&gt;ts&lt;/code&gt; mode, leaves &lt;code&gt;ValueError&lt;/code&gt; alive, waves &lt;code&gt;"NaN"&lt;/code&gt; straight through into the sort, and stamps real messages with a 1970 &lt;code&gt;date_sent&lt;/code&gt;. One failure mode out of three, plus fabricated chronology. The tool found the root cause faster than I would have; deciding the failure &lt;em&gt;policy&lt;/em&gt; was still my job. I suspect that division of labor is going to describe a lot of debugging from here on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am taking away
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Freshly audited ground is picked clean. Hunt where the code is newest.&lt;/strong&gt; The Slack importer had a dozen filed bugs and zero available ones; the newest importer had an unreported twin waiting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rediscovery is calibration, not waste.&lt;/strong&gt; Going two-for-two against a maintainer audit told me the method works; it just needs to run earlier or elsewhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Filed" is not "fixed".&lt;/strong&gt; A confirmed, high-impact item sat unclaimed for over three weeks in one of the best-maintained Python codebases around. Trackers are full of these.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the open PRs before you race them.&lt;/strong&gt; The most useful contribution I made to the thread bugs was not making one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The crash is the lucky failure mode.&lt;/strong&gt; The loud errors were filed by an audit; the silent NaN mode was not. The bugs that skip the crash are the ones that make it to production, and to your archives.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Have you ever arrived two weeks late to your own discovery? And did you file it under wasted effort, or under proof your nose works? I have firmly moved to the second column.&lt;/p&gt;

&lt;h2&gt;
  
  
  The paper trail
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The maintainers' audit: &lt;a href="https://github.com/zulip/zulip/issues/39650" rel="noopener noreferrer"&gt;https://github.com/zulip/zulip/issues/39650&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The maintainer's thread-fix PR: &lt;a href="https://github.com/zulip/zulip/pull/39757" rel="noopener noreferrer"&gt;https://github.com/zulip/zulip/pull/39757&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;My Slack timestamp guard: &lt;a href="https://github.com/zulip/zulip/pull/39813" rel="noopener noreferrer"&gt;https://github.com/zulip/zulip/pull/39813&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;My Teams batching fix: &lt;a href="https://github.com/zulip/zulip/pull/39814" rel="noopener noreferrer"&gt;https://github.com/zulip/zulip/pull/39814&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The challenge's "Smash Bugs, Respectfully" guide: &lt;a href="https://dev.to/opensourcepledge/how-to-respectfully-contribute-to-open-source-cbh"&gt;https://dev.to/opensourcepledge/how-to-respectfully-contribute-to-open-source-cbh&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If this article helped you, you can &lt;a href="https://ko-fi.com/sergeiparfenov?ref=dev" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt;. Your support helps me make time for the next experiment.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
