{"id":128170,"date":"2026-08-03T16:43:34","date_gmt":"2026-08-03T16:43:34","guid":{"rendered":"https:\/\/www.europesays.com\/ai\/128170\/"},"modified":"2026-08-03T16:43:34","modified_gmt":"2026-08-03T16:43:34","slug":"your-agents-arent-failing-theyre-not-running","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/ai\/128170\/","title":{"rendered":"Your Agents Aren&#8217;t Failing. They&#8217;re Not Running."},"content":{"rendered":"<p>AI agents are being judged by the quality of their answers. That is the wrong place to start. Before asking whether an agent hallucinated, misunderstood a request or made a bad decision, ask: did the work run at all?<\/p>\n<p>I operate scheduled agents across roughly 18 services on one machine. They read telemetry, watch repositories and prepare reports. For 18 months, I expected serious failures to come from the models. I expected a bad decision or a confident answer built on a misunderstanding.<\/p>\n<p>I was wrong about where the danger lived.<\/p>\n<p>Not one serious outage began with a bad model output. Every one began in the plumbing around the model. A job was registered with the scheduler incorrectly. A script called a binary that was actually a shell alias. A timeout guard depended on a command the operating system did not ship. Each failure looked clean from the outside. Each returned exit status zero. The agent had not failed in an interesting way. It had not run.<\/p>\n<p>The outage that looked like silence<\/p>\n<p>The first failure was a scheduled job that never loaded. The configuration existed, the command looked correct and the surrounding service was healthy. The schedule was wrong, so the runner never launched the job. Nothing crashed. Nothing logged an exception. The expected report simply did not appear.<\/p>\n<p>That is a difficult failure to notice because an absent output can mean several different things. The system may have run and found nothing. It may have run and failed to authenticate. It may never have started. A dashboard that displays only the latest successful-looking value turns all three states into the same blank space.<\/p>\n<p>The second failure was a shell assumption. A script invoked a command that worked interactively because it was an alias. The scheduler launched it in a non-interactive environment where the alias did not exist, yet the wrapper still completed successfully. The agent was blamed for producing no result even though it never reached the work.<\/p>\n<p>The third failure involved a timeout guard built around a command available on one machine but absent from the operating system that actually ran the job. The safeguard did not safeguard anything. The process again exited cleanly, leaving a system that looked idle rather than broken.<\/p>\n<p>These are ordinary distributed-systems failures: incorrect registration, environment differences and dependency assumptions. AI makes them harder to see because the model output is the most visible part of the system. Teams inspect the prompt and answer while the scheduler, shell and process boundary remain outside the frame.<\/p>\n<p>Richard Cook\u2019s essay <a href=\"https:\/\/how.complexsystems.fail\/\" rel=\"nofollow noopener\" target=\"_blank\">\u201cHow Complex Systems Fail\u201d<\/a> makes the broader point: complex systems rarely fail because of one dramatic component. They fail through interactions among ordinary components whose behavior made sense locally. An AI agent is another component in that system, not a replacement for the system around it.<\/p>\n<p>A good agent reports unknown<\/p>\n<p>The most useful design rule I reached came from a different incident. One of my agents lost an API credential during a run. It could no longer see the channel it was supposed to summarize.<\/p>\n<p>The tempting response would have been an empty summary: no new messages, no action required. That answer would have been true in a narrow sense. The agent had seen zero messages. It would also have been completely misleading, because zero messages was not the state of the channel. It was the limit of the agent\u2019s access.<\/p>\n<p>The agent reported unknown instead.<\/p>\n<p>That distinction is the boundary between a system that is honest about its evidence and one that quietly manufactures certainty. A good agent reports unknown when it cannot observe the source. A bad one reports zero. The same rule applies when a tool call times out, a scheduler has not loaded the job or a dependency cannot be resolved. \u201cNo result\u201d and \u201cno data observed\u201d are not interchangeable.<\/p>\n<p>The <a href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/\" rel=\"nofollow noopener\" target=\"_blank\">POSIX specification<\/a> is not an AI document, but it represents the explicit contracts agent systems need. A human\u2019s interactive shell is not the same environment as a scheduled process, and a successful exit is not proof that the intended work occurred.<\/p>\n<p>Observability must include what did not happen<\/p>\n<p>Most observability guidance begins after execution: collect logs, traces and metrics for the work performed. That is necessary, but agent fleets need another question: what work was expected but never observed?<\/p>\n<p>I now distinguish between a job that ran and produced a result, a job that ran and found no qualifying data, a job that ran but could not access its source and a job that did not run or whose execution state is unknown. Those states need different alerts and different language in reports.<\/p>\n<p>\u201cNo new items\u201d should require evidence that the source was reachable and collection completed. If that evidence is missing, the correct result is unknown, not zero. The <a href=\"https:\/\/opentelemetry.io\/docs\/concepts\/observability-primer\/\" rel=\"nofollow noopener\" target=\"_blank\">OpenTelemetry observability primer<\/a> is a useful starting point for thinking about traces, metrics and logs as evidence of behavior. For agent systems, I extend that idea to execution receipts: the schedule that fired, the command that resolved, the credential or connection that was used and the source that was actually observed. A final model response is only the last link in that chain.<\/p>\n<p>The lesson is not to add more prompts. Make the boundaries testable. Verify binaries. Test the scheduler\u2019s real environment. Treat missing credentials and dependencies as explicit states. Add a heartbeat that proves the work ran, not merely that configuration exists.<\/p>\n<p>AI agents can produce bad answers. That failure is visible and often reviewable. The more dangerous class is a system that produces a plausible empty answer because its execution path disappeared before the model had a chance to do anything.<\/p>\n<p>Your agents may not be failing. They may not be running. Before evaluating the intelligence of the answer, verify the existence of the work that was supposed to produce it.<\/p>\n<p>How do I detect when an AI agent scheduled job never ran?<\/p>\n<p>Distinguish between four execution states: job ran and produced a result, job ran and found no qualifying data, job ran but could not access its source, and job did not run or whose execution state is unknown. Implement heartbeat signals or execution receipts \u2014 logging the schedule that fired, the command that resolved, and the credential used \u2014 so a missing heartbeat triggers an alert rather than silent absence.<\/p>\n<p>Why does a scheduled agent return exit code 0 but produce no output?<\/p>\n<p>A zero exit code confirms the wrapper process completed, not that the intended work ran. Common causes include shell aliases that resolve interactively but not in a non-interactive scheduler environment, misconfigured cron or job-runner schedules that never trigger, and missing dependencies (such as a timeout utility) that cause the agent to skip its work silently.<\/p>\n<p>What is the difference between \u2018no result\u2019 and \u2018unknown\u2019 in an AI agent system?<\/p>\n<p>\u2018No result\u2019 implies the agent ran, observed the source, and found nothing. \u2018Unknown\u2019 means the agent could not verify whether it observed the source at all \u2014 for example, because a credential was missing or a tool call timed out. Conflating the two causes systems to report false certainty, making real failures indistinguishable from genuinely empty data.<\/p>\n<p>How should observability be set up for AI agent fleets?<\/p>\n<p>Standard observability (logs, traces, metrics) covers what happened during execution. Agent fleets additionally need expected-but-not-observed tracking: alerts that fire when a scheduled job produces no execution receipt within a time window. OpenTelemetry provides a foundation; extend it with agent-specific execution receipts covering the schedule trigger, resolved binary, credentials used, and the data source actually queried.<\/p>\n<p><img loading=\"lazy\" alt=\"Suneet Malhotra\" width=\"80\" height=\"80\" src=\"https:\/\/www.europesays.com\/ai\/wp-content\/uploads\/2026\/08\/1765261060717.jpg\" decoding=\"async\" class=\"lazyload\" data-eio-rwidth=\"800\" data-eio-rheight=\"800\"\/>About Suneet Malhotra<\/p>\n<p class=\"sdt-author-box-bio\">Suneet Malhotra is an independent practitioner-researcher in AI-assisted software testing and agent reliability. He has more than 20 years in quality engineering, is an IEEE Senior Member and writes from operating scheduled agent systems in practice.<\/p>\n<p><a class=\"sdt-author-box-link\" href=\"https:\/\/sdtimes.com\/author\/suneet-malhotra\/\" rel=\"nofollow noopener\" target=\"_blank\">View all posts by Suneet Malhotra \u2192<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"AI agents are being judged by the quality of their answers. That is the wrong place to start.&hellip;\n","protected":false},"author":2,"featured_media":128171,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[405,7537,7401,26365,40890],"class_list":["post-128170","post","type-post","status-publish","format-standard","has-post-thumbnail","category-agentic-ai","tag-ai-agents","tag-artificial-intelligence-agents","tag-distributed-systems","tag-failure","tag-telemetry"],"_links":{"self":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/posts\/128170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/comments?post=128170"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/posts\/128170\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/media\/128171"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/media?parent=128170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/categories?post=128170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/ai\/wp-json\/wp\/v2\/tags?post=128170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}