<?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: Yurii Serhiichuk</title>
    <description>The latest articles on DEV Community by Yurii Serhiichuk (@xsavikx).</description>
    <link>https://dev.to/xsavikx</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%2F3672298%2F2bc740a5-847f-4cd1-89c8-d982876a37dd.jpg</url>
      <title>DEV Community: Yurii Serhiichuk</title>
      <link>https://dev.to/xsavikx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xsavikx"/>
    <language>en</language>
    <item>
      <title>Your llms.txt guide is out of date: what v2 changed</title>
      <dc:creator>Yurii Serhiichuk</dc:creator>
      <pubDate>Mon, 24 Aug 2026 12:28:52 +0000</pubDate>
      <link>https://dev.to/xsavikx/your-llmstxt-guide-is-out-of-date-what-v2-changed-job</link>
      <guid>https://dev.to/xsavikx/your-llmstxt-guide-is-out-of-date-what-v2-changed-job</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR: llms.txt v2 landed on 10 August 2026, and two of the things the guides taught you about the format are no longer true.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The spec moved and nobody said anything
&lt;/h2&gt;

&lt;p&gt;So you added an llms.txt at some point, most likely from a guide, and it's been sitting at the root of your site ever since doing whatever it is that it does. &lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt; now reads "The /llms.txt file, v2" and carries a modified date of 10 August 2026. The whole v1 to v2 diff lives on a separate &lt;a href="https://llmstxt.org/changes.html" rel="noopener noreferrer"&gt;changes page&lt;/a&gt;, which the spec links exactly once, in a single sentence in the Background, and that's the only pointer to it you're going to get.&lt;/p&gt;

&lt;p&gt;Which means every guide written before that date describes v1 as current, because it was. That's not a criticism of the guides. The problem is the shape of this particular topic: you write your llms.txt once, the article that told you how to write it keeps ranking, and nothing anywhere tells a reader that the ground moved under it.&lt;/p&gt;

&lt;p&gt;I searched for how to write an llms.txt file while writing this, eleven days after v2 landed, and nothing on the first page of results mentions v2. Several of them carry 2026 in the title and were written this year. One from &lt;a href="https://www.2pointagency.com/blog/how-to-write-llms-txt/" rel="noopener noreferrer"&gt;6 May&lt;/a&gt; still tells you the &lt;code&gt;Optional&lt;/code&gt; block is "reserved for lower-priority content the parser can safely skip when context windows are tight". That is the first of the two things that stopped being true.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things you were told that are no longer true
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Optional section does not mean what you think
&lt;/h3&gt;

&lt;p&gt;v1 came with a tool called &lt;code&gt;llms_txt2ctx&lt;/code&gt; that expanded an llms.txt file into a context for a model, and the &lt;code&gt;Optional&lt;/code&gt; section was an instruction to that tool: these are the links you drop when the context has to be shorter. That's where "put your secondary links under Optional and agents will skip them" comes from. The tool is no longer part of the proposal, and the meaning left with it.&lt;/p&gt;

&lt;p&gt;Verbatim from the changes page:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The context-expansion tooling is no longer part of the proposal, and with it&lt;br&gt;
goes the special meaning of the &lt;code&gt;Optional&lt;/code&gt; section, which told those tools&lt;br&gt;
what to omit. Optional sections are still allowed, and remain a useful&lt;br&gt;
convention for secondary links, but they no longer carry mechanical&lt;br&gt;
semantics.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So if you structured your file around Optional because a guide told you agents skip it, they never did. The skipping was one local tool's behaviour and never a promise any agent made, and now it's not in the spec either. It's a name for a section, a useful one that the spec still recommends, but only a name.&lt;/p&gt;

&lt;p&gt;In my opinion this is barely a loss and mostly a correction. A mechanical &lt;code&gt;Optional&lt;/code&gt; was only ever real inside &lt;code&gt;llms_txt2ctx&lt;/code&gt;, and I've never seen an agent read that heading and act on it, so v2 removing the semantics changes what your file means on paper and nothing about what happens to it in practice. The thing left over is worth saying out loud though: there is now no way at all to tell an agent "this part is skippable", and that was a genuinely useful thing to be able to say.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Zero or more" means zero
&lt;/h3&gt;

&lt;p&gt;v2's Format section lists the parts of the file, and the H2 file lists are "Zero or more markdown sections delimited by H2 headers". The H1 is the one thing that has to be there, and the spec says so directly: it is "the only required section". So a file that is an H1, a blockquote summary and a paragraph of context, with no H2 anywhere in it, is a conformant llms.txt.&lt;/p&gt;

&lt;p&gt;Plenty of tooling reports that as a spec violation. Mine did. The validator I put up on 12 August, two days after v2 landed, flagged "No H2 sections" with its basis set to &lt;code&gt;spec&lt;/code&gt;, and in the same run it told you the &lt;code&gt;Optional&lt;/code&gt; section was reserved by the spec for secondary links. Both of those were wrong on the day they shipped, and both were fixed on the 16th. A file with no H2 sections is still a file an agent can do nothing with, so it's worth a warning, but the warning is about practice and not about the spec, and labelling it wrong is how you get people restructuring files that were fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What v2 actually adds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Link relations for discovery.&lt;/strong&gt; This is the one the changes page says people asked for most. Given a page, how does a client find its markdown version, or the llms.txt that covers it, without guessing at URLs? v2 answers with standard relations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Link: &amp;lt;/docs/page.html.md&amp;gt;; rel="alternate"; type="text/markdown", &amp;lt;/docs/llms.txt&amp;gt;; rel="describedby"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;rel="alternate" type="text/markdown"&lt;/code&gt; points at a page's markdown version and &lt;code&gt;rel="describedby"&lt;/code&gt; points at the llms.txt file that covers it. The clause worth reading twice is that these "can be provided as HTML &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; elements, or as an HTTP &lt;code&gt;Link:&lt;/code&gt; response header. The header form also works for non-HTML resources, such as the markdown files themselves, and can be added in web server or CDN configuration without modifying any pages." So if you run a docs site behind a CDN you can ship the whole discovery half of v2 without touching a single page or redeploying anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Both markdown-twin URL forms are legal.&lt;/strong&gt; v1 allowed only &lt;code&gt;page.html.md&lt;/code&gt;, appending &lt;code&gt;.md&lt;/code&gt; to the full page URL. v2 also allows &lt;code&gt;page.md&lt;/code&gt; with the extension replaced, plus &lt;code&gt;index.html.md&lt;/code&gt; or &lt;code&gt;index.md&lt;/code&gt; for URLs without a filename. Publishing tools were already emitting the second form, and the spec blessed it rather than fighting it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subpath files finally mean something.&lt;/strong&gt; v1 let you put an llms.txt at any path and said nothing about what that path implied. v2 does:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A file covers the URLs under its path, and where more than one file applies,&lt;br&gt;
agents should use the most specific one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's also what lets you take part when you control a path and not the origin root. A GitHub Pages project site can never write into the host's &lt;code&gt;/.well-known/&lt;/code&gt;, but it can put an llms.txt in its own directory and have that mean something.&lt;/p&gt;

&lt;p&gt;Worth being precise about what that rule is and is not. It is not a search: an agent does not walk up the tree asking for files until one answers. Every file whose path is a prefix of the page's URL covers that page, and where several do, the longest path wins:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhqzhxrdbkuhzmwesjcfw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhqzhxrdbkuhzmwesjcfw.png" alt="Two llms.txt files against two pages: the root file covers every URL on the host and is the only one that applies to /r2/buckets/, while /workers/llms.txt also covers /workers/runtime-apis/ and, being the more specific file, is the one an agent uses there" width="799" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mermaid source for the diagram&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TB
    page["A page at&amp;lt;br&amp;gt;/workers/runtime-apis/"]
    other["A page at&amp;lt;br&amp;gt;/r2/buckets/"]
    root["/llms.txt&amp;lt;br&amp;gt;covers every URL on the host"]
    workers["/workers/llms.txt&amp;lt;br&amp;gt;covers /workers/ and below"]

    root -. "applies, but is less specific" .-&amp;amp;gt; page
    workers == "applies and is the most specific — an agent uses this one" ==&amp;amp;gt; page
    root == "the only file that applies" ==&amp;amp;gt; other

    classDef file fill:#dbe7fe,stroke:#2563eb,stroke-width:1px,color:#0f172a
    classDef url fill:#f2f5fa,stroke:#94a3b8,stroke-width:1px,color:#0f172a
    class root,workers file
    class page,other url
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Both files genuinely cover &lt;code&gt;/workers/runtime-apis/&lt;/code&gt;. The root one does not stop covering it because a deeper file exists — it is still the file that describes the rest of the host, and the deeper file wins only for the URLs beneath its own path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who actually does this
&lt;/h2&gt;

&lt;p&gt;I checked these with curl on 21 August 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site&lt;/th&gt;
&lt;th&gt;Root&lt;/th&gt;
&lt;th&gt;Subpath&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;developers.cloudflare.com&lt;/td&gt;
&lt;td&gt;200, 15,906 bytes&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/workers/llms.txt&lt;/code&gt; 200, 82,671 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docs.stripe.com&lt;/td&gt;
&lt;td&gt;200, 89,857 bytes&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docs.astro.build&lt;/td&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cloudflare is the one worth dwelling on. &lt;strong&gt;15,906 bytes&lt;/strong&gt; at the root and &lt;strong&gt;82,671 bytes&lt;/strong&gt; under &lt;code&gt;/workers/&lt;/code&gt; is the subpath rule doing its job in production: a small index for the whole developer site, and a big section-specific file for the part a coding agent is most likely to be deep inside already. Ask about Workers, get the Workers file, and the root file still covers everything the deeper one does not.&lt;/p&gt;

&lt;p&gt;Here's what that pair looks like from the inside, checked from the page itself:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn77zujdop5td6d0o3roy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn77zujdop5td6d0o3roy.png" alt="The llms.txt checker open beside developers.cloudflare.com/workers/, reporting that one less specific llms.txt file sits above this one and offering to check /llms.txt as well" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The note tagged &lt;code&gt;spec&lt;/code&gt; is the v2 rule stated back at you: the file at &lt;code&gt;/workers/&lt;/code&gt; covers the URLs under &lt;code&gt;/workers/&lt;/code&gt;, the root file covers everything, and an agent standing on this page takes the more specific one. Which file wins is a question you can only ask from a page, because the answer depends on which page you are standing on.&lt;/p&gt;

&lt;p&gt;One curiosity while you're in there: llmstxt.org serves its own &lt;code&gt;/llms.txt&lt;/code&gt; as &lt;code&gt;text/plain&lt;/code&gt;. The spec says nothing about content types so nothing is broken, but if your checker treats anything other than &lt;code&gt;text/markdown&lt;/code&gt; as a failure, it's going to fail the spec's own file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Astro removed theirs
&lt;/h2&gt;

&lt;p&gt;Astro deleted its files in &lt;a href="https://github.com/withastro/docs/pull/13538" rel="noopener noreferrer"&gt;withastro/docs#13538&lt;/a&gt;, titled "[i18nIgnore] Remove &lt;code&gt;llms.txt&lt;/code&gt; files", merged on 20 April 2026. &lt;code&gt;llms-full.txt&lt;/code&gt; and &lt;code&gt;llms-small.txt&lt;/code&gt; went, and &lt;code&gt;docs.astro.build/llms.txt&lt;/code&gt; is a 404 today as well. The stated reason is the one that should worry you if you maintain a docs site:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;we've seen little uptake recently in usage — these files get very little traffic&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They chose to put the effort into their &lt;a href="https://github.com/withastro/docs-mcp" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt; instead, "and perhaps in the future offer per-page Markdown content", then signed off with "AI trends move quickly". The PR also shows what the files were costing them, flagged as "anecdotal obviously": two Netlify builds, 5m 6s with the files and 4m 22s without.&lt;/p&gt;

&lt;p&gt;Two dates matter here. The removal is April and v2 is August, so what Astro measured was v1, and v1 gave an agent no way to find the file other than guessing the URL. Discovery is the exact hole v2 spends most of its new text filling. So I wouldn't read "very little traffic" as a verdict on the idea. I read it as a verdict on a file nobody could find.&lt;/p&gt;

&lt;p&gt;That half-sentence about per-page Markdown aged strangely well. Astro walked out in April saying what they'd rather have is Markdown per page. Four months later the headline additions in v2 are markdown twins per page, plus the link relations that make them findable.&lt;/p&gt;

&lt;p&gt;What v2 still doesn't do, and I'm not sure a text file at a well-known path ever can, is give an agent a reason to prefer your llms.txt over just fetching the page. Astro's answer to that was MCP, where the agent is handed the tool rather than having to go looking for a file, and that's a stronger position than a filename convention has ever been. Both things can be true: v2 is a real improvement, and the harder question is still open.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do about it
&lt;/h2&gt;

&lt;p&gt;None of this takes long. If your file has an Optional section that you picked for mechanical reasons, keep the name if you like it but stop expecting it to do anything. If your pages have markdown twins, add the relations: one &lt;code&gt;&amp;lt;link rel="describedby"&amp;gt;&lt;/code&gt; and one &lt;code&gt;&amp;lt;link rel="alternate" type="text/markdown"&amp;gt;&lt;/code&gt;, or the same thing as a &lt;code&gt;Link:&lt;/code&gt; header at the CDN if you'd rather not go near the templates. serhiichuk.dev emits the &lt;code&gt;describedby&lt;/code&gt; one on every page. And if your docs live under a path, an llms.txt at that path now has a defined meaning, so a large section-specific file sitting next to a small root one is a shape the spec understands rather than a shape you're getting away with.&lt;/p&gt;

&lt;p&gt;What none of it buys you is search ranking. No engine has said it uses llms.txt for anything, and anyone who tells you otherwise is guessing.&lt;/p&gt;

&lt;p&gt;I keep a checker for all of this at &lt;a href="https://serhiichuk.dev/tools/llms-txt/" rel="noopener noreferrer"&gt;serhiichuk.dev/tools/llms-txt&lt;/a&gt; — it validates against v2 and labels every finding as spec, convention or hygiene, so you can decide which ones you care about. There's &lt;a href="https://serhiichuk.dev/tools/llms-txt/#extension" rel="noopener noreferrer"&gt;a Chrome extension&lt;/a&gt; as well, which runs the same rules against the tab you're on. That one exists because half of v2 is discovery, and the link relations live on the page rather than in the file — so a checker that only ever fetches a URL is looking in the wrong place for them. It also reaches what a hosted checker cannot: a staging host, an intranet address, anything that is not on the open internet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>documentation</category>
      <category>llmstxt</category>
    </item>
    <item>
      <title>Building an Autonomous SRE Agent with Google ADK and the Antigravity SDK</title>
      <dc:creator>Yurii Serhiichuk</dc:creator>
      <pubDate>Thu, 09 Jul 2026 16:58:44 +0000</pubDate>
      <link>https://dev.to/gde/building-an-autonomous-sre-agent-with-google-adk-and-the-antigravity-sdk-1fgl</link>
      <guid>https://dev.to/gde/building-an-autonomous-sre-agent-with-google-adk-and-the-antigravity-sdk-1fgl</guid>
      <description>&lt;p&gt;One of the most stressful parts of being an on-call engineer is triaging a production incident in the middle of the night. Modern distributed systems amplify the pain with extra cognitive overload of, well, the distributed systems: logs scattered across dozens of microservices, traces potentially stored in multiple different locations and a dozen of observability tools and dashboards on hand. While this (usually) makes total sense for SREs to design and develop this the way it is (maybe because of the costs or being knowledgeable in this or that tool, or just optimizing for a particular concern), this adds a lot of load for any on-call engineer.&lt;/p&gt;

&lt;p&gt;So in era of AI, it makes total sense to get some aid from the autonomous and smart systems that are fine-tuned for your setup, that remember all the bits and pieces that are suitable for your infrastructure.&lt;/p&gt;

&lt;p&gt;In this post I'm trying to go over a blueprint of such an autonomous SRE system - an AI agent that can be hosted near your main system and fine tuned to work with a set of tools you use.&lt;/p&gt;

&lt;p&gt;I will be using Google &lt;a href="https://adk.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Agent Development KIT (ADK)&lt;/strong&gt;&lt;/a&gt; for multi-agent diagnostic &lt;em&gt;reasoning&lt;/em&gt; and &lt;a href="https://antigravity.google/product/antigravity-sdk" rel="noopener noreferrer"&gt;&lt;strong&gt;Google Antigravity SDK&lt;/strong&gt;&lt;/a&gt; for the agent &lt;em&gt;runtime&lt;/em&gt; - tool wiring, easy-to-apply safety policies and agentic orchestration. The setup will be deployed as a set of Google Cloud Run services but while being containerized can be easily ported to any other containerized platform. The entire stack runs locally as well with &lt;strong&gt;zero GCP credentials&lt;/strong&gt; in a mock-telemetry mode, so you can try it in under a minute.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Architecture: Reasoning + Safety
&lt;/h2&gt;

&lt;p&gt;A proper SRE assistant has to get two things right at once: &lt;strong&gt;reasoning orchestration&lt;/strong&gt; (which diagnostic step happens when) and &lt;strong&gt;environmental safety&lt;/strong&gt; (the agent must never be able to mutate production while it pokes around). The blueprint splits these concerns across four small Fast API services that talk to each other over &lt;a href="https://a2a-protocol.org/latest/" rel="noopener noreferrer"&gt;Agent-To-Agent protocol&lt;/a&gt; with results being streamed back as &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events" rel="noopener noreferrer"&gt;Server-Sent Events (SSE)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv2yubd6sawo7c6i2xbjc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv2yubd6sawo7c6i2xbjc.png" alt="Architecture: the Orchestrator's only capability is to delegate to the read-only SRE sub-agent" width="800" height="1354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm using Google Antigravity SDK as an orchestrator and front-facing agent while it provides superior safety gates out of the box and is smart-enough to handle user requests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;safety_policies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;deny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# nothing is allowed by default
&lt;/span&gt;    &lt;span class="nf"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;diagnose_sre&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# …except delegating to the SRE sub-agent
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The config above basically gates whatever tools we want to allow for the agent to use.&lt;/p&gt;

&lt;p&gt;And Google ADK agents fulfill the diagnostic workflows. ADK v2 which I am using is graph-based and the SRE sub-agent runs two-node graph:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TraceAnalyzer&lt;/strong&gt; - scans recent trace summaries, filters for transactions that errrored or breached the latency budget (&amp;gt;5000ms), and isolates the single failing &lt;code&gt;traceId&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LogCorrelator&lt;/strong&gt; pulls the spans and the logs tagged with that &lt;code&gt;traceId&lt;/code&gt;, then reasons over them with metric queries, cascade analysis, and post-mortem generation tools to produce the root-case report.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The third agent is an inventory agent that aids the SRE with aggregated knowledge of resources available in the GCP project. This helps grounding diagnostics and makes sure the agent works against particular resources instead of trying to look around too much.&lt;/p&gt;




&lt;h2&gt;
  
  
  Anatomy of a Diagnosis
&lt;/h2&gt;

&lt;p&gt;When an alert fires, here's what actually is going to happen end to end from the on-call prompt to a finished post-mortem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqyj8h1ho0pzr9xuij0rr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqyj8h1ho0pzr9xuij0rr.png" alt="End-to-end diagnosis sequence from alert to post-mortem" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Orchestrator does the one thing its policy allows: it hands the problem to the SRE sub-agent and steps back. From there the sub-agent streams its progress back as Server-Sent Events, so the on-call engineer watches the investigation unfold live instead of waiting on a spinner.&lt;/p&gt;

&lt;p&gt;It starts by pulling the project topology — which services exist, how they call each other, and where their databases sit — from the Inventory agent's Firestore-backed cache; that map tells the diagnosis where to look. It then fetches the recent traces and runs them through the two-node graph: &lt;code&gt;TraceAnalyzer&lt;/code&gt; collapses thousands of spans down to the single failing trace worth investigating, and &lt;code&gt;LogCorrelator&lt;/code&gt; pulls every span and log line sharing that trace's ID to name the actual root cause — not just &lt;em&gt;"the database was slow,"&lt;/em&gt; but which span failed, with which error, and why.&lt;/p&gt;

&lt;p&gt;Only then does it run the cascade analysis and draft the post-mortem, streaming the finished report back through the Orchestrator to the chat UI, where it lands as a rendered dashboard with a one-click download.&lt;/p&gt;

&lt;p&gt;The beauty of such approach is extensibility of the setup. You can add new sub-agents or expand existing tools easily with ADK and A2A protocol.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deep Dive: Cascade Latency &amp;amp; Bottleneck Analysis
&lt;/h2&gt;

&lt;p&gt;In order to showcase the agent, I have also built another Fast API service that emulates real database errors with timeout exceptions and telemetry spans. As it is just a simulation, quite a lot of actual problems are quite similar to this one and frequently the initial gateways/backends latency or errors are hidden downstream. But of course this is a textbook example still: a gateway request that looks 10-second-slow, but where 99% of the time is actually trapped in a database call three levels down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddi3p30ktkl37pa495ng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddi3p30ktkl37pa495ng.png" alt="Trace waterfall: gateway, backend and database all look ~10s inclusive; the database is the real bottleneck" width="800" height="249"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;All three spans look ~10 s slow (inclusive), but the red /api/database bar is where the time is actually spent.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The cascade-analysis tool builds the span parent/child map and computes, for every span:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inclusive duration&lt;/strong&gt; — wall-clock time of the span including its children.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exclusive (self) duration&lt;/strong&gt; — the active time spent in that span alone:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ExclusiveTime(s) = InclusiveTime(s) - sum of InclusiveTime(children)&lt;/p&gt;

&lt;p&gt;The span with the largest exclusive time is the true bottleneck. Here is the &lt;strong&gt;actual, verified output&lt;/strong&gt; from incident simulator (available in the repo):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### 🔍 Span Latency Breakdown
Service / Span Name     Span ID             Parent ID           Status   Inclusive Time   Exclusive (Self) Time   Contribution
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
/api/gateway            span-gateway-111    None                ERROR    10270 ms         20 ms                   0.2%
  └── /api/backend      span-backend-222    span-gateway-111    ERROR    10250 ms         50 ms                   0.5%
      └── /api/database span-database-333   span-backend-222    ERROR    10200 ms         10200 ms                99.3%

### 🚨 Identified Bottleneck
*   Bottleneck Span:     /api/database (span-database-333)
*   Self-Execution Time: 10200 ms (99.3% of total trace)
*   Status:              ERROR
*   Error Message:       ConnectionTimeoutError: Failed to connect to db-primary.gcp.internal:5432 after 10000ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gateway and backend each look "slow" at 10 s inclusive, but their &lt;em&gt;self&lt;/em&gt; time is a rounding error. The agent ignores the noise and points straight at &lt;code&gt;/api/database&lt;/code&gt; — 99.3% of the budget, burned in a single connection timeout.&lt;/p&gt;




&lt;h2&gt;
  
  
  Automated Post-Mortem &amp;amp; One-Click Export
&lt;/h2&gt;

&lt;p&gt;Diagnosis is only half the job; the deliverable on-call engineers actually need is a &lt;strong&gt;post-mortem&lt;/strong&gt;. After the cascade analysis, a post-mortem generator drafts a complete Markdown document with an Incident Overview (time, root service, Trace ID, impact duration), a Timeline, a Root Cause Analysis, and a Prevention Plan — all populated from the real trace and log data.&lt;/p&gt;

&lt;p&gt;That Markdown is then rendered via &lt;a href="https://a2ui.org/" rel="noopener noreferrer"&gt;A2UI protocol&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1rmdbugccn6x3uibgmpj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1rmdbugccn6x3uibgmpj.png" alt="Post-mortem markdown flows through a translator to a client-side download button" width="796" height="65"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;From SRE report markdown to a one-click, client-side post-mortem download.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A server-side translator spots the post-mortem heading and appends a download-button component; the browser renders it as a styled button that builds the file entirely in the browser — no server round-trip — from the Markdown it already holds.&lt;/p&gt;

&lt;p&gt;One click exports &lt;code&gt;post_mortem.md&lt;/code&gt;, ready to drop into your incident-review wiki.&lt;/p&gt;

&lt;p&gt;And here is how this actually looks like in the deployed UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3w9z61mtbj361a66o5en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3w9z61mtbj361a66o5en.png" alt="SRE agent chat UI" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Least-Privilege IAM on Cloud Run
&lt;/h2&gt;

&lt;p&gt;Handing an autonomous agent unrestricted cloud access is a non-starter. The deploy pipeline gives each Cloud Run service its &lt;strong&gt;own service account&lt;/strong&gt; with the narrowest possible role set:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx6jfesymipmbx8xenzpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx6jfesymipmbx8xenzpg.png" alt="Least-privilege IAM: a write-only app service account vs a read-only agent service account" width="800" height="877"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The write-only target app and the read-only SRE agent can never act on each other's plane.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The split is the whole point: the app that &lt;em&gt;generates&lt;/em&gt; the chaos can only ever &lt;strong&gt;write&lt;/strong&gt; telemetry, and the agent that &lt;em&gt;investigates&lt;/em&gt; it can only ever &lt;strong&gt;read&lt;/strong&gt;. Neither can act on the other's plane. (The deploy also provisions an &lt;code&gt;inventory-agent-sa&lt;/code&gt; for topology discovery and a dedicated &lt;code&gt;sre-build-sa&lt;/code&gt; for Cloud Build, each similarly scoped.)&lt;/p&gt;


&lt;h2&gt;
  
  
  Try It Yourself in 60 Seconds
&lt;/h2&gt;

&lt;p&gt;You can run the entire scan → correlate → analyze → post-mortem loop locally. &lt;strong&gt;No GCP account or credentials required.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone the repo&lt;/span&gt;
git clone https://github.com/xSAVIKx/sre-agent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;sre-agent

&lt;span class="c"&gt;# 2. Install uv and sync the workspace (app, agent, sre_agent, inventory_agent, sre_common)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;uv
uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--all-packages&lt;/span&gt;

&lt;span class="c"&gt;# 3. Run the incident simulation&lt;/span&gt;
uv run simulate_incident.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The simulation triggers a database-timeout incident in the target app, writes mock traces and logs to &lt;code&gt;mock_telemetry_data/&lt;/code&gt;, boots the Orchestrator in mock mode, runs the diagnostic workflow in-process, and prints the report to your terminal. You will see the structured telemetry logs (gateway → backend → database, ending in a &lt;code&gt;CRITICAL ConnectionTimeoutError&lt;/code&gt;) followed by the full diagnosis: the &lt;strong&gt;99.3% &lt;code&gt;/api/database&lt;/code&gt; bottleneck table&lt;/strong&gt; and the complete &lt;strong&gt;&lt;code&gt;# 🚨 Incident Post-Mortem&lt;/code&gt;&lt;/strong&gt; shown above.&lt;/p&gt;

&lt;p&gt;Want the full multi-service experience with the web chat UI? &lt;code&gt;docker-compose up --build&lt;/code&gt; brings up the Orchestrator, SRE agent, Inventory agent, a Firestore emulator, and the target app together — then open the chat at &lt;code&gt;/chat&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Resources
&lt;/h2&gt;

&lt;p&gt;The complete, runnable source — plus a step-by-step &lt;a href="https://github.com/xSAVIKx/sre-agent/blob/HEAD/CODELAB.md" rel="noopener noreferrer"&gt;&lt;strong&gt;CODELAB&lt;/strong&gt;&lt;/a&gt; that builds this from scratch — lives on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 &lt;a href="https://github.com/xSAVIKx/sre-agent" rel="noopener noreferrer"&gt;github.com/xSAVIKx/sre-agent&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>sre</category>
      <category>antigravity</category>
    </item>
    <item>
      <title>Open Knowledge Format - portable digital map of your data as code</title>
      <dc:creator>Yurii Serhiichuk</dc:creator>
      <pubDate>Mon, 15 Jun 2026 07:38:08 +0000</pubDate>
      <link>https://dev.to/gde/open-knowledge-format-portable-digital-map-of-your-data-as-code-26n9</link>
      <guid>https://dev.to/gde/open-knowledge-format-portable-digital-map-of-your-data-as-code-26n9</guid>
      <description>&lt;p&gt;Yesterday Google dropped an &lt;a href="https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing" rel="noopener noreferrer"&gt;article&lt;/a&gt; describing an interesting idea - a portable format for knowledge sharing as markdown. This is not new or unique (llm wiki, obsidian values and even agents/claude.md are similar concepts). What stands out here is the openness of the proposed standard (also, just a v0.1 draft now) and actual ability of Google to make it a de-facto standard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3hr9dpq0h2nnhbtdhsi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3hr9dpq0h2nnhbtdhsi.png" alt="OKF google blog post" width="799" height="611"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I've spent quite some time as GDE and AI integrator helping teams wire data into the LLM agents, and I keep hitting the same wall. The model is brilliant and the data is right there, but the &lt;strong&gt;knowledge about the data&lt;/strong&gt;  - what a table means, how a metric is defined or why a column was deprecated is, unfortunately, scattered across hundreds of different places. Something is available in company google docs or drive, the other things are available directly in readme and the extra missing piece is actually in that one engineer's head. Unfortunately, we can't write a connector for the last piece, but as Sam McVeety and Amir Hormati highlights in the blogpost we can at least help the agents (and developers) navigate through such knowledge better by introducing some shared and well known way of sharing the knowledge. And don't get me wrong, almost every team has probably already solved this in that or another proprietary way, rebuilding that same plumbing again and again from scratch.&lt;/p&gt;

&lt;p&gt;OKF's wager against that mess is almost provocatively simple. If you can &lt;code&gt;cat&lt;/code&gt; a file, you can read it. If you can &lt;code&gt;git clone&lt;/code&gt; a repository, you can ship it. The spec only enforces one field to be explicitly provided - type&amp;nbsp;, and that's exactly the trick: standardize only the smallest possible interoperability surface while leaving everything else to the people producing the data.&lt;/p&gt;




&lt;p&gt;The reference repository indeed provides only the bare minimum - a pretty simple &lt;a href="https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/4c40ef103cd7dd9ca978bbb190fc795cfde4f7c3/okf/SPEC.md" rel="noopener noreferrer"&gt;spec&lt;/a&gt;, example agent (which is BigQuery-oriented and pretty opinionated) and some sample bundles. And while this is a great starter pack, the idea of OKF how I see it is that knowledge lives &lt;em&gt;everywhere&lt;/em&gt;. My SQLite file has knowledge. My Postgres instance has knowledge. My &lt;code&gt;~/notes&lt;/code&gt; folder and my Git history as well. If OKF is going to be a lingua franca, it needs producers for the messy real data the most of us actually work with, and it needs consumers that are not tied to any one vendor's agent.&lt;/p&gt;

&lt;p&gt;So I built that: the &lt;a href="https://github.com/xSAVIKx/okf-skills" rel="noopener noreferrer"&gt;OKF Skills&lt;/a&gt;, a vendor-neutral fleet of producers and consumers for OKF.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftksrewfbhyhlcajxzfb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftksrewfbhyhlcajxzfb8.png" alt="OKF viz screenshot" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The idea is simple - any source in, any agent out.&lt;/p&gt;

&lt;p&gt;What I built already is just a small baseline that I hope would be useful moving forward. That's six connectors - SQLite, MySQL, PostgreSQL, BigQuery, the local file system and Git. Each is a single portable Go binary with the same three commands: &lt;code&gt;produce&lt;/code&gt; a bundle from the source, &lt;code&gt;ingest&lt;/code&gt; a bundle to verify it (or --sync curated descriptions back to the source), and &lt;code&gt;schema&lt;/code&gt; to describe itself. The SQL connectors can embed a per-column data profile and sample rows right in the concept docs.&lt;/p&gt;

&lt;p&gt;Then three guidance skills with zero extra runtime. &lt;code&gt;reader&lt;/code&gt; teaches an agent how to traverse any OKF bundle cheaply (index first, frontmatter only, grep before you read). The &lt;code&gt;enricher&lt;/code&gt; teaches your harness to write good descriptions grounded in the schema, profile, and samples. And finally the &lt;code&gt;producer-generator&lt;/code&gt; to bootstrap other connectors real fast.&lt;/p&gt;

&lt;p&gt;I also decided to rebuild the visualizer Google team embedded into their agent. The &lt;code&gt;viz&lt;/code&gt; renders any bundle into a single self-contained index.html near your OKF data. It produces a three-pane explorer with an interactive graph, navigator and content reader. Now there's no need to reach for Google-provided agent just to create a visualization if you just want that.&lt;/p&gt;

&lt;p&gt;Finally, there's the mcp server that is capable of discovering every installed connector and exposes them as relevant tools. Point Claude Code or Antigravity at it and you're ready to rock. You can install all of them today with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add xSAVIKx/okf-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you should be able to just ask your harness nicely to create, enrich and visualize the OKF bundle.&lt;/p&gt;




&lt;p&gt;I hope this agentic tooling would allow the community to embrace the new format and truly make it a widely used standard. And also warmly welcome any new contributions to the existing connectors.&lt;/p&gt;

&lt;p&gt;Useful links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing" rel="noopener noreferrer"&gt;Introducing the Open Knowledge Format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/GoogleCloudPlatform/knowledge-catalog/tree/main/okf" rel="noopener noreferrer"&gt;OKF GitHub repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xSAVIKx/okf-skills" rel="noopener noreferrer"&gt;OKF-skills repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xsavikx.github.io/okf-skills" rel="noopener noreferrer"&gt;OKF-skills visualization demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agentskills</category>
      <category>openknowledgeformat</category>
      <category>googlecloud</category>
    </item>
  </channel>
</rss>
