<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Blueprintd blog</title><description>Product updates, tutorials and founder notes from Blueprintd, the UK software company behind CronEcho, redphonr and more.</description><link>https://blog.blueprintd.co/</link><language>en-gb</language><atom:link href="https://blog.blueprintd.co/rss.xml" rel="self" type="application/rss+xml"/><item><title>Introducing the Blueprintd blog</title><link>https://blog.blueprintd.co/posts/introducing-the-blueprintd-blog/</link><guid isPermaLink="true">https://blog.blueprintd.co/posts/introducing-the-blueprintd-blog/</guid><description>Why Blueprintd has a blog, which products it will cover, and what kind of posts to expect from the team behind CronEcho and redphonr.</description><pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Blueprintd is the trading name of Blueprinted Ltd, a small software holding company in the UK. We build products, run them ourselves, and keep them. This blog is where we write about that work.&lt;/p&gt;
&lt;h2 id=&quot;what-we-run&quot;&gt;What we run&lt;/h2&gt;
&lt;p&gt;Five products sit under Blueprintd today. Two are aimed at teams running AI agents in production, and three serve specific industries.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;product-inline&quot; style=&quot;--accent: #1a9b8c; --accent-secondary: #e8442a;&quot; href=&quot;https://cronecho.com/?utm_source=blog&amp;#x26;utm_medium=post&amp;#x26;utm_campaign=introducing-the-blueprintd-blog&quot;&gt;&lt;span class=&quot;product-inline__dot&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;CronEcho&lt;/a&gt; watches cron jobs, background workflows and AI agents. When a job stops reporting in, or an agent runs over budget, it alerts you and keeps escalating until someone acknowledges it.&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;product-inline&quot; style=&quot;--accent: #de0f3f; --accent-secondary: #de0f3f;&quot; href=&quot;https://redphonr.vercel.app/?utm_source=blog&amp;#x26;utm_medium=post&amp;#x26;utm_campaign=introducing-the-blueprintd-blog&quot;&gt;&lt;span class=&quot;product-inline__dot&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;redphonr&lt;/a&gt; is an MCP server that lets an agent stop and ask a person before it does something risky. The agent calls one tool, a person approves or replies from Slack, SMS or a phone call, and the agent carries on with that answer.&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;product-inline&quot; style=&quot;--accent: var(--bp-blue); --accent-secondary: var(--bp-blue);&quot;&gt;&lt;span class=&quot;product-inline__dot&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;WeJoinly&lt;/span&gt; is a booking marketplace for sessions and classes in the Gulf.&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;product-inline&quot; style=&quot;--accent: var(--bp-blue); --accent-secondary: var(--bp-blue);&quot;&gt;&lt;span class=&quot;product-inline__dot&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;TAPEDITOR&lt;/span&gt; opens and edits TAP, RAP and NRTRDE files, the record formats mobile operators use to settle roaming charges.&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;product-inline&quot; style=&quot;--accent: var(--bp-blue); --accent-secondary: var(--bp-blue);&quot;&gt;&lt;span class=&quot;product-inline__dot&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;ROAM&lt;/span&gt; is a multi-agent platform for telecom roaming operations teams.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-you-will-read-here&quot;&gt;What you will read here&lt;/h2&gt;
&lt;p&gt;Four kinds of posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Announcements&lt;/strong&gt; when something ships or changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tutorials&lt;/strong&gt; that walk through a real setup, with code you can copy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Case studies&lt;/strong&gt; about how a product is used, written with the people using it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Founder notes&lt;/strong&gt; like this one, about how and why we build things the way we do.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Every post that is about a product says so and links to it. If you only care about one product, its page under &lt;a href=&quot;https://blog.blueprintd.co/products/&quot;&gt;Products&lt;/a&gt; lists everything written about it.&lt;/p&gt;
&lt;aside class=&quot;callout callout--note&quot;&gt;&lt;p class=&quot;callout__label&quot;&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The full text of every post is in the &lt;a href=&quot;https://blog.blueprintd.co/rss.xml&quot;&gt;RSS feed&lt;/a&gt;, so you can read along without visiting the site.&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;The next post explains what CronEcho does for teams running AI agents, with a working example.&lt;/p&gt;</content:encoded><dc:creator>Blueprinted Ltd</dc:creator><media:content url="https://blog.blueprintd.co/og/introducing-the-blueprintd-blog.png" medium="image" type="image/png" width="1200" height="630"/><category>Blueprintd</category><category>Company</category></item><item><title>What CronEcho does for AI agent teams</title><link>https://blog.blueprintd.co/posts/what-cronecho-does-for-ai-agent-teams/</link><guid isPermaLink="true">https://blog.blueprintd.co/posts/what-cronecho-does-for-ai-agent-teams/</guid><description>How CronEcho tracks AI agent runs, enforces budget caps and timeouts, and escalates alerts until a person on your team acknowledges them.</description><pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An agent that fails loudly is easy to deal with. The expensive ones fail quietly: they loop on a tool call for an hour, spend fifty dollars of tokens on a task worth fifty cents, or stop running altogether without anyone noticing. &lt;a class=&quot;product-inline&quot; style=&quot;--accent: #1a9b8c; --accent-secondary: #e8442a;&quot; href=&quot;https://cronecho.com/?utm_source=blog&amp;#x26;utm_medium=post&amp;#x26;utm_campaign=what-cronecho-does-for-ai-agent-teams&quot;&gt;&lt;span class=&quot;product-inline__dot&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;CronEcho&lt;/a&gt; exists to catch those.&lt;/p&gt;
&lt;p&gt;CronEcho started as a dead man’s switch for cron jobs. Your job pings a URL when it finishes, and if the ping does not arrive on time, you get an alert. Agents need the same thing plus a few more guardrails, so CronEcho now tracks them as a first-class monitor type.&lt;/p&gt;
&lt;h2 id=&quot;how-an-agent-run-is-tracked&quot;&gt;How an agent run is tracked&lt;/h2&gt;
&lt;p&gt;Each agent gets its own API key. The agent reports four lifecycle events: start, progress, complete and fail.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;&lt;img alt=&quot;Diagram of an agent run: start run, report steps, finish, with a branch to an alert on budget, timeout or failure&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1300&quot; height=&quot;500&quot; src=&quot;https://blog.blueprintd.co/_astro/cronecho-agent-run-lifecycle.C-EuLuoS_Z1xQDmh.webp&quot;&gt;&lt;figcaption&gt;The four lifecycle calls. CronEcho alerts when a run fails, breaks a limit, or never finishes.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;In Python, a run looks like this:&lt;/p&gt;
&lt;!-- TODO: confirm the public API base URL and the PATCH body field names (step, cost_usd) against the CronEcho API. --&gt;
&lt;pre class=&quot;astro-code blueprintd&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; os&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; httpx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;API &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; os&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;environ&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;CRONECHO_API_URL&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;          # from your CronEcho dashboard&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;AGENT_ID &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; os&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;environ&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;CRONECHO_AGENT_ID&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;headers &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;Authorization&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;Bearer &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;os&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;environ&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&apos;CRONECHO_AGENT_KEY&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;run &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; httpx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;API&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;/api/agents/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;AGENT_ID&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;/runs&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;, headers&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;headers).&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;run_url &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;API&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;/api/agents/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;AGENT_ID&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;/runs/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; step &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; plan&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;        result &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; execute&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(step)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;        httpx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;patch&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(run_url, headers&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;headers, json&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;step&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;: step.name, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;cost_usd&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;: result.cost})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    httpx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;run_url&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;/complete&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;, headers&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;headers)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;except&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; Exception&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; exc&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    httpx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;run_url&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;/fail&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;, headers&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;headers, json&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(exc)})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    raise&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--tip&quot;&gt;&lt;p class=&quot;callout__label&quot;&gt;&lt;strong&gt;Tip&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Report cost on every step, not only at the end. A budget cap can only stop a run it can see.&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;guardrails-you-can-set-per-agent&quot;&gt;Guardrails you can set per agent&lt;/h2&gt;
&lt;p&gt;On the Pro plan and above, each agent can have three limits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Budget cap.&lt;/strong&gt; The maximum spend for a single run. Crossing it fires an alert.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step timeout.&lt;/strong&gt; How long one step may take before CronEcho treats it as stuck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run timeout.&lt;/strong&gt; How long the whole run may take.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A run that fails, breaks one of these limits, or never reports back raises an alert.&lt;/p&gt;
&lt;h2 id=&quot;alerts-that-escalate&quot;&gt;Alerts that escalate&lt;/h2&gt;
&lt;p&gt;Alerts go to the channels you configure: email, SMS, voice call, Slack, Telegram, Discord, a webhook, PagerDuty or OpsGenie. Alert policies can escalate in steps, for example Slack first, then SMS, then a phone call to whoever is on call, until someone acknowledges.&lt;/p&gt;
&lt;aside class=&quot;callout callout--warning&quot;&gt;&lt;p class=&quot;callout__label&quot;&gt;&lt;strong&gt;Warning&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;An agent key can create and close runs for that agent. Store it like any other production secret, and use a separate agent (and key) for staging.&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;cron-jobs-still-work-the-same-way&quot;&gt;Cron jobs still work the same way&lt;/h2&gt;
&lt;p&gt;If you also have plain scheduled jobs, they need one line:&lt;/p&gt;
&lt;pre class=&quot;astro-code blueprintd&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; -fsS&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;https://cronecho.com/ping/$CRONECHO_TOKEN?status=$?&amp;#x26;duration=$ELAPSED_MS&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Agents, cron jobs and longer workflows all show up together in one monitor list.&lt;/p&gt;
&lt;h2 id=&quot;when-the-agent-should-ask-first&quot;&gt;When the agent should ask first&lt;/h2&gt;
&lt;p&gt;Monitoring tells you after something went wrong. For actions you never want an agent to take on its own, like refunds, deletes or production deploys, it should stop and ask first. That is what our second product is for:&lt;/p&gt;
&lt;aside class=&quot;product-callout&quot; style=&quot;--accent: #de0f3f; --accent-secondary: #de0f3f;&quot; aria-label=&quot;redphonr&quot;&gt;&lt;div class=&quot;product-callout__body dot-grid&quot;&gt;&lt;p class=&quot;product-callout__name&quot;&gt;redphonr&lt;/p&gt;&lt;p class=&quot;product-callout__tagline&quot;&gt;MCP-native escalation for AI agents, with human-in-the-loop alerts&lt;/p&gt;&lt;a class=&quot;button product-callout__cta&quot; href=&quot;https://redphonr.vercel.app/?utm_source=blog&amp;#x26;utm_medium=post&amp;#x26;utm_campaign=what-cronecho-does-for-ai-agent-teams&quot;&gt;Try redphonr&lt;/a&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;try-it&quot;&gt;Try it&lt;/h2&gt;
&lt;p&gt;CronEcho has a free plan. Set up one agent, send a test run, and watch the alert arrive on your phone.&lt;/p&gt;
&lt;div class=&quot;cta&quot;&gt;&lt;a class=&quot;button&quot; href=&quot;https://cronecho.com/?utm_source=blog&amp;#x26;utm_medium=post&amp;#x26;utm_campaign=what-cronecho-does-for-ai-agent-teams&quot;&gt;Start monitoring your agents&lt;/a&gt;&lt;/div&gt;</content:encoded><dc:creator>Blueprinted Ltd</dc:creator><media:content url="https://blog.blueprintd.co/og/what-cronecho-does-for-ai-agent-teams.png" medium="image" type="image/png" width="1200" height="630"/><category>AI agents</category><category>Monitoring</category><category>Tutorial</category><category>cronecho</category></item></channel></rss>