{"id":20370,"date":"2026-07-20T19:41:26","date_gmt":"2026-07-20T19:41:26","guid":{"rendered":"https:\/\/www.comet.com\/site\/?p=20370"},"modified":"2026-07-22T15:15:59","modified_gmt":"2026-07-22T15:15:59","slug":"debugging-ai-agents","status":"publish","type":"post","link":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/","title":{"rendered":"Beyond the Single Trace: How We Built Agent Diagnostics for Opik"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">If you run an AI agent in production, you already know the drill. Something goes wrong, a user complains, or you just get a nagging feeling the agent isn&#8217;t behaving quite right. So you open Opik, your AI observability and <a href=\"https:\/\/www.comet.com\/site\/blog\/ai-agent-tracing\/\">agent tracing<\/a> tool, find the trace, and read through it until you spot the problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That works for debugging one trace. It doesn&#8217;t work for the thousands your agent produces in a day.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We wanted to fix that. Here&#8217;s how we built Diagnostics, our automated agent debugging tool, for Opik \u2014 and the two false starts it took to get there.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents-1024x576.jpg\" alt=\"two UI screenshots showing an agent debugging workflow where Opik surfaces a silent agent error and suggests a fix for it \" class=\"wp-image-20371\" srcset=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents-1024x576.jpg 1024w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents-300x169.jpg 300w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents-768x432.jpg 768w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents-1536x864.jpg 1536w, https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 id=\"h-the-problem-with-reading-traces-one-at-a-time\" class=\"wp-block-heading\">The Problem With Reading Traces One at a Time<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Talk to any team running agents in production and you&#8217;ll hear a version of the same workflow:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A developer, QA engineer, or end user notices something is off.<\/li>\n\n\n\n<li>They go into Opik, find the trace, and download it.<\/li>\n\n\n\n<li>They paste the trace JSON into Claude Code (or whatever LLM they have handy) to figure out what went wrong.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This works, but it&#8217;s entirely manual, and it only surfaces the one issue someone happened to trip over. The more disciplined teams also run periodic &#8220;review sessions,&#8221; where someone reads through a random sample of traces looking for patterns nobody&#8217;s reported yet. It&#8217;s a good instinct, but reading traces one at a time to spot patterns is like trying to understand a city&#8217;s traffic by watching a single car \u2014 <strong>it doesn&#8217;t scale past a handful of traces a week, and it&#8217;ll never tell you that the same tool call has been failing for a missing parameter all week, or that a prompt tweak quietly doubled how often the agent retries itself.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Worse, the failures that matter most rarely throw an exception in the first place.<\/strong> An agent that quietly retries a failing tool three times with no strategy change, or burns ten short reasoning turns without making progress, doesn&#8217;t crash \u2014 it just produces a worse, slower, or more expensive answer. That kind of silent failure is invisible from a stack trace, and fixing it might mean touching a prompt, a tool definition, the agent&#8217;s code, or something further upstream like a <a href=\"https:\/\/www.comet.com\/site\/blog\/retrieval-augmented-generation\/\">RAG<\/a> pipeline feeding it bad context. None of that shows up unless you go looking for it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We wanted an agent that goes looking for it \u2014 reading the traces so you don&#8217;t have to, and coming back with something more useful than &#8220;here&#8217;s a trace that looks weird.&#8221;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Agent Debugging Tools We Already Had to Work With<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We didn&#8217;t start from zero. Ollie, our in-house agent, already knew how to explore Opik&#8217;s traces and spans and reason about debugging them. We also had a daily report feature that would summarize a project&#8217;s overall activity \u2014 patterns, anomalies, and headline metrics for the day.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The daily report told you <em>what happened<\/em>. What we needed next was something that could tell you <em>why<\/em>, and what to do about it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">First Attempt: Point Ollie at the Outliers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Our first idea followed naturally from the daily report: a fire-and-forget agent that would dig into causes rather than just describe symptoms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We already had an endpoint that computed per-project statistics \u2014 run time, error rate, tool call counts, trace size \u2014 so we used that as a compass. The agent would pull the previous day&#8217;s statistics, flag traces that looked suspicious relative to the norm (too slow, too fast, too expensive, too cheap), and dig into just those. We built a dedicated <code>TraceInvestigationAgent<\/code> sub-agent whose only job was to go deep on one flagged trace, so the parent agent&#8217;s context stayed lean instead of filling up with full trace bodies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We tested it on the most available dataset we had: our own usage of Ollie. Which meant Ollie was investigating Ollie&#8217;s own mistakes \u2014 a genuinely fun bit of dogfooding, and every issue it found doubled as a bug report for this very project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But this approach hit a wall we couldn&#8217;t tool our way out of: <strong>we had no way to confirm findings at scale.<\/strong> If the agent flagged an issue in one trace, we had no idea whether it was a one-off fluke or something affecting every fifth request. And answering that question the obvious way \u2014 having the agent read through a large sample of yesterday&#8217;s traces one by one \u2014 was both too slow and too expensive to ever ship. We eventually ripped out the dedicated stats tool and the standalone trace-investigation agent entirely; neither survived the rework.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Rework: From Reading Traces to Querying Them<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Our first instinct for the rework was to split the agent debugging work across two models: an expensive one to generate theories, and a cheaper one to confirm them across the full dataset. We tried this locally with GLM-4.7-Flash in the &#8220;confirm at scale&#8221; role. It still wasn&#8217;t fast or cheap enough. The users who&#8217;d benefit most from Diagnostics are exactly the ones with the <em>highest<\/em> trace volume, and no matter how inexpensive the model, reading every trace one at a time doesn&#8217;t scale to that.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We also looked at pre-computing a summary for every trace at ingestion time, so confirmation would just be a lookup instead of a fresh read. That ran into the same wall from the other direction: instead of paying the cost of a cheap model once, per suspicious trace, we&#8217;d be paying it on every single trace that came in, whether anyone ever asked about it or not. At real trace volumes, that&#8217;s not a discount \u2014 it&#8217;s a much bigger bill for something most of it would never be used for.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The real breakthrough was simpler than any of that:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stop asking the agent to read the data \u2014 let it query the data instead.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Every trace and span we store lives in ClickHouse, a column-oriented database built for exactly this kind of aggregate analysis. If the agent could query it, it wouldn&#8217;t need to read a single trace to answer &#8220;how often does this actually happen?&#8221; \u2014 it could just ask.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A quick local prototype confirmed the idea immediately. Not only did the findings improve, we could see the difference in kind: some issues we&#8217;d previously flagged turned out to barely matter once we could measure their real prevalence, while others we&#8217;d have never surfaced through spot-checking turned out to be widespread.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A Query Specialist, Not a Raw Database Connection<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We didn&#8217;t hand the main agent a database connection and walk away. For production, we built a dedicated ClickHouse sub-agent \u2014 one that knows our schema, our SQL dialect quirks, and the query patterns that are efficient against our tables \u2014 and gave it a single tool: <code>clickhouse_select<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The main agent gives that sub-agent a plain-language question \u2014 &#8220;how often does a tool call fail due to a missing parameter in this window?&#8221; \u2014 and the sub-agent turns it into SQL. If a query errors or comes back empty, it reads the error, adjusts, and retries on its own, within a small turn budget. Only once it&#8217;s satisfied does it hand a tight, aggregated answer back to the main agent: a sentence describing what the numbers are, the data itself, and a caveat only when one materially changes how to read the result. No speculation, no &#8220;you might also want to check&#8221; \u2014 the sub-agent&#8217;s job ends when the data is on the page, and the main agent owns all the interpretation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That division of labor keeps the main agent&#8217;s context focused on reasoning about <em>findings<\/em> instead of query mechanics, and it means query quality doesn&#8217;t depend on the orchestrating agent&#8217;s own SQL skills.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Making Direct Database Access Safe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Giving an LLM-driven agent any path to a production database is worth being paranoid about, and we treated it that way. The clickhouse_select tool doesn&#8217;t talk to ClickHouse directly at all \u2014 it calls a purpose-built, read-only endpoint on the Opik backend, which is where the real enforcement lives:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Locked-down access, enforced server-side.<\/strong> The backend runs every query as a read-only user, scoped to the caller&#8217;s workspace and project via row policies \u2014 not something the agent&#8217;s tool code has to get right on its own.<\/li>\n\n\n\n<li><strong>A narrow, explicit table allowlist.<\/strong> Only three tables are queryable at all: <code>traces<\/code>, <code>spans<\/code>, and <code>authored_feedback_scores<\/code>. Anything else \u2014 experiments, datasets, prompts \u2014 is denied outright.<\/li>\n\n\n\n<li><strong>Dangerous SQL is rejected before it ever runs.<\/strong> Multi-statement queries, DDL\/DML, and any <code>SETTINGS<\/code> or <code>SET<\/code> clause (top-level or buried in a subquery) are rejected up front.<\/li>\n\n\n\n<li><strong>Hard resource ceilings.<\/strong> Every query is capped at 180 seconds, 8 GB of memory, and 100k result rows, so even a poorly-shaped aggregation can&#8217;t degrade the shared cluster.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Together, this means a hallucinated or malformed instruction from the main agent has nowhere to go: no write access, no cross-tenant access, no way to starve the cluster, and no table outside the three it&#8217;s allowed to see.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where it Landed: Automated Agent Debugging&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The combination worked better than we expected. The audit agent now delegates exploration to the ClickHouse sub-agent, narrows in on real patterns \u2014 repeated tool-call loops, retry storms with no strategy change, over-deliberation with no forward progress, cost or duration outliers driven by the agent&#8217;s own choices \u2014 and only reports a finding once it&#8217;s confirmed the issue affects a meaningful share of traces in the window, not just the one it happened to notice. Every finding carries a severity, a confidence level, and the trace-level evidence behind it, so a rare-but-corrupting issue doesn&#8217;t get buried under a common-but-harmless one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It also remembers. Each run re-verifies previously reported issues against fresh data \u2014 confirming ones that persist, quietly dropping ones that have fallen below the threshold, and never re-surfacing an issue a user has already marked as expected behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;ve been running it against our own Ollie usage the whole time, and it&#8217;s already caught things about our own agent that we&#8217;d missed. If you&#8217;re the kind of team that&#8217;s been pasting trace JSON into an LLM by hand or running manual review sessions to find the same patterns to debug your own AI agents, this is built for you. We&#8217;re excited to get it into more people&#8217;s hands \u2014 and if it can help us find our own bugs, hopefully it&#8217;ll do the same for yours.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Try Debugging AI Agents with Opik Free&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The new Diagnostics tool is built into the <a href=\"https:\/\/www.comet.com\/signup?from=llm\">free cloud version<\/a> of Opik, with a bank of free tokens for the Ollie agent pre-loaded, so you can try tracing and debugging your own production agent or LLM-powered application easily. Opik is designed to capture and organize all of the steps your agent takes when it runs, from user inputs to context retrieval, system prompts, tool calls, and more. From there, you have multiple tools available to test, evaluate, and monitor your agent\u2019s behavior in both development and production, so you can surface silent errors, improve performance, and optimize cost. <a href=\"https:\/\/www.comet.com\/signup?from=llm\">Try Opik free<\/a> today.&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you run an AI agent in production, you already know the drill. Something goes wrong, a user complains, or you just get a nagging feeling the agent isn&#8217;t behaving quite right. So you open Opik, your AI observability and agent tracing tool, find the trace, and read through it until you spot the problem. [&hellip;]<\/p>\n","protected":false},"author":132,"featured_media":20371,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"customer_name":"","customer_description":"","customer_industry":"","customer_technologies":"","customer_logo":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[10,65,9],"tags":[],"coauthors":[369],"class_list":["post-20370","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-industry","category-llmops","category-product"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Debugging AI Agent Traces with Diagnostics in Opik<\/title>\n<meta name=\"description\" content=\"Agents don\u2019t always produce error codes when they fail. Here&#039;s how we built Agent Diagnostics to surface silent errors from a high volume of traces.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Beyond the Single Trace: How We Built Agent Diagnostics for Opik\" \/>\n<meta property=\"og:description\" content=\"Agents don\u2019t always produce error codes when they fail. Here&#039;s how we built Agent Diagnostics to surface silent errors from a high volume of traces.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/\" \/>\n<meta property=\"og:site_name\" content=\"Comet\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cometdotml\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-20T19:41:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-22T15:15:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Petro Tiurin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Cometml\" \/>\n<meta name=\"twitter:site\" content=\"@Cometml\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Petro Tiurin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Debugging AI Agent Traces with Diagnostics in Opik","description":"Agents don\u2019t always produce error codes when they fail. Here's how we built Agent Diagnostics to surface silent errors from a high volume of traces.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/","og_locale":"en_US","og_type":"article","og_title":"Beyond the Single Trace: How We Built Agent Diagnostics for Opik","og_description":"Agents don\u2019t always produce error codes when they fail. Here's how we built Agent Diagnostics to surface silent errors from a high volume of traces.","og_url":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/","og_site_name":"Comet","article_publisher":"https:\/\/www.facebook.com\/cometdotml","article_published_time":"2026-07-20T19:41:26+00:00","article_modified_time":"2026-07-22T15:15:59+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents.jpg","type":"image\/jpeg"}],"author":"Petro Tiurin","twitter_card":"summary_large_image","twitter_creator":"@Cometml","twitter_site":"@Cometml","twitter_misc":{"Written by":"Petro Tiurin","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/#article","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/"},"author":{"name":"Mike Ranellone","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/b0df8d0db9a521af425e33f561b39c6a"},"headline":"Beyond the Single Trace: How We Built Agent Diagnostics for Opik","datePublished":"2026-07-20T19:41:26+00:00","dateModified":"2026-07-22T15:15:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/"},"wordCount":1857,"commentCount":0,"publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/#primaryimage"},"thumbnailUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents.jpg","articleSection":["Industry","LLMOps","Product"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/","url":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/","name":"Debugging AI Agent Traces with Diagnostics in Opik","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/#primaryimage"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/#primaryimage"},"thumbnailUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents.jpg","datePublished":"2026-07-20T19:41:26+00:00","dateModified":"2026-07-22T15:15:59+00:00","description":"Agents don\u2019t always produce error codes when they fail. Here's how we built Agent Diagnostics to surface silent errors from a high volume of traces.","breadcrumb":{"@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/#primaryimage","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents.jpg","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents.jpg","width":1920,"height":1080,"caption":"If you run an AI agent in production, you already know the drill. Something goes wrong, a user complains, or you just get a nagging feeling the agent isn't behaving quite right. So you open Opik, your AI observability and agent tracing tool, find the trace, and read through it until you spot the problem. That works for debugging one trace. It doesn't work for the thousands your agent produces in a day. We wanted to fix that. Here's how we built Diagnostics, our automated agent debugging tool, for Opik \u2014 and the two false starts it took to get there."},{"@type":"BreadcrumbList","@id":"https:\/\/www.comet.com\/site\/blog\/debugging-ai-agents\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.comet.com\/site\/"},{"@type":"ListItem","position":2,"name":"Beyond the Single Trace: How We Built Agent Diagnostics for Opik"}]},{"@type":"WebSite","@id":"https:\/\/www.comet.com\/site\/#website","url":"https:\/\/www.comet.com\/site\/","name":"Comet","description":"Build Better Models Faster","publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.comet.com\/site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.comet.com\/site\/#organization","name":"Comet ML, Inc.","alternateName":"Comet","url":"https:\/\/www.comet.com\/site\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","width":310,"height":310,"caption":"Comet ML, Inc."},"image":{"@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/cometdotml","https:\/\/x.com\/Cometml","https:\/\/www.youtube.com\/channel\/UCmN63HKvfXSCS-UwVwmK8Hw"]},{"@type":"Person","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/b0df8d0db9a521af425e33f561b39c6a","name":"Mike Ranellone","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/image\/47e0209bd037ec57787bae2b580d796f","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/06\/cropped-mike-ranellone-96x96.jpg","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/06\/cropped-mike-ranellone-96x96.jpg","caption":"Mike Ranellone"},"sameAs":["https:\/\/www.comet.com\/"],"url":"https:\/\/www.comet.com\/site\/blog\/author\/mikercomet-com\/"}]}},"jetpack_featured_media_url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2026\/07\/debugging-ai-agents.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/20370","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/users\/132"}],"replies":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/comments?post=20370"}],"version-history":[{"count":3,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/20370\/revisions"}],"predecessor-version":[{"id":20374,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/20370\/revisions\/20374"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media\/20371"}],"wp:attachment":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media?parent=20370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/categories?post=20370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/tags?post=20370"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/coauthors?post=20370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}