<?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: GX Cafe LLC</title>
    <description>The latest articles on DEV Community by GX Cafe LLC (@gxcafellc).</description>
    <link>https://dev.to/gxcafellc</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%2F4078356%2Fc7ee4fe6-89b8-4b9e-a290-56e60703c89e.png</url>
      <title>DEV Community: GX Cafe LLC</title>
      <link>https://dev.to/gxcafellc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gxcafellc"/>
    <language>en</language>
    <item>
      <title>What actually breaks when you run LLM agents unattended for 58 days</title>
      <dc:creator>GX Cafe LLC</dc:creator>
      <pubDate>Fri, 21 Aug 2026 11:26:01 +0000</pubDate>
      <link>https://dev.to/gxcafellc/what-actually-breaks-when-you-run-llm-agents-unattended-for-58-days-2n7i</link>
      <guid>https://dev.to/gxcafellc/what-actually-breaks-when-you-run-llm-agents-unattended-for-58-days-2n7i</guid>
      <description>&lt;p&gt;We run an organization made of agents. Not a demo — a company's back office. Bookkeeping,&lt;br&gt;
inbox triage, drafting, review, research. 78 agents, local models, no human in the loop&lt;br&gt;
between the schedule firing and the output landing in a ledger.&lt;/p&gt;

&lt;p&gt;For 58 days we recorded every failure. Not "the run errored" — &lt;strong&gt;what was wrong with the&lt;br&gt;
answer&lt;/strong&gt;. 6768 records, published as a dataset.&lt;/p&gt;

&lt;p&gt;This is what we found. It is not what we expected.&lt;/p&gt;


&lt;h2&gt;
  
  
  The uncomfortable part first: none of these raised an error
&lt;/h2&gt;

&lt;p&gt;Every failure below returned HTTP 200. Every one had plausible length and fluent prose.&lt;br&gt;
Every one was recorded by our monitoring as a successful completion.&lt;/p&gt;

&lt;p&gt;On one day in this period our uptime metric read 97–100% for the full day, and the number&lt;br&gt;
of finished deliverables was zero. Both numbers were correct.&lt;/p&gt;

&lt;p&gt;If your dashboard says the agent ran, you have learned that the agent ran.&lt;/p&gt;


&lt;h2&gt;
  
  
  The distribution
&lt;/h2&gt;

&lt;p&gt;Of the records that carry a stated reason, these are the types, by how often they occurred:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;What it looks like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4875&lt;/td&gt;
&lt;td&gt;&lt;code&gt;other&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;日本語が壊れている&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4054&lt;/td&gt;
&lt;td&gt;&lt;code&gt;too_short&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;too short (0 chars, minimum 150)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2535&lt;/td&gt;
&lt;td&gt;&lt;code&gt;missing_required&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;missing required: 判定[:：]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2330&lt;/td&gt;
&lt;td&gt;&lt;code&gt;forbidden_present&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;あってはならないものが含まれる: (お客様/顧客)の声&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;609&lt;/td&gt;
&lt;td&gt;&lt;code&gt;broken_language_mix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Japanese and English mixed into nonsense (4 English function&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;243&lt;/td&gt;
&lt;td&gt;&lt;code&gt;chinese_in_japanese&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Chinese characters in Japanese output: 资&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;220&lt;/td&gt;
&lt;td&gt;&lt;code&gt;answer_to_other_question&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;別の仕事の答え（採点用のJSON）が返ってきている&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;172&lt;/td&gt;
&lt;td&gt;&lt;code&gt;not_japanese&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;not Japanese (no kana at all)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;144&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unearned_claim&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claims customers it does not have (ja)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;&lt;code&gt;refusal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;断り文句で終わっている&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;&lt;code&gt;reasoning_leaked&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;英語の思考が本文に漏れている&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;code&gt;invented_specifics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;材料に無い具体を書いている（readme.json, MIT）&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;6589 of the 15251 type occurrences — 43% — are boring.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not hallucination. Not jailbreaks. Not safety. The model answered — in the wrong &lt;em&gt;shape&lt;/em&gt;.&lt;br&gt;
It skipped the heading the downstream parser keys on. It wrote 0 characters. It answered&lt;br&gt;
in the wrong language.&lt;/p&gt;

&lt;p&gt;The dramatic failures everyone writes evals for — refusing (36), answering a different&lt;br&gt;
question (220) — are the rarest things in the dataset. Combined they are &lt;strong&gt;1.7%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We had built our review pass around the dramatic ones.&lt;/p&gt;


&lt;h2&gt;
  
  
  Shape failures are the ones that cost you
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;missing_required&lt;/code&gt; is the largest single type, and it is the most expensive, because it is&lt;br&gt;
the one that silently breaks a &lt;em&gt;pipeline&lt;/em&gt; rather than one output.&lt;/p&gt;

&lt;p&gt;Our single most frequent violation, 2535 occurrences, is one missing line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;missing required: 判定[:：]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;判定&lt;/code&gt; means "verdict". A review agent's contract requires a line starting with that word,&lt;br&gt;
because a later stage reads that line to decide whether the reviewed item advances. The&lt;br&gt;
model would write a thoughtful, correct, well-structured review, and put its verdict in&lt;br&gt;
prose instead of on a line with that prefix.&lt;/p&gt;

&lt;p&gt;The review is good. The reviewer is not wrong. The stage after it cannot read the answer.&lt;/p&gt;

&lt;p&gt;This is what makes shape failures expensive: they are invisible to a human spot-check.&lt;br&gt;
Someone reading the output sees a fine review and concludes the agent works.&lt;/p&gt;

&lt;p&gt;A related failure, which we found separately and which the dataset does &lt;em&gt;not&lt;/em&gt; contain:&lt;br&gt;
42 items were approved by the upstream stage and produced zero downstream work. That one&lt;br&gt;
was not a shape mismatch — the downstream stage was generating its input from four&lt;br&gt;
hard-coded sentences and never read the upstream output at all. It had been that way from&lt;br&gt;
the beginning. Both stages reported success for weeks.&lt;/p&gt;

&lt;p&gt;Different cause, same shape of blindness: &lt;strong&gt;every stage was green, and nothing crossed&lt;br&gt;
between them.&lt;/strong&gt; We now record, on every produced artifact, which artifact it was made from,&lt;br&gt;
so an unread output is visible as a number rather than as an absence.&lt;/p&gt;


&lt;h2&gt;
  
  
  Language corruption is invisible if you only read English
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;not_japanese&lt;/code&gt; (172) + &lt;code&gt;chinese_in_japanese&lt;/code&gt; (243) + &lt;code&gt;broken_language_mix&lt;/code&gt; (609) +&lt;br&gt;
&lt;code&gt;reasoning_leaked&lt;/code&gt; (24) = &lt;strong&gt;1048 occurrences&lt;/strong&gt;, our third-largest cluster.&lt;/p&gt;

&lt;p&gt;Some samples, verbatim from the dataset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Chinese characters in Japanese output: 资
Japanese and English mixed into nonsense (4 English function words inside Japanese)
not Japanese (no kana at all)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last one is worth sitting with. In a model evaluation we ran while writing this — not&lt;br&gt;
in the dataset, but with the same contracts we run in production — a candidate model&lt;br&gt;
produced 1,680 characters of confident, well-formatted text for a Japanese review task&lt;br&gt;
containing &lt;strong&gt;not a single kana character&lt;/strong&gt;. It was entirely Chinese. Length: passed.&lt;br&gt;
Structure: passed. A reader who does not read Japanese would see a completed deliverable.&lt;/p&gt;

&lt;p&gt;If you operate in a non-English language, your base model's training-data language will&lt;br&gt;
leak, and it will leak in a way that passes every structural check you have. We now measure&lt;br&gt;
kana presence as a hard gate, and we keep the writer model and the reviewer model in&lt;br&gt;
different families so a family-wide language failure cannot approve itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we changed
&lt;/h2&gt;

&lt;p&gt;Four things, in order of how much they mattered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Declare the shape, machine-check it, before anything downstream reads it.&lt;/strong&gt;&lt;br&gt;
Minimum length, required patterns, forbidden patterns, expected language, and — for&lt;br&gt;
anything with numbers — whether the number is labeled as measured, target, assumed, or&lt;br&gt;
estimated. This is the tool we extracted from that work:&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/honto-contract" rel="noopener noreferrer"&gt;&lt;code&gt;honto-contract&lt;/code&gt;&lt;/a&gt;. Zero dependencies,&lt;br&gt;
synchronous, works on any string. It exists because we needed it, not the other way around.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. When something fails, record why, not that.&lt;/strong&gt;&lt;br&gt;
For our first 41 days we wrote "contract not satisfied" and threw the reasons away. 1381 of&lt;br&gt;
our 6768 records carry no reason, and we cannot reconstruct them — the outputs are gone. It&lt;br&gt;
took us three weeks to notice, because "0 failures with a reason" and "0 failures" look&lt;br&gt;
identical on a chart. Those 1381 rows are in the published dataset, labeled, because&lt;br&gt;
deleting them would misrepresent what we know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Do not let the writer approve its own work.&lt;/strong&gt;&lt;br&gt;
Our reviewer model shares no family with our writer model. When we briefly used the same&lt;br&gt;
family for both, the reviewer approved six consecutive outputs that were in the wrong&lt;br&gt;
language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Measure produced output, not invocations.&lt;/strong&gt;&lt;br&gt;
We spent weeks judging "is this agent working?" by whether it had started recently. 78&lt;br&gt;
agents were permanently excluded from remediation because a scheduler touched their&lt;br&gt;
start-log every hour. The number was real. It measured the wrong thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;a href="https://huggingface.co/datasets/GXCafe/ai-agent-failure-logs" rel="noopener noreferrer"&gt;GXCafe/ai-agent-failure-logs&lt;/a&gt; — CC-BY-4.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checker:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/honto-contract" rel="noopener noreferrer"&gt;honto-contract&lt;/a&gt; — MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are free. The dataset is one organization's records, not a benchmark: 6768 rows over 58&lt;br&gt;
days from a single deployment, mostly Japanese-language tasks, mostly small local models&lt;br&gt;
(7B–35B). It will not tell you what fails in your setup. It will tell you what &lt;em&gt;kind&lt;/em&gt; of&lt;br&gt;
thing fails when nobody is watching, which is the part we could not find written down&lt;br&gt;
anywhere when we needed it.&lt;/p&gt;

&lt;p&gt;We are still running. The dataset updates as we fail.&lt;/p&gt;




&lt;h2&gt;
  
  
  The rest of it
&lt;/h2&gt;

&lt;p&gt;We keep running, so the dataset keeps growing, and the contract templates we use in&lt;br&gt;
production (76 of them) are not in this repository.&lt;/p&gt;

&lt;p&gt;If you want either of those, or you think the data is wrong, write to us:&lt;br&gt;
&lt;strong&gt;&lt;a href="mailto:sales@gxcafe.co.jp"&gt;sales@gxcafe.co.jp&lt;/a&gt;&lt;/strong&gt;. We will tell you what we can and cannot do, in the same tone as&lt;br&gt;
this page.&lt;/p&gt;




&lt;h3&gt;
  
  
  Notes on honesty
&lt;/h3&gt;

&lt;p&gt;Every number here is counted from the published dataset and reproducible from it. Where we&lt;br&gt;
do not know something, this article says so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1381 of 6768 records have no stated reason. We started recording reasons on day 41.
Recent days run about 78% with a reason. The gap is historical and we did not backfill it.&lt;/li&gt;
&lt;li&gt;The type counts are occurrences, not rows; one failed output can carry several types.&lt;/li&gt;
&lt;li&gt;We have no customers for this and are not claiming results from it. We built the checker
for our own pipeline and published it because the failure taxonomy was the part we
wished someone else had published first.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
