{"id":6956,"date":"2026-09-18T23:09:29","date_gmt":"2026-09-18T23:09:29","guid":{"rendered":"https:\/\/jonjones.ai\/uncategorized\/daily-saturday-shortcuts-ai-agent-silent-failure-2026-09-19\/"},"modified":"2026-09-18T23:09:29","modified_gmt":"2026-09-18T23:09:29","slug":"daily-saturday-shortcuts-ai-agent-silent-failure-2026-09-19","status":"publish","type":"post","link":"https:\/\/jonjones.ai\/zh\/%e4%ba%ba%e5%b7%a5%e6%99%ba%e6%85%a7%e8%87%aa%e5%8b%95%e5%8c%96\/daily-saturday-shortcuts-ai-agent-silent-failure-2026-09-19\/","title":{"rendered":"\u9031\u516d\u5c0f\u8cbc\u58eb\uff1a3 \u7a2e\u65b9\u6cd5\u6559\u4f60\u5982\u4f55\u767c\u73fe AI \u4ee3\u7406\u7684\u7121\u8072\u5931\u6557\uff08\u7576\u300c\u96f6\u7d50\u679c\u300d\u5be6\u969b\u4e0a\u662f\u7b46\u8aa4\u6642\uff09"},"content":{"rendered":"<p>This morning I ran the same API call twice, one character apart.<\/p>\n<p>The first came back with <strong>40 records<\/strong>. The second came back with <strong>0<\/strong>. Same table, same key, same second. The only difference: one asked for <code>'Ready'<\/code> and the other asked for <code>'ready'<\/code>.<\/p>\n<p>Both returned <strong>HTTP 200<\/strong>. Both looked like an answer. One was a fact and one was a typo, and nothing in either response told me which was which.<\/p>\n<p>That is an AI agent silent failure, and it is the nastiest failure mode you will hit \u2014 because it doesn&#8217;t look like a failure. It looks like <em>good news<\/em>. Empty queue. Nothing to process. All clear. Your agent reads the zero, logs &#8220;nothing to do,&#8221; exits clean, and your dashboard goes green over a question you never actually asked.<\/p>\n<p>Three shortcuts to catch it. All three came out of my own logs this week.<\/p>\n<h2>1. Never trust a zero without a control query<\/h2>\n<p>Before your agent is allowed to believe an empty result, make it ask a question it already knows the answer to.<\/p>\n<p>Same endpoint, same credentials, a filter that <em>must<\/em> return rows. If the control comes back full and your real query comes back empty, the zero is real \u2014 act on it. If both come back empty, your query is broken, and you just avoided reporting &#8220;all clear&#8221; on a table with forty live rows sitting in it.<\/p>\n<p>That&#8217;s two calls instead of one. It is the cheapest insurance in your entire stack, and it&#8217;s the same instinct behind <a href=\"https:\/\/jonjones.ai\/zh\/%e4%ba%ba%e5%b7%a5%e6%99%ba%e6%85%a7%e8%87%aa%e5%8b%95%e5%8c%96\/%e6%af%8f%e6%97%a5%e9%80%b1%e5%85%ad%e5%bf%ab%e6%8d%b7%e6%96%b9%e5%bc%8f%e9%a3%9b%e8%a1%8c%e5%89%8d%e6%aa%a2%e6%9f%a5-2026%e5%b9%b48%e6%9c%8822%e6%97%a5\/\">the ten-second health check I run before any agent spends money<\/a>.<\/p>\n<h2>2. Check which clock the machine is on, not the one on your wall<\/h2>\n<p>Here&#8217;s the one that nearly cost me a duplicate post.<\/p>\n<p>I&#8217;m on Bali time. My WordPress install stores everything in UTC \u2014 I checked five posts in a row this morning and every one had an identical local and GMT timestamp, so there is no offset being applied at all.<\/p>\n<p>Yesterday&#8217;s article published at 07:10 my time. WordPress stamped it <code>2026-09-17T23:10<\/code>. So when I ask the perfectly reasonable question &#8220;did anything publish since the 18th?&#8221; using my own calendar, the API answers: <strong>zero posts<\/strong>.<\/p>\n<p>Nothing is wrong. The post is live, indexed, and sitting on the homepage. But a monitoring agent reading that zero concludes the publish failed and helpfully runs it again \u2014 and now you have two of yesterday&#8217;s article. <strong>Every date filter your agent writes should be converted to the server&#8217;s timezone before it&#8217;s sent<\/strong>, not after you&#8217;ve believed the answer.<\/p>\n<h2>3. Sort your APIs into loud and silent \u2014 then only guard the silent ones<\/h2>\n<p>You don&#8217;t need this paranoia everywhere. You need it in specific places, and you can find them in about ten minutes.<\/p>\n<p>Take each API your agent touches and send it something deliberately wrong. Then watch what it hands back:<\/p>\n<ol>\n<li><strong>Loud.<\/strong> I misspelled a field name in an Airtable filter and got <code>HTTP 422 \u2014 Unknown field names<\/code>. I sent a badly formatted date to my social scheduler and got <code>HTTP 400<\/code> with the correct format spelled out in the error. These APIs defend you. Let them.<\/li>\n<li><strong>Silent.<\/strong> The same Airtable endpoint, given a valid field and a mistyped <em>value<\/em>, returned <code>200<\/code> and an empty list. A wrong-but-valid ID returns <code>200<\/code> and an empty list. A search with no hits returns <code>200<\/code> and an empty list. Three completely different situations, one identical response.<\/li>\n<\/ol>\n<p>Write the list down. Wherever a wrong question and a true &#8220;nothing&#8221; produce the same bytes, that&#8217;s where the control query from shortcut one earns its keep \u2014 and nowhere else.<\/p>\n<h2>The pattern underneath all three<\/h2>\n<p>An error is a gift. It stops the line and points at the problem. An empty result is the opposite: it is the machine declining to answer while looking exactly like it answered.<\/p>\n<p>This is the same disease as <a href=\"https:\/\/jonjones.ai\/zh\/%e4%ba%ba%e5%b7%a5%e6%99%ba%e6%85%a7%e8%87%aa%e5%8b%95%e5%8c%96\/%e6%af%8f%e6%97%a5%e5%b0%8f%e8%b2%bc%e5%a3%ab%e6%98%9f%e6%9c%9f%e4%ba%8c%e4%bb%a3%e7%90%86%e5%88%86%e9%a0%81%e8%a8%88%e6%95%b8-2026-09-15\/\">an agent that counts page one and calls it the total<\/a>, and the same reason I check that things actually <a href=\"https:\/\/jonjones.ai\/zh\/%e4%ba%ba%e5%b7%a5%e6%99%ba%e6%85%a7%e8%87%aa%e5%8b%95%e5%8c%96\/%e6%af%8f%e6%97%a5%e9%80%b1%e6%97%a5%e8%a8%ad%e5%ae%9a%e4%ba%ba%e5%b7%a5%e6%99%ba%e6%85%a7%e4%bb%a3%e7%90%86%e4%ba%a4%e4%bb%98%e6%aa%a2%e6%9f%a5-2026-09-13\/\">arrived rather than trusting that they were sent<\/a>. Different endpoints, one root cause: <strong>we keep treating a response as a result.<\/strong><\/p>\n<h2>\u4eca\u65e5\u8981\u9ede<\/h2>\n<p>Teach your agent one sentence: <em>zero is a claim, not a fact.<\/em><\/p>\n<p>Before it acts on nothing, make it prove the pipe is open with a query it can&#8217;t get wrong. Ten extra lines. It&#8217;s the difference between an agent that tells you the queue is empty and an agent that <em>knows<\/em> it is \u2014 and this week those were forty records apart.<\/p>\n<p>Want someone to walk your agent&#8217;s stack and mark every place a zero could be lying to you? <a href=\"https:\/\/jonjones.ai\/zh\/%e9%a0%90%e7%b4%84%e6%9c%83%e8%ad%b0\/\"><strong>\u9810\u7d04\u81ea\u52d5\u5316\u7b56\u7565\u6703\u8b70<\/strong><\/a> and we&#8217;ll audit it together.<\/p>\n<p>\u2014\u2014\u55ac\u6069<\/p>","protected":false},"excerpt":{"rendered":"<p>\u4eca\u5929\u65e9\u4e0a\u6211\u904b\u884c\u4e86\u5169\u6b21\u76f8\u540c\u7684 API \u8abf\u7528\uff0c\u5169\u6b21\u8abf\u7528\u4e4b\u9593\u53ea\u76f8\u5dee\u4e00\u500b\u5b57\u5143\u3002\u7b2c\u4e00\u6b21\u56de\u50b3\u4e86 40 \u7b46\u8a18\u9304\uff0c\u7b2c\u4e8c\u6b21\u56de\u50b3\u4e86 0 \u7b46\u8a18\u9304\u3002\u8868\u76f8\u540c\uff0c\u9375\u76f8\u540c\uff0c\u7b2c\u4e8c\u500b\u5b57\u5143\u4e5f\u76f8\u540c\u3002\u552f\u4e00\u7684\u5dee\u5225\uff1a\u4e00\u500b\u2026<\/p>","protected":false},"author":2,"featured_media":6955,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[44],"tags":[],"class_list":["post-6956","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-automation"],"taxonomy_info":{"category":[{"value":44,"label":"AI Automation"}]},"featured_image_src_large":["https:\/\/jonjones.ai\/wp-content\/uploads\/2026\/09\/daily-saturday-shortcuts-ai-agent-silent-failure-20260919.jpg",1344,752,false],"author_info":{"display_name":"Jon Jones","author_link":"https:\/\/jonjones.ai\/zh\/author\/jonjonjones-ai\/"},"comment_info":0,"category_info":[{"term_id":44,"name":"AI Automation","slug":"ai-automation","term_group":0,"term_taxonomy_id":44,"taxonomy":"category","description":"","parent":0,"count":186,"filter":"raw","cat_ID":44,"category_count":186,"category_description":"","cat_name":"AI Automation","category_nicename":"ai-automation","category_parent":0}],"tag_info":false,"_links":{"self":[{"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/posts\/6956","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/comments?post=6956"}],"version-history":[{"count":0,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/posts\/6956\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/media\/6955"}],"wp:attachment":[{"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/media?parent=6956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/categories?post=6956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jonjones.ai\/zh\/wp-json\/wp\/v2\/tags?post=6956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}