<?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>Your monitoring says healthy. Your agents are not.</title>
      <dc:creator>GX Cafe LLC</dc:creator>
      <pubDate>Thu, 03 Sep 2026 15:04:17 +0000</pubDate>
      <link>https://dev.to/gxcafellc/your-monitoring-says-healthy-your-agents-are-not-o4</link>
      <guid>https://dev.to/gxcafellc/your-monitoring-says-healthy-your-agents-are-not-o4</guid>
      <description>&lt;h2&gt;
  
  
  What Broke
&lt;/h2&gt;

&lt;p&gt;In the weeks leading up to our most recent production run, our local LLM agent fleet experienced a series of failures that went unnoticed for days. Looking at the failure ledger, several patterns emerge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Process Errors in Inference&lt;/strong&gt;: Multiple entries show &lt;code&gt;process_error&lt;/code&gt; failures during the &lt;code&gt;secretary/consult-classify&lt;/code&gt; and &lt;code&gt;secretary/consult-fields&lt;/code&gt; stages. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On August 29th at 08:06:11 UTC, the &lt;code&gt;ollama/qwen3.8:27b&lt;/code&gt; model encountered a &lt;code&gt;process_error&lt;/code&gt; with a duration of 318,454ms.&lt;/li&gt;
&lt;li&gt;On August 30th at 09:54:39 UTC, the same model failed again with an even longer duration of 1,813,103ms.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Timeouts in Agent Evaluation&lt;/strong&gt;: On September 1st, two consecutive timeouts occurred during &lt;code&gt;hr/agent-evaluation&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;02:55:03 UTC and 03:00:06 UTC, both with the &lt;code&gt;ollama/qwen3.8:27b&lt;/code&gt; and &lt;code&gt;qwen3.6:27b&lt;/code&gt; models, respectively. Each timeout lasted approximately 300 seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These failures indicate that while the agents were running unattended, they encountered issues that prevented them from completing their tasks. The long durations and timeouts suggest that the models were either stuck in a loop or encountered resource constraints that were not being addressed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Happened
&lt;/h2&gt;

&lt;p&gt;The root cause of these failures can be attributed to several factors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model Instability&lt;/strong&gt;: The models being used, such as &lt;code&gt;ollama/qwen3.8:27b&lt;/code&gt; and &lt;code&gt;ollama/qwen3.6:27b&lt;/code&gt;, may have inherent instability when running continuously without human oversight. This could be due to memory leaks, inefficient garbage collection, or other performance issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource Constraints&lt;/strong&gt;: Running multiple agents simultaneously can strain system resources, leading to timeouts and process errors. The long durations recorded in the failure ledger suggest that the agents were consuming excessive CPU or memory, causing the system to become unresponsive.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get the checklist and the three watchdogs (free)&lt;/strong&gt; → &lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260903-kiji-ed62c2" rel="noopener noreferrer"&gt;gxcafe.co.jp/harness-kit&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lack of Monitoring&lt;/strong&gt;: Without proper monitoring in place, these failures went unnoticed for an extended period. This highlights the importance of having real-time alerts and monitoring tools to detect and address issues promptly.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What We Put in Place
&lt;/h2&gt;

&lt;p&gt;To prevent similar issues in the future, we implemented several mechanical guards:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automated Alerts&lt;/strong&gt;: We set up automated alerts to notify the engineering team immediately when a &lt;code&gt;process_error&lt;/code&gt; or timeout occurs. This ensures that any issues are addressed promptly, minimizing downtime and preventing prolonged failures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource Monitoring&lt;/strong&gt;: We implemented resource monitoring to track CPU and memory usage of the agents. If an agent exceeds predefined thresholds, it is automatically restarted or reconfigured to use fewer resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model Health Checks&lt;/strong&gt;: Regular health checks are now performed on the models to ensure they are running optimally. This includes checking for memory leaks, optimizing garbage collection, and ensuring that the models are not consuming excessive resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Failover Mechanisms&lt;/strong&gt;: We introduced failover mechanisms to switch to a backup model or agent if the primary one fails. This ensures that the agent fleet can continue operating even if individual components encounter issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Lesson
&lt;/h2&gt;

&lt;p&gt;The key lesson from this experience is the importance of proactive monitoring and maintenance in unattended agent fleets. While running agents unattended can increase efficiency and productivity, it also introduces risks that must be managed carefully. By implementing automated alerts, resource monitoring, regular health checks, and failover mechanisms, we can ensure that our agent fleet remains stable and reliable, even when running for extended periods.&lt;/p&gt;

&lt;p&gt;In conclusion, the 58-day unattended run highlighted the silent failures that can occur in local LLM agent fleets. By addressing these issues with the mechanical guards we put in place, we have improved the resilience and reliability of our system. Moving forward, we will continue to refine our monitoring and maintenance strategies to ensure that our agent fleet operates smoothly and efficiently.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Get the checklist and the three watchdogs (free)&lt;/strong&gt; → &lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260903-kiji-ed62c2" rel="noopener noreferrer"&gt;gxcafe.co.jp/harness-kit&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>devops</category>
    </item>
    <item>
      <title>You can never backfill a read receipt: a blog comment fixed our AI pipeline</title>
      <dc:creator>GX Cafe LLC</dc:creator>
      <pubDate>Mon, 31 Aug 2026 23:23:55 +0000</pubDate>
      <link>https://dev.to/gxcafellc/you-can-never-backfill-a-read-receipt-a-blog-comment-fixed-our-ai-pipeline-1ki2</link>
      <guid>https://dev.to/gxcafellc/you-can-never-backfill-a-read-receipt-a-blog-comment-fixed-our-ai-pipeline-1ki2</guid>
      <description>&lt;p&gt;Last week we published a post-mortem: our AI reviewer hallucinated a request&lt;br&gt;
that didn't exist, and our producer retried the same document 245 times. A&lt;br&gt;
reader, pm25coder, left a comment that turned out to be the best code review&lt;br&gt;
we've ever received. This post is what we shipped because of it, same day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comment, compressed
&lt;/h2&gt;

&lt;p&gt;Our fix at the time was provenance: record which artifact each output was&lt;br&gt;
made from. The comment pointed at the hole:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which artifact it was made from" can still be gamed by the exact failure&lt;br&gt;
it exists to catch — a consumer that records the source id without reading&lt;br&gt;
the content. [...] Make the consumer cite what it actually read. [...]&lt;br&gt;
You can never backfill a read receipt, so it has to be written when the&lt;br&gt;
reading happens.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He was right, and we checked: our approval queue recorded the &lt;em&gt;path&lt;/em&gt; of&lt;br&gt;
every deliverable. Nothing anywhere proved the enqueuer had ever opened the&lt;br&gt;
file. An empty or deleted file could sit in the human approval queue&lt;br&gt;
looking exactly like a real one.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1. Read receipts at hand-off.&lt;/strong&gt; When the reviewer receives an excerpt, we&lt;br&gt;
now write &lt;code&gt;{sha256(excerpt), excerptChars, fullChars}&lt;/code&gt; at the moment of&lt;br&gt;
hand-off. Written at read time, because it cannot be written later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fingerprints at enqueue.&lt;/strong&gt; A deliverable enters the approval queue only&lt;br&gt;
after the enqueuer actually reads it: content hash and length are stored on&lt;br&gt;
the queue entry. Unreadable or empty → it never enters the queue, and the&lt;br&gt;
reason is archived where a human can see it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Re-derivable citations.&lt;/strong&gt; The queue entry also quotes the reviewer's&lt;br&gt;
verdict line &lt;em&gt;verbatim&lt;/em&gt;. The nightly audit re-extracts that line from the&lt;br&gt;
review file and compares. A citation that cannot be re-derived from the&lt;br&gt;
artifact means someone wrote it without reading — and it now shows up as a&lt;br&gt;
&lt;strong&gt;mismatch count&lt;/strong&gt;, not as an absence. That was the commenter's core point:&lt;br&gt;
an unread input should be a number on a chart, not a blank space.&lt;/p&gt;

&lt;h2&gt;
  
  
  The check had the bug it hunts
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get the checklist and the three watchdogs (free)&lt;/strong&gt; → &lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260831-kiji-0f46e8" rel="noopener noreferrer"&gt;gxcafe.co.jp/harness-kit&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Worth confessing: our first version skipped any queue entry that lacked a&lt;br&gt;
hash — &lt;code&gt;if (!entry.sha256) continue;&lt;/code&gt; — which meant a forged citation&lt;br&gt;
&lt;em&gt;without&lt;/em&gt; a hash sailed through the very audit built to catch forged&lt;br&gt;
citations. We only found it because we test every check by faking the&lt;br&gt;
failure it should catch, and the fake passed. If you build watchdogs:&lt;br&gt;
break them on purpose before you trust them. Ours needed it, again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers, for honesty
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;2,038 reviews audited for invented terms: 4 contaminated (0.2%)&lt;/li&gt;
&lt;li&gt;Those 4 caused ~470 wasted generations before anything gave up&lt;/li&gt;
&lt;li&gt;Forged-citation probe after the fix: caught as a mismatch, first try&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you run agents unattended
&lt;/h2&gt;

&lt;p&gt;The output-contract checker from this story is free on npm:&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/honto-contract" rel="noopener noreferrer"&gt;honto-contract&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our unattended-operation checklist and three watchdog templates are free&lt;br&gt;
(email-gated):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260831-kiji-0f46e8" rel="noopener noreferrer"&gt;Get the checklist and the three watchdogs (free)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More of these, as we find them: &lt;a href="https://gxcafe.github.io/tech-blog/" rel="noopener noreferrer"&gt;GX Cafe engineering notes&lt;/a&gt; — 12 posts, no signup.&lt;/p&gt;

&lt;p&gt;The full production set — now including the payment gate we extracted this&lt;br&gt;
week — is &lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260831-kiji-0f46e8" rel="noopener noreferrer"&gt;on the same page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Honest note: still no customers. Everything above is what we run on&lt;br&gt;
ourselves, measured on our own failures. And thanks again, pm25coder —&lt;br&gt;
comments like yours are why we write these.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>devops</category>
    </item>
    <item>
      <title>Your local LLM app needs guardrails before it needs prompts</title>
      <dc:creator>GX Cafe LLC</dc:creator>
      <pubDate>Thu, 27 Aug 2026 14:03:17 +0000</pubDate>
      <link>https://dev.to/gxcafellc/your-local-llm-app-needs-guardrails-before-it-needs-prompts-30mo</link>
      <guid>https://dev.to/gxcafellc/your-local-llm-app-needs-guardrails-before-it-needs-prompts-30mo</guid>
      <description>&lt;p&gt;Most local-LLM tutorials start with the fun part: the prompt. After running a fleet&lt;br&gt;
of autonomous agents on local models 24/7 and logging every failure — the ledger now&lt;br&gt;
holds over eight thousand entries — we start somewhere else.&lt;/p&gt;

&lt;p&gt;Here is the single most important thing that ledger taught us: &lt;strong&gt;the call succeeding&lt;br&gt;
tells you nothing.&lt;/strong&gt; The majority of our contract violations were outputs that were&lt;br&gt;
too short, or empty — while the API returned success. The model answered. The&lt;br&gt;
dashboard was green. Nothing was produced.&lt;/p&gt;

&lt;p&gt;So we distilled the survival kit into a scaffold you can stand up in one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-local-llm-app my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five files, about 180 lines, plain Node and Express, no framework lock-in. What gets&lt;br&gt;
wired in:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. An output contract
&lt;/h2&gt;

&lt;p&gt;A contract declares what "done" looks like — and then verifies the artifact itself.&lt;br&gt;
Never a proxy. Not the exit code, not a log line, not HTTP 200. &lt;code&gt;contract.js&lt;/code&gt; has&lt;br&gt;
three kinds of clause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;minChars&lt;/code&gt; — the cheapest check, and statistically the most valuable&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;must&lt;/code&gt; — patterns that have to appear&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mustNot&lt;/code&gt; — leftover placeholder tags, unfinished markers, refusal leakage
("as an AI, I cannot…" inside what was supposed to be a business document)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every &lt;code&gt;mustNot&lt;/code&gt; entry exists because it caught a real production failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Retry that feeds failures back
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get the checklist and the three watchdogs (free)&lt;/strong&gt; → &lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260827-kiji-933c69" rel="noopener noreferrer"&gt;gxcafe.co.jp/harness-kit&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the contract rejects an output, the failure reason goes into the next prompt.&lt;br&gt;
Three strikes and the item is rejected outright — there is no "accept with warnings",&lt;br&gt;
because accept-with-warnings is "apologize later" with extra steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. An approval queue
&lt;/h2&gt;

&lt;p&gt;Nothing the model writes leaves the app without a person pressing approve. No&lt;br&gt;
decision means no. That rule comes from experience: an unattended script once&lt;br&gt;
contacted a real company because its &lt;em&gt;default&lt;/em&gt; was "send". The dangerous side is&lt;br&gt;
never the default here.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Two watchdogs
&lt;/h2&gt;

&lt;p&gt;A heartbeat (is the process alive?) and a silent-zero check (is anything actually&lt;br&gt;
being produced?). These are different questions. Running is not the same as&lt;br&gt;
producing — a fleet can be 100% "up" with zero output all day, and nothing in a&lt;br&gt;
standard health check will tell you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why so small?
&lt;/h2&gt;

&lt;p&gt;Because the guardrails are the product; the model is replaceable. Swap Ollama&lt;br&gt;
models in &lt;code&gt;.env&lt;/code&gt;, replace the prompts with your own business task, and the&lt;br&gt;
contract/queue/watchdog skeleton stays exactly where it is.&lt;/p&gt;

&lt;p&gt;If you want to go deeper, the checker we run in production is free and MIT:&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/honto-contract" rel="noopener noreferrer"&gt;honto-contract&lt;/a&gt;. A free snapshot of&lt;br&gt;
the failure ledger behind all of this is on&lt;br&gt;
&lt;a href="https://huggingface.co/datasets/GXCafe/ai-agent-failure-logs" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Start with the scaffold, break every guard on purpose, and watch them hold. That is&lt;br&gt;
the fastest way to trust your own unattended setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you run agents unattended
&lt;/h2&gt;

&lt;p&gt;Our unattended-operation checklist and three watchdog templates are free&lt;br&gt;
(email-gated):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260827-kiji-933c69" rel="noopener noreferrer"&gt;Get the checklist and the three watchdogs (free)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More of these, as we find them: &lt;a href="https://gxcafe.github.io/tech-blog/" rel="noopener noreferrer"&gt;GX Cafe engineering notes&lt;/a&gt; — 12 posts, no signup.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>devops</category>
    </item>
    <item>
      <title>Our AI reviewer invented a request. Our producer retried 245 times.</title>
      <dc:creator>GX Cafe LLC</dc:creator>
      <pubDate>Mon, 24 Aug 2026 00:31:03 +0000</pubDate>
      <link>https://dev.to/gxcafellc/our-ai-reviewer-invented-a-request-our-producer-retried-245-times-465f</link>
      <guid>https://dev.to/gxcafellc/our-ai-reviewer-invented-a-request-our-producer-retried-245-times-465f</guid>
      <description>&lt;p&gt;We run ~100 LLM agents unattended on local models. Last week we found one&lt;br&gt;
document that had been rewritten &lt;strong&gt;245 times in 5 days&lt;/strong&gt; — every attempt&lt;br&gt;
rejected. A sibling document: 225 times. Combined, about 470 wasted&lt;br&gt;
generations, all burned on the same two files.&lt;/p&gt;

&lt;p&gt;Here is the autopsy, with the actual numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop
&lt;/h2&gt;

&lt;p&gt;Our pipeline is simple: a producer agent writes a document, a reviewer agent&lt;br&gt;
checks it against a contract (minimum length, required sections, no&lt;br&gt;
placeholder junk), and rejected work goes back with fix instructions.&lt;/p&gt;

&lt;p&gt;The rejected document was a key-management (KMS) implementation spec —&lt;br&gt;
4,452 characters, perfectly on-topic. The reviewer's verdict:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The request was a 3-line email triage response (LOCK / VERDICT / REASON),&lt;br&gt;
but the answer is a long KMS spec. Rewrite as &lt;strong&gt;3 lines only&lt;/strong&gt;."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One problem. We grepped the document: the words "LOCK", "VERDICT", and the&lt;br&gt;
name of the triage service &lt;strong&gt;appear zero times&lt;/strong&gt; in it. The reviewer had&lt;br&gt;
invented the request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the loop never ended
&lt;/h2&gt;

&lt;p&gt;Two contracts collided:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The reviewer's fix instruction: &lt;em&gt;output 3 lines only&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The producer's output contract: &lt;em&gt;minimum 600 characters&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No output can satisfy both. So the producer failed the contract, got&lt;br&gt;
re-queued, produced again, failed again — 245 times. Our retry cap counted&lt;br&gt;
&lt;strong&gt;reviews&lt;/strong&gt;, but a contract-failed output never reaches review. The give-up&lt;br&gt;
mechanism existed; it just watched the wrong counter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Root cause: the reviewer never saw the request
&lt;/h2&gt;

&lt;p&gt;Our review prompt contained the artifact body (first 4,000 chars) and the&lt;br&gt;
output format. &lt;strong&gt;It never contained the original request.&lt;/strong&gt; We asked a model&lt;br&gt;
"does this match the request?" without telling it what the request was.&lt;br&gt;
A model asked to judge against information it doesn't have will&lt;br&gt;
hallucinate that information. Ours did, confidently, 245 times' worth.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get the checklist and the three watchdogs (free)&lt;/strong&gt; → &lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260824-kiji-c9185d" rel="noopener noreferrer"&gt;gxcafe.co.jp/harness-kit&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bonus failure: we truncated long documents to 4,000 characters before&lt;br&gt;
review without saying so, and reviewers marked them "thin — cut off&lt;br&gt;
mid-sentence." The cut was ours, not the producer's.&lt;/p&gt;

&lt;h2&gt;
  
  
  How common was it?
&lt;/h2&gt;

&lt;p&gt;We audited all 2,038 reviews on file for concrete terms (product names,&lt;br&gt;
format tokens) that appear in the review but &lt;strong&gt;nowhere in the reviewed&lt;br&gt;
document&lt;/strong&gt;. Result: &lt;strong&gt;4 contaminated reviews — 0.2%.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the uncomfortable lesson: a 0.2% hallucination rate produced 470&lt;br&gt;
wasted runs, because nothing ever gave up. Low rate × infinite retries =&lt;br&gt;
unbounded damage. The rate is not the risk; the loop is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fixes (all mechanical)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pass the original request into the review prompt.&lt;/strong&gt; If it can't be
extracted, the prompt now says: &lt;em&gt;"do NOT guess the request — say it is
unknown and judge the artifact on its own."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declare truncation.&lt;/strong&gt; "First 4,000 of 8,784 chars — the cut is ours."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reject impossible instructions at the review's own exit gate.&lt;/strong&gt;
A review demanding "N lines only" while the production contract requires
600+ chars now fails &lt;em&gt;as a review&lt;/em&gt; and never enters the queue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Count consecutive contract failures&lt;/strong&gt;, not just reviews, and park the
item for a human after 5 — with the last verdict and fix instruction
attached, so the human can see &lt;em&gt;why&lt;/em&gt; in one glance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each fix ships with a test we deliberately broke to confirm it fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you run agents unattended
&lt;/h2&gt;

&lt;p&gt;The checker that catches broken outputs in this story (empty text, language&lt;br&gt;
leakage, placeholder junk, contract violations) is free on npm:&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/honto-contract" rel="noopener noreferrer"&gt;honto-contract&lt;/a&gt; — it passed&lt;br&gt;
600 downloads last week, so somebody besides us finds this useful now.&lt;/p&gt;

&lt;p&gt;The unattended-operation checklist and three of our watchdog templates are&lt;br&gt;
free (email-gated):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260824-kiji-c9185d" rel="noopener noreferrer"&gt;Get the checklist and the three watchdogs (free)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More of these, as we find them: &lt;a href="https://gxcafe.github.io/tech-blog/" rel="noopener noreferrer"&gt;GX Cafe engineering notes&lt;/a&gt; — 12 posts, no signup.&lt;/p&gt;

&lt;p&gt;The full production set (7 templates — cron registry, silent-zero watch, heartbeat, output contracts: the exact ones in this story) is available on the same page.&lt;br&gt;
(&lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260824-kiji-c9185d" rel="noopener noreferrer"&gt;https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260824-kiji-c9185d&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Honest note: we have no customers yet. Everything above is exactly what we&lt;br&gt;
run on ourselves, measured on our own failures.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>devops</category>
    </item>
    <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 69 days we recorded every failure. Not "the run errored" — &lt;strong&gt;what was wrong with the&lt;br&gt;
answer&lt;/strong&gt;. 11850 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;4522&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;3319&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;2414&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;1602&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;902&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;513&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;406&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;309&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;290&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;63&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;tr&gt;
&lt;td&gt;36&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;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;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hedge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;逃げ口上（サンプルだと断っている）&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;6124 of the 14415 type occurrences — 42% — 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 (309) — are the rarest things in the dataset. Combined they are &lt;strong&gt;2.4%&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, 1602 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; (406) + &lt;code&gt;chinese_in_japanese&lt;/code&gt; (513) + &lt;code&gt;broken_language_mix&lt;/code&gt; (902) +&lt;br&gt;
&lt;code&gt;reasoning_leaked&lt;/code&gt; (36) = &lt;strong&gt;1857 occurrences&lt;/strong&gt;, our third-largest cluster.&lt;/p&gt;

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



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get the checklist and the three watchdogs (free)&lt;/strong&gt; → &lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260821-kiji-0eacb5" rel="noopener noreferrer"&gt;gxcafe.co.jp/harness-kit&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&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. 2179 of&lt;br&gt;
our 11850 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 2179 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: 11850 rows over 69&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;2179 of 11850 records have no stated reason. We started recording reasons on day 41.
Recent days run about 59% 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;

&lt;h2&gt;
  
  
  If you run agents unattended
&lt;/h2&gt;

&lt;p&gt;Our unattended-operation checklist and three watchdog templates are free&lt;br&gt;
(email-gated):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gxcafe.co.jp/harness-kit/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=harness-kit&amp;amp;utm_content=20260821-kiji-0eacb5" rel="noopener noreferrer"&gt;Get the checklist and the three watchdogs (free)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More of these, as we find them: &lt;a href="https://gxcafe.github.io/tech-blog/" rel="noopener noreferrer"&gt;GX Cafe engineering notes&lt;/a&gt; — 12 posts, no signup.&lt;/p&gt;

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