<?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: RevOS</title>
    <description>The latest articles on DEV Community by RevOS (@revos_ai).</description>
    <link>https://dev.to/revos_ai</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%2F4056124%2F229c4835-17cb-41a8-aa51-cdaba23b9421.png</url>
      <title>DEV Community: RevOS</title>
      <link>https://dev.to/revos_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/revos_ai"/>
    <language>en</language>
    <item>
      <title>Why I Failed the DP-700 Exam, and How I Passed It</title>
      <dc:creator>RevOS</dc:creator>
      <pubDate>Mon, 26 Oct 2026 10:47:03 +0000</pubDate>
      <link>https://dev.to/revos_ai/why-i-failed-the-dp-700-exam-and-how-i-passed-it-poo</link>
      <guid>https://dev.to/revos_ai/why-i-failed-the-dp-700-exam-and-how-i-passed-it-poo</guid>
      <description>&lt;p&gt;&lt;em&gt;By Viktor Goloubovsky, data engineer at RevOS&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I passed practice exams for the DP-700 (Microsoft Fabric Data Engineer Associate) at 80-90%+ accuracy, then failed the real exam by 30 points.&lt;/li&gt;
&lt;li&gt;The gap wasn't knowledge. It was studying for recognition (matching a question to a memorized answer) instead of retrieval: reasoning from requirements to a conclusion under exam-like pressure.&lt;/li&gt;
&lt;li&gt;Cognitive science backs this up. Retrieval practice (being tested) builds durable, transferable knowledge better than restudying does, especially over time, a finding known as the testing effect.&lt;/li&gt;
&lt;li&gt;On the retake, I changed almost nothing about what I knew and everything about how I engaged with the material: reasoning from constraints instead of matching keywords, and moving fast instead of perfecting every answer.&lt;/li&gt;
&lt;li&gt;The same gap shows up in technical interviews, system design reviews, and picking up a new tool on the job. Recognizing an answer is the easy part; retrieving and applying it under pressure is the actual skill.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When I joined RevOS earlier this year, part of my probation period was agreeing to get the &lt;strong&gt;DP-700 certification&lt;/strong&gt;, Microsoft's Fabric Data Engineer Associate exam. I was excited. I'd passed certification exams before, I had some data engineering background, and I gave myself a month to prepare.&lt;/p&gt;

&lt;p&gt;Ten weeks and dozens of practice tests later, I sat the real DP-700 exam confident I'd pass. I didn't. I found out afterward that the problem was never how much Fabric I knew. It was that I had spent ten weeks training the wrong skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I prepared
&lt;/h2&gt;

&lt;p&gt;My real gap going in was practical: I'd only recently started using Fabric, and while I had some data engineering experience, I knew how steep this learning curve could get. I lined up a mix of theory and practice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Theory&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Microsoft Learn DP-700T00-A course&lt;/li&gt;
&lt;li&gt;Aleksi Partanen's DP-700 exam-prep series on YouTube&lt;/li&gt;
&lt;li&gt;Fabric's official documentation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Practice&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Microsoft's DP-700T00-A practice labs&lt;/li&gt;
&lt;li&gt;Microsoft's practical assessments&lt;/li&gt;
&lt;li&gt;Certiace's DP-700 exam practice questions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I gave myself a month, then extended it by six weeks once I realized how much ground Fabric actually covers. Data engineering, real-time analytics, governance, and lifecycle management are each their own discipline with their own tools and patterns. Trying to get comfortable with all of them in four weeks had been wishful thinking.&lt;/p&gt;

&lt;p&gt;I diversified my practice as I went. Microsoft's own practical assessments were reassuring (I consistently cleared the 80% pass threshold) but also a little unsettling, because the questions felt easier than what other candidates described from the real exam. So I added Certiace, a third-party practice platform with tougher, more scenario-based questions. It recalibrated me. I regularly finished Certiace mock exams above 90%, sometimes recognizing the right answer before I'd even finished reading the question.&lt;/p&gt;

&lt;p&gt;By exam day, I felt ready. In hindsight, that confidence was measuring the wrong thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first attempt
&lt;/h2&gt;

&lt;p&gt;I sat the exam, worked carefully through it, and looked up anything I was unsure of. &lt;a href="https://learn.microsoft.com/en-us/credentials/certifications/resources/study-guides/dp-700" rel="noopener noreferrer"&gt;DP-700 is open-book to Microsoft Learn and Fabric documentation&lt;/a&gt;, so that's allowed. But the questions were a different animal from my practice sets: long, scenario-based, with several almost-identical answer options that all sounded technically correct.&lt;/p&gt;

&lt;p&gt;I answered every question. I failed anyway: &lt;a href="https://learn.microsoft.com/en-us/credentials/certifications/resources/study-guides/dp-700" rel="noopener noreferrer"&gt;the pass threshold is 700 out of 1,000 points, 70%&lt;/a&gt;, and I landed 30 points short.&lt;/p&gt;

&lt;p&gt;Thirty points is a strange number to sit with. It's close enough to feel like bad luck, far enough to know it wasn't. I'd proven the exam was passable. I just hadn't figured out what I was actually being tested on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why practice tests didn't prepare me
&lt;/h2&gt;

&lt;p&gt;Looking back at what went wrong, four things stood out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Theory versus practice.&lt;/strong&gt; I'd focused on learning Fabric's architecture and features, not on applying them to messy, real-life scenarios. Theory matters, but DP-700 tests how you'd handle a specific situation with specific constraints: the gap between watching driving tutorials and actually driving.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mindset.&lt;/strong&gt; I stressed over unfamiliar questions instead of expecting them. Even experienced candidates report hitting confusing questions on DP-700. That's the nature of the exam, not a sign you're unprepared.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The open-book trap.&lt;/strong&gt; Being allowed to look things up in Microsoft Learn sounds like a safety net. In practice, the documentation is enormous and its search is mediocre, so leaning on it costs real exam time, and I leaned on it far more than I needed to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time management.&lt;/strong&gt; Around 40 questions in 100 minutes sounds generous. It stops feeling that way when you're 40 minutes from the end with 20 questions and a case study still to go. I spent my first 12 minutes on 3 questions before I course-corrected, and that early pace never fully recovered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those was a symptom. The actual cause was one thing: I had trained &lt;strong&gt;recognition&lt;/strong&gt;, not &lt;strong&gt;retrieval&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Recognition is what a flashcard trains. You see a question about low-code transformations and your brain immediately says "Dataflow Gen2" (Fabric's low-code transformation tool), because you've matched the pattern before. That works on practice tests built around the same handful of scenarios. It falls apart on a question like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A company has business analysts maintaining daily CSV transformations. Which approach best satisfies maintainability requirements?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Recognition alone doesn't answer that. You have to reason: "business analysts" signals a preference for low-code over hand-written pipelines, Dataflow Gen2 handles CSV sources well, so it fits the stated requirement better than the alternatives. That's &lt;strong&gt;retrieval&lt;/strong&gt;: reconstructing an answer from constraints, not recalling one from memory.&lt;/p&gt;

&lt;p&gt;This distinction isn't just my own theory. Cognitive scientists Henry Roediger and Jeffrey Karpicke showed in a now-canonical &lt;a href="https://journals.sagepub.com/doi/10.1111/j.1467-9280.2006.01693.x" rel="noopener noreferrer"&gt;2006 study in &lt;em&gt;Psychological Science&lt;/em&gt;&lt;/a&gt; that being tested on material (retrieval practice) produces meaningfully better long-term retention than restudying the same material, a finding they call the &lt;strong&gt;testing effect&lt;/strong&gt;. The advantage grows the longer the delay before you actually need the knowledge. Their finding cuts against instinct: restudying can &lt;em&gt;feel&lt;/em&gt; more effective in the moment, which is exactly the trap. Recognition feels like mastery. Only retrieval proves it. Psychologists call the gap between the two the &lt;strong&gt;illusion of competence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;My practice tests weren't teaching me to retrieve. They were teaching me to recognize a smaller set of question shapes than the real exam actually contains.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I changed for the retake
&lt;/h2&gt;

&lt;p&gt;I didn't relearn Fabric. I changed how I engaged with what I already knew.&lt;/p&gt;

&lt;p&gt;Instead of asking &lt;em&gt;"What's the correct answer?"&lt;/em&gt; while studying, I started asking: &lt;em&gt;"What requirement is this question actually implying? Why this answer instead of another technically valid one? What trade-off does each option make, and does it contradict the stated constraints?"&lt;/em&gt; That single shift reshaped the rest of my preparation. I was reasoning from workload, constraints, and intended architecture instead of matching keywords to memorized labels.&lt;/p&gt;

&lt;p&gt;I also changed my exam strategy. Rather than trying to perfect every answer, I moved quickly through the ones I wasn't sure about: read the scenario, identify the real requirement, weigh the trade-offs, commit, and flag it for review if genuine doubt remained. When I circled back to flagged questions, I unmarked more than half of them within seconds, a level of trust in my own reasoning I didn't have on my first attempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second attempt
&lt;/h2&gt;

&lt;p&gt;The questions weren't easier. They just weren't unfamiliar anymore. I'd already met Microsoft's style of scenario-writing once, and instead of treating every ambiguous case as something to research, I accepted the ambiguity as part of the format and reasoned my way through it.&lt;/p&gt;

&lt;p&gt;I still finished the standalone questions with only about ten minutes to spare before the case study. DP-700 is genuinely time-intensive, no matter how well you manage it. But I reached the case study locked-in instead of rattled, and I still checked Microsoft Learn a few times to confirm syntax details in PySpark (Spark's Python API) and KQL (Fabric's query language for real-time data), not to discover concepts I'd never seen.&lt;/p&gt;

&lt;p&gt;This time, I passed.&lt;/p&gt;

&lt;p&gt;I don't think I learned dramatically more Fabric between attempts. I closed a few real knowledge gaps, but the bigger change was learning to use the knowledge I already had, under the same time pressure and ambiguity the exam actually tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters beyond a Microsoft exam
&lt;/h2&gt;

&lt;p&gt;The recognition-versus-retrieval gap isn't specific to DP-700, or to certifications at all. It's the same reason a candidate who "knows" a system-design pattern cold on paper can freeze the moment an interviewer changes one constraint. Reading about a design, or recognizing it in someone else's diagram, isn't the same skill as reasoning through your own from scratch. It's why engineers can follow a tutorial confidently and still stall the first time they have to adapt it to a real, messier codebase. We lean on that same reasoning-under-constraint muscle when we design &lt;a href="https://www.revos.ai/blog/agentic-data-engineering" rel="noopener noreferrer"&gt;agentic data pipelines that have to hold up in production&lt;/a&gt;, not just work in a demo. Recognizing that a pattern exists somewhere is nowhere near the same as knowing when it actually applies.&lt;/p&gt;

&lt;p&gt;Recognizing an answer is the first step. Being able to explain it, justify it, and apply it to a problem you haven't seen before is what actually demonstrates understanding: on an exam, in an interview, or in a &lt;a href="https://www.revos.ai/blog/modern-data-strategy-microsoft-fabric-blueprint" rel="noopener noreferrer"&gt;Fabric deployment you're responsible for keeping correct&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Failing my first DP-700 attempt didn't feel like progress at the time. But it's the reason I rebuilt how I study at all, and that ended up mattering a lot more than passing on the first try would have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why did I fail the DP-700 exam if I passed all my practice tests?
&lt;/h3&gt;

&lt;p&gt;Practice tests mostly reward recognition: matching a question to an answer you've seen before. The real DP-700 exam tests retrieval: reasoning from a scenario's requirements and constraints to the best answer, often among several technically valid options. Passing practice tests proves you can recognize correct answers, not that you can reason your way to one under pressure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the DP-700 exam hard?
&lt;/h3&gt;

&lt;p&gt;Yes. Most candidates describe DP-700 as moderately to significantly harder than typical certification exams, especially for anyone without hands-on Microsoft Fabric experience. The questions are longer and more scenario-based than most study guides prepare you for, and several answer options are often technically plausible, so you have to reason about which one best fits the stated requirements instead of just recalling a fact.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the DP-700 passing score?
&lt;/h3&gt;

&lt;p&gt;According to Microsoft's own DP-700 study guide, you need at least 700 out of 1,000 points (70%) to pass. Microsoft doesn't publish an official pass rate, so treat any specific pass-rate number you see online as an unverified community estimate, not an official figure.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long should I study for DP-700?
&lt;/h3&gt;

&lt;p&gt;There's no universal number; it depends on your hands-on Fabric experience. I planned for one month, then extended to about ten weeks once I realized Fabric's breadth (data engineering, real-time analytics, governance, lifecycle management) needed more than theory to cover. Budget more time for practice and scenario reasoning than for reading documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the difference between recognition and retrieval when studying?
&lt;/h3&gt;

&lt;p&gt;Recognition is realizing you've seen something before: a question triggers a memorized answer, the way a flashcard does. Retrieval is reconstructing an answer from first principles: weighing requirements, constraints, and trade-offs to reason your way to a conclusion, even on a question you haven't seen phrased exactly that way. Exams and real jobs test retrieval; most casual studying only trains recognition. Learning-science research calls the resulting mismatch the illusion of competence: mistaking a familiar-feeling answer for real understanding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do practice tests actually help you learn?
&lt;/h3&gt;

&lt;p&gt;Yes, but the mechanism matters. Taking a test is itself a form of retrieval practice, and cognitive science shows retrieval practice builds more durable, transferable knowledge than re-reading or restudying does. But if your practice tests are too similar to each other, or you review answers by re-reading rather than re-attempting cold, you end up training recognition instead: passing the practice test without building the reasoning skill the real exam requires.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does this recognition-versus-retrieval problem apply outside of certification exams?
&lt;/h3&gt;

&lt;p&gt;Yes. It's the same failure mode behind confidently-prepared candidates freezing in technical interviews or system design reviews. Reading about a topic (or recognizing it when you see it) feels like mastery, but only reasoning through unfamiliar, constrained problems under pressure actually builds and proves the skill.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Viktor Goloubovsky is a data engineer at RevOS, where the team spends a lot of time thinking about the difference between &lt;a href="https://www.revos.ai/blog/data-readiness-for-machine-learning" rel="noopener noreferrer"&gt;data that looks right and data that's actually correct&lt;/a&gt;, a distinction that, it turns out, applies to how you study for an exam too.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://www.revos.ai/blog/dp-700-exam-recognition-vs-retrieval?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=dp-700-exam-recognition-vs-retrieval" rel="noopener noreferrer"&gt;RevOS blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Curious what Viktor's team builds? RevOS is a governed data layer that lets AI agents answer revenue questions from trusted numbers. &lt;a href="https://try.revos.ai/meetings/renat/revos-demo?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=dp-700-exam-recognition-vs-retrieval" rel="noopener noreferrer"&gt;Book a RevOS demo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>microsoft</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>What Is an MCP Server? A Complete Guide to Model Context Protocol</title>
      <dc:creator>RevOS</dc:creator>
      <pubDate>Fri, 23 Oct 2026 11:57:56 +0000</pubDate>
      <link>https://dev.to/revos/what-is-an-mcp-server-a-complete-guide-to-model-context-protocol-5g1a</link>
      <guid>https://dev.to/revos/what-is-an-mcp-server-a-complete-guide-to-model-context-protocol-5g1a</guid>
      <description>&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An MCP server is a standardized connector that lets any AI agent access live data, tools, and services through the Model Context Protocol: a single open standard rather than a custom integration per tool.&lt;/li&gt;
&lt;li&gt;MCP stands for Model Context Protocol, an open specification originally developed by Anthropic. It lets AI models request context, run tools, and read resources in a consistent, structured way.&lt;/li&gt;
&lt;li&gt;Unlike a REST API, an MCP server speaks AI natively: it exposes tools (actions), resources (data), and prompts (reusable templates), not raw HTTP endpoints the model has to interpret.&lt;/li&gt;
&lt;li&gt;For data teams, an MCP server is how you give an AI agent governed access to your warehouse, semantic model, and business metrics without writing a custom integration for every AI tool in your stack.&lt;/li&gt;
&lt;li&gt;RevOS ships an MCP server as its consumption layer, so Claude, Cursor, or any MCP-compatible agent can query your certified revenue metrics by name, without building the integration yourself.&lt;/li&gt;
&lt;li&gt;An MCP server acts on behalf of the user. Its access is established with either a shared secret token or a user-friendly OAuth flow, so the agent inherits the user's own permissions and can only reach data that person could already see.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your AI assistant sounds confident. It answers in complete sentences, cites figures, and explains its reasoning. The only problem: those figures came from data you pasted into the chat ten minutes ago, or from the model's training data, which ended months before your most recent quarter.&lt;/p&gt;

&lt;p&gt;An MCP server is what changes that. It is the connection between an AI agent and live data: the layer that lets Claude, Cursor, or any AI tool reach into your database, query your business metrics, or trigger an action in an external system, on demand, without you lifting a clipboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an MCP server?
&lt;/h2&gt;

&lt;p&gt;An MCP server is a program that exposes data, tools, and actions to AI agents through the Model Context Protocol. The AI agent connects to it, discovers what it can access, and issues requests. The server handles the rest: querying the underlying system, enforcing permissions, and returning results in a format the model can use.&lt;/p&gt;

&lt;p&gt;In practice it works like this. An AI agent running in Claude or Cursor wants to know your pipeline coverage for Q3. Without an MCP server, it cannot look that up; it only knows what is already in its context window. With an MCP server connected to your data warehouse, it sends a request to the server, which runs the query and returns the answer directly into the agent's working memory.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;In one sentence:&lt;/strong&gt; an MCP server is the standardized interface that lets an AI agent reach beyond its context window and interact with live data, tools, and services, on its own, without a human copy-pasting or writing custom integration code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The protocol was designed specifically for AI agents, not for humans or traditional software. That distinction matters: an MCP server does not expose raw HTTP endpoints for a developer to call in code. It exposes things an AI model can discover and use autonomously.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does "MCP" stand for?
&lt;/h2&gt;

&lt;p&gt;MCP stands for &lt;strong&gt;Model Context Protocol&lt;/strong&gt;. It is an open specification originally developed by Anthropic, released in late 2024, and now supported across the broader AI ecosystem, including Cursor, Windsurf, Microsoft Copilot, and dozens of open-source agent frameworks.&lt;/p&gt;

&lt;p&gt;"Model context" describes exactly what it provides: context for the model. An AI model's intelligence is bounded by what is in its context window: the text, documents, and conversation history it can see. The protocol is the mechanism for expanding that window dynamically, by fetching exactly the information the agent needs at the moment it needs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does an MCP server work?
&lt;/h2&gt;

&lt;p&gt;The architecture has three components: a &lt;strong&gt;host&lt;/strong&gt;, a &lt;strong&gt;client&lt;/strong&gt;, and a &lt;strong&gt;server&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;host&lt;/strong&gt; is the AI application the user interacts with: Claude Desktop, Cursor, or a custom agent you built. It manages one or more client connections.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;client&lt;/strong&gt; runs inside the host and maintains a one-to-one connection to a specific MCP server. Each tool or data source you connect gets its own client.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;server&lt;/strong&gt; is the program that exposes the actual capabilities: the tools, resources, and prompts an AI agent can use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you start a session, the client and server negotiate capabilities (each announces what it can offer), and the agent can begin using whatever is available. The transport layer for local servers is typically standard I/O, a subprocess the host spawns. Remote servers communicate over HTTP, which allows for streaming responses.&lt;/p&gt;

&lt;h3&gt;
  
  
  The three things an MCP server can expose
&lt;/h3&gt;

&lt;p&gt;Every MCP server exposes capabilities through one or more of three primitives:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt; are actions the agent can invoke: running a query, calling an API, submitting a form. A tool has a name, a description, and a schema for its inputs and outputs. The agent reads the description and decides whether to call the tool. For example: a &lt;code&gt;run_metric_query&lt;/code&gt; tool that accepts a metric name and a date range and returns the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt; are data the agent can read: documents, files, database records, live feeds. Unlike tools, resources are meant to be retrieved and placed into context, not acted on. For example: a configuration file, a record from a CRM, or a page from a knowledge base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompts&lt;/strong&gt; are reusable templates: predefined instructions or question formats the user or agent can invoke to trigger a specific behavior. For example: a "summarize this quarter's revenue trends" prompt that the agent knows how to fill in and execute against the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP server vs. API: what is the difference?
&lt;/h2&gt;

&lt;p&gt;The comparison comes up constantly because both connect software to external systems. They are genuinely different things, and the difference is worth understanding clearly.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;REST API&lt;/th&gt;
&lt;th&gt;MCP server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Designed for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers calling it from code&lt;/td&gt;
&lt;td&gt;AI agents using it autonomously&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;API docs you read; no self-description at runtime&lt;/td&gt;
&lt;td&gt;Agent queries the server for its capability schema at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interaction model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Request-response, stateless per call&lt;/td&gt;
&lt;td&gt;Stateful session with capability negotiation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it exposes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP endpoints (GET /users, POST /orders)&lt;/td&gt;
&lt;td&gt;Tools, resources, and prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who decides what to call&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The developer writing the code&lt;/td&gt;
&lt;td&gt;The agent, based on the task&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The practical consequence: connecting an AI agent to a REST API requires a developer to write integration code (parsing the response, deciding which endpoint to call for which question, handling errors). Connecting an agent to an MCP server requires configuring the server once. After that, the agent figures out what to call on its own.&lt;/p&gt;

&lt;p&gt;This is why "MCP server vs. API" is slightly a false framing. Many MCP servers are thin wrappers around existing REST APIs or databases. The MCP layer is what makes those systems usable by an AI agent without custom integration work per tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI agents need MCP servers
&lt;/h2&gt;

&lt;p&gt;An AI agent without external connections is like a brilliant analyst in a locked room. They can reason, synthesize, and explain, but only from the materials already in the room. Every question that requires live data forces you to carry that data in from outside: by pasting, uploading, or writing custom code to fetch it.&lt;/p&gt;

&lt;p&gt;MCP removes that constraint. When an agent has access to an MCP server, it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask a question that requires live data and retrieve it on the spot&lt;/li&gt;
&lt;li&gt;Chain multiple tool calls across a task: look up a number, compare it to last quarter, then check which segment drove the change&lt;/li&gt;
&lt;li&gt;Take actions in external systems, not just read from them&lt;/li&gt;
&lt;li&gt;Operate over time, with memory of what it retrieved earlier in the session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reason MCP matters more than ad-hoc custom integrations is standardization. Without a common protocol, every AI agent needs a custom integration for every tool it might use, and every tool needs to know about every agent format. With MCP, any server that speaks the protocol works with any client that speaks it. One integration per tool; one client per agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP servers for business data: the use case most guides miss
&lt;/h2&gt;

&lt;p&gt;Most writing about MCP servers focuses on developer tools: GitHub repositories, code files, terminal commands, Slack messages. That is the first wave of adoption, and it is real. But it is not where the highest-value use case lives for most B2B SaaS companies.&lt;/p&gt;

&lt;p&gt;The highest-value use case is &lt;strong&gt;giving an AI agent access to business data&lt;/strong&gt;: revenue metrics, pipeline health, customer retention signals, product usage patterns. This is the data that drives decisions, and it lives in places an AI agent currently cannot reach: your data warehouse, your CRM, your billing system.&lt;/p&gt;

&lt;p&gt;The problem with connecting an AI agent directly to a database is not the connection; MCP makes that technically straightforward. The problem is the layer above it.&lt;/p&gt;

&lt;p&gt;If your AI agent can query your data warehouse directly, it will write its own SQL to answer your questions. Sometimes it guesses correctly. More often, it misses a filter, joins the wrong table, or defines "churn" differently than your finance team does, and returns a confident, specific, wrong answer. You have no way to tell which kind of answer you received.&lt;/p&gt;

&lt;p&gt;This is where the &lt;a href="https://www.revos.ai/blog/what-is-a-semantic-layer" rel="noopener noreferrer"&gt;semantic layer&lt;/a&gt; comes in. A semantic layer defines your business metrics once (the exact SQL, the correct joins, the approved filters) and serves them to whatever is reading your data. When your MCP server sits on top of a semantic layer instead of raw database tables, the AI agent does not write SQL. It requests a certified metric by name: "net revenue retention, last quarter, EMEA segment." The semantic layer returns the one correct calculation. The agent cannot hallucinate a definition it never had to invent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📊 &lt;strong&gt;The pattern that works:&lt;/strong&gt; raw warehouse tables feed a governed &lt;a href="https://www.revos.ai/product/semantic-model" rel="noopener noreferrer"&gt;semantic model&lt;/a&gt;, and an MCP server exposes that model to AI agents. The agent asks for metrics by name. The semantic layer enforces the definitions. The warehouse returns the data. No custom SQL, no invented business logic, no reconciliation meeting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What you can actually ask an AI agent with a data MCP server
&lt;/h3&gt;

&lt;p&gt;With a well-structured data MCP server connected to a semantic layer, a RevOps analyst or data engineer can ask questions that previously required an analyst queue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What is pipeline coverage for Q4 by segment, compared to this time last year?"&lt;/li&gt;
&lt;li&gt;"Which accounts had a significant drop in product usage in the last 30 days?"&lt;/li&gt;
&lt;li&gt;"What drove the change in net revenue retention from last quarter to this quarter?"&lt;/li&gt;
&lt;li&gt;"Show me the top 20 accounts by expansion opportunity, using our current scoring model."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these questions requires multiple joins, specific metric definitions, and knowledge of your data model. A data MCP server with a semantic layer underneath handles that translation: the agent selects from defined metrics, not from raw columns.&lt;/p&gt;

&lt;p&gt;This is what &lt;a href="https://www.revos.ai/blog/modern-data-strategy-age-of-ai" rel="noopener noreferrer"&gt;a modern data strategy for the AI era&lt;/a&gt; looks like in practice: not a dashboard refresh cycle, but an AI agent that can answer these questions on demand, with the same definitions your best analyst would use, whenever someone needs to know.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP vs. RAG: a quick distinction
&lt;/h2&gt;

&lt;p&gt;These two come up in the same conversations, and they are genuinely different.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RAG (Retrieval-Augmented Generation)&lt;/strong&gt; works by taking a question, searching a vector index of documents, pulling the most relevant text chunks, and loading them into the model's context window before it answers. It is a text-retrieval technique, best for unstructured content like documentation, support tickets, or contracts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP&lt;/strong&gt; is a protocol for tool use and live data access. The agent does not search a vector index; it calls a specific tool or reads a specific resource. For structured data, MCP with a semantic layer is more accurate than RAG because you are retrieving an exact metric definition, not approximating from text.&lt;/p&gt;

&lt;p&gt;In practice, many production systems use both: RAG for knowledge retrieval (documentation, policies, unstructured records) and MCP for live, structured data (metrics, operational data, actions). They are complementary, not competing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to look for in a data MCP server
&lt;/h2&gt;

&lt;p&gt;Not all MCP servers for data are the same. When you are connecting an AI agent to business-critical metrics, a few things matter beyond "does it work."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Governed metric definitions.&lt;/strong&gt; If the MCP server exposes raw SQL access, every agent call is a potential metric definition problem. Look for servers that sit on top of a semantic layer, so the agent picks from certified metrics, not from tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Row-level and column-level access control.&lt;/strong&gt; An AI agent inherits the permissions of the person using it. If access control is not enforced at the data layer, a user can ask the agent for data they should not see. Access rules defined on the semantic model propagate to every tool that queries through it, including the agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Predictable, auditable behavior.&lt;/strong&gt; When an executive asks "where did this number come from?", you need an answer. A data MCP server that routes through a governed semantic model gives you one: the metric name, the definition version, the underlying query, all traceable. &lt;a href="https://www.revos.ai/blog/data-readiness-for-machine-learning" rel="noopener noreferrer"&gt;Getting your data ready for AI agents&lt;/a&gt; starts with that kind of auditability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transport and authentication.&lt;/strong&gt; For production deployments, remote MCP servers run over HTTP. Confirm the server supports proper authentication (OAuth, API keys, or session tokens) before connecting it to sensitive data.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is an MCP server secured?
&lt;/h2&gt;

&lt;p&gt;Connecting an AI agent to your business data raises an obvious question: what can it actually see, and who said it could? The answer comes down to identity. A well-built MCP server never holds a blanket key to everything. It acts on behalf of a specific person, and it is bound by that person's existing permissions.&lt;/p&gt;

&lt;p&gt;There are two common ways that identity gets established: a shared secret token, or an OAuth flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shared secret tokens
&lt;/h3&gt;

&lt;p&gt;The simplest approach is a static credential (an API key, a personal access token, or a bearer token) that you paste into your client's configuration. The agent presents that token on every request, and the server trusts it.&lt;/p&gt;

&lt;p&gt;This is the default for local MCP servers. The Model Context Protocol authorization spec expects local (stdio) servers to read credentials from the environment rather than run a login flow, so a token in a config file or environment variable is exactly the right tool. It is fast to set up, with no redirect screens or consent prompts.&lt;/p&gt;

&lt;p&gt;The tradeoff is bluntness. A shared secret identifies a connection, not a person. One key maps to one fixed set of permissions, it tends to be long-lived, and it sits in plaintext wherever you stored it. If it leaks, whoever holds it inherits whatever that key could do, with no per-user attribution and a manual rotation to clean up. For a single developer wiring up a local tool, that is fine. For a team querying sensitive revenue data, it is not enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  OAuth: acting on behalf of the user
&lt;/h3&gt;

&lt;p&gt;The better pattern for remote, multi-user servers is OAuth. Instead of pasting a secret, you click "Connect," authenticate with your normal login, and approve a consent screen that spells out exactly what the agent is allowed to do. The MCP server receives a short-lived, scoped access token (no long-lived secret ever lands in your config), and that grant can be refreshed or revoked at any time.&lt;/p&gt;

&lt;p&gt;The MCP authorization spec is built on OAuth 2.1 for HTTP-based servers. The client requests access on behalf of the user, the server validates every token and confirms it was issued specifically for that server, and the flow uses PKCE so the authorization code cannot be intercepted and replayed. The upshot for you is simple: the agent inherits your identity. Every query it runs executes as you, so it can only ever reach data you were already allowed to see.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔒 This is why identity matters more than any network firewall here. If the agent runs as the user, your existing access controls (roles, row-level and column-level security defined on the data) do all the work automatically. The agent cannot become a backdoor to data the person behind it could never open themselves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the model RevOS uses. Rather than handing every user a static key, the RevOS MCP server uses a user-friendly OAuth flow: each person connects with their own identity, and the governed semantic layer enforces exactly the permissions they already have. The agent answers questions, but it answers them as you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Risks worth understanding
&lt;/h3&gt;

&lt;p&gt;Even with clean authentication, a handful of MCP-specific risks are worth knowing before you connect a server to sensitive data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token passthrough.&lt;/strong&gt; The spec explicitly forbids an MCP server from forwarding the caller's token to an upstream API. If the server needs to call another service, it must obtain its own token for that service. Passing tokens through blurs the trust boundary and invites the next problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The confused deputy.&lt;/strong&gt; A server that proxies requests to other systems can be tricked into using its own privileges on behalf of an attacker. Strict redirect-URI validation, per-client consent, and verifying that a token was issued for this server are the standard mitigations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection and tool poisoning.&lt;/strong&gt; Malicious instructions hidden in a tool's description or in the data it returns can hijack the model. This is an LLM-trust problem rather than an auth problem, and it is mitigated by sanitizing inputs and pinning tool definitions so they cannot silently change after you approve them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over-broad scopes.&lt;/strong&gt; Request only the permissions the task needs. The principle of least privilege keeps the blast radius small if anything does go wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit logging.&lt;/strong&gt; You need to know who asked the agent for what. A production MCP server should log authentication and every tool invocation to storage you can trust.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is exotic. It is the same identity-and-access discipline you already apply to dashboards and BI tools, extended to the agent that now queries on your behalf.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the difference between an API and an MCP server?
&lt;/h3&gt;

&lt;p&gt;A REST API exposes HTTP endpoints designed for a developer to call from code. An MCP server exposes tools, resources, and prompts in a structure AI agents understand natively, so the model can discover what is available, decide what to call, and handle the result autonomously. APIs are for developers. MCP servers are for AI agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is an MCP server a real server?
&lt;/h3&gt;

&lt;p&gt;Yes. An MCP server is a real process running on a machine, locally or in the cloud, communicating over a transport layer (standard I/O for local processes, HTTP for remote ones). What makes it an MCP server is the protocol it speaks: the Model Context Protocol message format, capability negotiation, and the tools, resources, and prompts it exposes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why would I need an MCP server?
&lt;/h3&gt;

&lt;p&gt;When you want an AI agent to access live data or perform actions autonomously. Without one, the agent only knows what is in its context window. With an MCP server connected to your data sources, it can query your database, pull your business metrics, or trigger actions on demand. For data teams, this is how you stop manually copying numbers into chat and let the agent retrieve them itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does ChatGPT use MCP?
&lt;/h3&gt;

&lt;p&gt;Yes. ChatGPT can connect to MCP servers as custom connectors, and Claude, Cursor, Windsurf, and many open-source agent frameworks support MCP natively too. The RevOS MCP server, for example, can be added in either Claude's or ChatGPT's connector settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is MCP in agentic AI?
&lt;/h3&gt;

&lt;p&gt;In agentic AI, MCP is the communication layer between an agent and the tools and data it operates on. Agentic systems plan and act across multiple steps; MCP standardizes how they access external capabilities at each step. The agent discovers what tools are available, calls them as needed, and acts on the results, all through one protocol, without needing a custom integration for every tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is an MCP server in simple terms?
&lt;/h3&gt;

&lt;p&gt;An MCP server is a plug-in slot for AI agents. Just as a USB port lets you plug multiple devices into a computer through one standard interface, an MCP server lets an AI agent connect to multiple data sources and tools through one standardized protocol. Instead of asking you to paste in a spreadsheet, the agent queries the server directly and gets the answer itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can you host your own MCP server?
&lt;/h3&gt;

&lt;p&gt;Yes. The Model Context Protocol is an open standard with official SDKs in Python, TypeScript, and Java. You can build and host an MCP server for any data source or tool you control. Local servers run as a subprocess over standard I/O. Production servers run as HTTP services. Many teams start with an open-source MCP server for a common tool and build custom ones for proprietary data.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between MCP and RAG?
&lt;/h3&gt;

&lt;p&gt;RAG searches a vector index of documents and pulls relevant text into the model's context window. MCP is a protocol for live tool use and data access: the agent calls a specific tool or queries a specific resource. For unstructured content like documentation, RAG works well. For structured business data like metrics and operational records, MCP with a governed semantic layer is more accurate because the agent retrieves exact definitions instead of approximating from text.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is an MCP server secured?
&lt;/h3&gt;

&lt;p&gt;Through identity. An MCP server authenticates the caller, usually with one of two mechanisms: a shared secret token (an API key or bearer token you configure, the norm for local servers), or an OAuth flow (where you log in and approve scopes, the norm for remote, multi-user servers). With OAuth the server acts on behalf of you specifically, so the agent inherits your permissions and can only reach data you are already allowed to see. The Model Context Protocol authorization spec is built on OAuth 2.1 for HTTP-based servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;An MCP server is the layer that closes the gap between an AI agent's intelligence and the live data it needs to act on. For development teams, it unlocks code-aware agents. For data teams, it unlocks something more significant: an AI that can answer business questions from your actual data, with the same metric definitions your analysts use, without a custom integration per tool.&lt;/p&gt;

&lt;p&gt;The protocol is open, the ecosystem is growing fast, and the infrastructure already exists to build this, or to get it bundled. RevOS ships an MCP server as the top layer of its data platform, on top of a governed semantic model, so any MCP-compatible agent can connect and query your certified metrics by name from day one.&lt;/p&gt;

&lt;p&gt;If you are evaluating what it takes to give AI agents access to your business data, &lt;a href="https://www.revos.ai/blog/what-is-a-semantic-layer" rel="noopener noreferrer"&gt;start with the semantic layer&lt;/a&gt;: that is the governed layer your MCP server should expose. The MCP server is the interface. The semantic layer is what makes the answers trustworthy.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://www.revos.ai/blog/what-is-an-mcp-server?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=what-is-an-mcp-server" rel="noopener noreferrer"&gt;RevOS blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Want to see this on your own data? &lt;a href="https://try.revos.ai/meetings/renat/revos-demo?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=what-is-an-mcp-server" rel="noopener noreferrer"&gt;Book a RevOS demo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>dataengineering</category>
      <category>agents</category>
    </item>
    <item>
      <title>Claude Code, Cowork, Tag, and Routines: A Practitioner's Map to the Claude Ecosystem</title>
      <dc:creator>RevOS</dc:creator>
      <pubDate>Thu, 22 Oct 2026 10:26:35 +0000</pubDate>
      <link>https://dev.to/revos_ai/claude-code-cowork-tag-and-routines-a-practitioners-map-to-the-claude-ecosystem-23b2</link>
      <guid>https://dev.to/revos_ai/claude-code-cowork-tag-and-routines-a-practitioners-map-to-the-claude-ecosystem-23b2</guid>
      <description>&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code isn't one app. It's a single agent engine behind a terminal CLI, IDE extensions, a Desktop tab, and Claude Code on the web. Your CLAUDE.md and MCP servers travel with you across all of them.&lt;/li&gt;
&lt;li&gt;Claude Cowork runs the same engine inside a sandboxed desktop (and now web/mobile beta) workspace, organized around local folders and a background planner called Dispatch, but it doesn't read your Claude Code CLI's ~/.claude setup.&lt;/li&gt;
&lt;li&gt;Claude Tag puts Claude in your team's Slack channels under the organization's own shared credentials, not any one person's. That's the real difference from Cowork and Code, which stay private to you.&lt;/li&gt;
&lt;li&gt;"Routines" names at least three unrelated things: cloud-run Claude Code Routines, local Desktop scheduled tasks, and Slack-native Claude Tag routines. They don't share a task list.&lt;/li&gt;
&lt;li&gt;The organizing question isn't "which tool is smartest". It's whose credentials run the work, and who gets to see it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anthropic didn't ship one Claude product this year. It shipped four, and gave three of them names that sound like they should mean the same thing. Ask a few people on your team "what's the difference between Claude Code and Claude Cowork?" and you'll get a different answer each time. Mention "the Claude routine" and you still don't know whether they mean a cron job in the cloud, a task running on their laptop, or something set up entirely inside Slack.&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;Claude Cowork vs. Claude Code&lt;/strong&gt; question, but it's bigger than those two. By the second half of 2026 there are four surfaces worth knowing apart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; a coding agent you drive from a terminal, an IDE, or a browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Cowork:&lt;/strong&gt; an agentic workspace for outcome-oriented work on your files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Tag:&lt;/strong&gt; Claude working inside your team's Slack channels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routines:&lt;/strong&gt; a word Anthropic uses for at least three unrelated kinds of scheduled automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is a rebrand of the others. Each is a different envelope around the same underlying agent, built for a different job. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Cowork vs. Claude Code: the quick answer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;Runs on&lt;/th&gt;
&lt;th&gt;Who sees the work&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your credentials, your machine or your own cloud session&lt;/td&gt;
&lt;td&gt;Just you&lt;/td&gt;
&lt;td&gt;Hands-on coding in an existing repository&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Cowork&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your credentials, a sandboxed workspace&lt;/td&gt;
&lt;td&gt;Just you&lt;/td&gt;
&lt;td&gt;Outcome-oriented work on local files, no terminal needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Tag&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your team's shared credentials&lt;/td&gt;
&lt;td&gt;Everyone in the Slack channel&lt;/td&gt;
&lt;td&gt;Shared work the team should see and steer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Routines&lt;/strong&gt; (any form)&lt;/td&gt;
&lt;td&gt;Whichever surface created them&lt;/td&gt;
&lt;td&gt;Depends on the form&lt;/td&gt;
&lt;td&gt;Unattended, scheduled, or triggered work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The row that matters most for the rest of this guide: &lt;strong&gt;whose credentials run the work, and who can see the result.&lt;/strong&gt; Claude Code and Cowork stay private to you. Claude Tag is visible to a whole channel by design. Routines run unattended. Keep that distinction in mind; it explains more about which tool to reach for than "how technical is the user" does. Plenty of engineers live in Cowork, and plenty of non-engineers now trigger a Claude Code Routine without ever opening a terminal. That question also generalizes well past Claude: every agent should have an identity, but &lt;a href="https://www.revos.ai/blog/ai-agent-identity" rel="noopener noreferrer"&gt;not every agent should have its own authority&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Prefer video? Here's the whole map in one walkthrough:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/W0mzh9UCHpk" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code: your terminal, your checkout
&lt;/h2&gt;

&lt;p&gt;Claude Code is an agent that reads your codebase, edits files, runs commands, and works with your existing dev tools. The important thing to understand is that "Claude Code" isn't a single app. It's one engine behind several surfaces: the terminal CLI, extensions for VS Code and JetBrains, a &lt;strong&gt;Code&lt;/strong&gt; tab inside the Claude Desktop app, Claude Code on the web, and mobile. Your &lt;code&gt;CLAUDE.md&lt;/code&gt; project memory, your settings, and your connected &lt;a href="https://www.revos.ai/blog/what-is-an-mcp-server" rel="noopener noreferrer"&gt;MCP servers&lt;/a&gt; (the standard way Claude reaches outside tools and data) work the same way across every one of them, because they all talk to the same underlying engine.&lt;/p&gt;

&lt;p&gt;In practice, that means you can start a task in the terminal, hand it off to the web version so it keeps running after you close your laptop, or pull a cloud session back down locally when you want hands-on control again. It's designed to be extended: project memory, reusable skills, hooks that run on specific events, and a headless mode (&lt;code&gt;claude -p&lt;/code&gt;) for piping output into scripts or CI pipelines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; developers and engineering teams working inside an actual repository, with their own credentials and their own machine (or a cloud session tied to their own account).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;claude "write tests for the auth module, run them, and fix any failures"&lt;/code&gt;: a self-contained coding task run start to finish.&lt;/li&gt;
&lt;li&gt;Piping log output through Claude Code for anomaly triage: &lt;code&gt;tail -200 app.log | claude -p "flag anything unusual"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Starting a long refactor on Claude Code on the web, then pulling it down locally once it's ready for a closer look.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Is Claude Code just Cursor?
&lt;/h3&gt;

&lt;p&gt;This comes up constantly, and the answer is no. They solve overlapping problems with different shapes. Cursor is a fork of VS Code: the AI lives inside the editor, suggesting and applying changes as you work, one file at a time. Claude Code is terminal-native and session-based: you describe an outcome, and the agent plans, edits multiple files, runs commands, and reports back, with or without an editor open at all.&lt;/p&gt;

&lt;p&gt;This isn't a fringe question. &lt;a href="https://survey.stackoverflow.co/2025/ai" rel="noopener noreferrer"&gt;Stack Overflow's 2025 Developer Survey&lt;/a&gt; found 84% of respondents were using or planning to use AI tools in their development process, up from 76% the year before, and 50.6% of professional developers already use one daily. It's the default way most teams now write code. Among developers who'd tried an autonomous coding agent specifically, the same survey found adoption split across ChatGPT (81.7%), GitHub Copilot (67.9%), and Claude Code (40.8%): evidence that most teams aren't choosing one tool and stopping, they're running several. The "Where Cursor still fits" section below covers how that plays out day to day.&lt;/p&gt;

&lt;p&gt;If your team already links agentic tools to a real project, see how we &lt;a href="https://www.revos.ai/blog/structuring-data-for-ai-agents" rel="noopener noreferrer"&gt;structure data so AI agents can query it reliably&lt;/a&gt;. The agent is only half the story; what it can actually read matters just as much.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Cowork: same engine, different envelope
&lt;/h2&gt;

&lt;p&gt;Claude Cowork is easy to misread as "Claude Code for non-engineers," and that undersells it. Cowork runs the same agentic engine that powers Claude Code, inside the Claude Desktop app, without opening a terminal, but it's organized around a different unit of work. Instead of a git checkout, you point it at &lt;strong&gt;Projects&lt;/strong&gt;: local folders paired with standing instructions and a project-scoped memory that stays on your machine. Instead of responding turn by turn, Claude works toward a described outcome and you check back once it's done.&lt;/p&gt;

&lt;p&gt;The piece that makes Cowork genuinely different from "Claude Code with a nicer UI" is &lt;strong&gt;Dispatch&lt;/strong&gt;, a background planner that splits a multi-step brief into subtasks and routes each one to the surface that fits: knowledge-work pieces stay in a Cowork session, coding pieces get handed to a Code session. Ask Dispatch to "summarize the open reliability-tagged issues and draft a status update," and it can pull that off from your phone while your desktop does the actual work.&lt;/p&gt;

&lt;p&gt;Two things worth knowing before you reach for it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's not desktop-only anymore.&lt;/strong&gt; Cowork is generally available on macOS and Windows via Claude Desktop, and now in beta on web and mobile for Pro, Max, and Team plans (Enterprise, where an admin turns it on). On web and mobile, local file access and connectors still run through your desktop app in the background, so your computer has to be on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It doesn't inherit your Claude Code CLI setup.&lt;/strong&gt; Cowork loads skills, plugins, and connectors from your claude.ai account settings, not from your terminal's &lt;code&gt;~/.claude&lt;/code&gt; directory. If you've spent time tuning Claude Code locally, none of that carries over automatically. It's a genuinely separate configuration surface, and it's the single most common trap for people who assume "same engine" means "same setup."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; anyone doing file-and-document-heavy work who doesn't want to open a terminal, including engineers, since Dispatch explicitly hands coding subtasks to a Code session on their behalf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Point Cowork at a folder of contracts and have it produce a comparison spreadsheet with working formulas.&lt;/li&gt;
&lt;li&gt;Kick off a Dispatch request from your phone ("summarize this week's open threads and draft the team update") and find it done when you're back at your desk.&lt;/li&gt;
&lt;li&gt;Have it work alongside Claude in Chrome (Claude's browser extension for driving a live website) to complete a task that needs more than local files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the bigger idea behind letting an agent own more of a workflow end to end, see our piece on &lt;a href="https://www.revos.ai/blog/agentic-data-engineering" rel="noopener noreferrer"&gt;agentic data engineering&lt;/a&gt;. Cowork's Dispatch model and the "describe the outcome, review the result" pattern it uses show up there too, just applied to data pipelines instead of documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  "&lt;a class="mentioned-user" href="https://dev.to/claude"&gt;@claude&lt;/a&gt;" in Slack: Claude Tag, not the old Slack integration
&lt;/h2&gt;

&lt;p&gt;If your team already has Claude working inside Slack, it's worth checking which version you're on, because there are two live right now with genuinely different account models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Tag&lt;/strong&gt; (currently in public beta) is Claude working in your team's Slack channels under the organization's own shared credentials, not any individual's Claude account. An admin sets it up once per channel at &lt;code&gt;claude.ai/admin-settings/claude-tag&lt;/code&gt;, and after that, anyone in the channel can just tag &lt;code&gt;@Claude&lt;/code&gt; with no setup of their own. Each thread spins up a fresh, sandboxed working session (built when the thread starts, released when it goes quiet) running on the same engine as Claude Code on the web. It posts a live checklist as it works, and anyone in the thread can redirect it by replying, without re-tagging it.&lt;/p&gt;

&lt;p&gt;That's the real distinction from Cowork and Code: this work is visible to the whole channel by design, and it's billed against the organization's own usage balance, not any one person's plan. It's currently available on &lt;strong&gt;Team and Enterprise&lt;/strong&gt; plans. Pro and Max plans still use the older, individually authenticated Slack integration, which runs under each person's own account and their own limits. Anthropic is retiring that older integration for Team and Enterprise workspaces in favor of Claude Tag. There's no public cutover date, so ask your account team rather than assuming a timeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; teams that want shared, visible work a whole channel can watch and steer: incident triage, decision threads, or status rollups that shouldn't live in one person's DMs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tag &lt;code&gt;@Claude&lt;/code&gt; in an incident channel to investigate a latency regression against the morning's deploy and open a PR.&lt;/li&gt;
&lt;li&gt;Turn a sprawling decision thread into a clean doc or a tracked ticket.&lt;/li&gt;
&lt;li&gt;Ask it to pull together the state of a project across a dozen open threads and a launch plan in Drive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We cover where this fits alongside other agent categories in our &lt;a href="https://www.revos.ai/blog/enterprise-ai-agents" rel="noopener noreferrer"&gt;rundown of enterprise AI agents&lt;/a&gt;, if you're mapping this against a broader agent rollout.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Routines" means three different things: pick the right one
&lt;/h2&gt;

&lt;p&gt;This is the part of the ecosystem most likely to get someone confused mid-conversation, because Anthropic uses the word "Routines" for at least three separate mechanisms, and none of them share a task list with each other.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code Routines (cloud, research preview):&lt;/strong&gt; a saved Claude Code configuration (a prompt, one or more repositories, and a set of connectors) packaged once and triggered automatically. It runs on Anthropic-managed cloud infrastructure, so it keeps working with your laptop closed. Triggers combine three ways on a single routine: on a schedule (hourly up to weekly, or a custom cron), via a direct API call to the routine's own endpoint, or from a GitHub event (a pull request opening, a release publishing). This is the mechanism actually behind this post: a GitHub label triggered a Claude Code Routine that researched, drafted, and validated the draft you're reading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop scheduled tasks (local):&lt;/strong&gt; created from the same "Routines" panel in the Claude Desktop app, but choosing "Local" instead of "Cloud." These run on your own machine, with real local file access, only while your computer is on and the app is open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Tag routines:&lt;/strong&gt; a completely separate, Slack-native idea. Standing work you set up in plain English inside a channel, like "every weekday at 9am, check the linked tickets in this channel and post a one-line status." No cron syntax, no dashboard; you just ask, and manage it later by tagging Claude again.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; anyone who wants Claude to do something without a person kicking it off in real time: an engineer scheduling nightly checks, or a channel that wants standing status updates with nobody assigned to remember it.&lt;/p&gt;

&lt;p&gt;The practical takeaway: if a teammate says "I set up a routine," ask &lt;em&gt;where&lt;/em&gt;. A cloud routine keeps running when their laptop is shut. A local one doesn't. A Slack routine only exists inside that one channel. They're three different systems that happen to share a name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A weekly GitHub-triggered routine that reviews every pull request against a house style guide before a human looks at it.&lt;/li&gt;
&lt;li&gt;A nightly local task that reorganizes a folder of downloaded reports, useful only while your machine is actually on.&lt;/li&gt;
&lt;li&gt;A Slack routine that watches a pull request and pings the channel the moment it merges.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where Cursor still fits
&lt;/h2&gt;

&lt;p&gt;None of this makes Cursor obsolete. The "which one wins" framing that dominates most comparison posts online misses how teams actually use these tools together: most professional developers now use more than one AI coding tool, per the adoption figures above, rather than settling on a single winner. Cursor's strength is still the in-editor, keystroke-level loop: inline suggestions and quick edits while you're heads-down in one file. Claude Code's strength is the session-level agent loop: describing an outcome and letting it run across files, tests, and commands with less of your attention.&lt;/p&gt;

&lt;p&gt;Worth knowing if you're evaluating either company's staying power: SpaceX fully acquired Cursor's parent company, Anysphere, in an all-stock deal finalized on August 14, 2026, per an SEC Form 8-K filing, as &lt;a href="https://finance.yahoo.com/technology/ai/articles/spacex-completes-record-60-billion-131311785.html" rel="noopener noreferrer"&gt;reported by Yahoo Finance&lt;/a&gt;. Cursor now operates as part of SpaceX's newly formed "SpaceXAI" division rather than as an independent startup. That's a genuinely new fact worth factoring into a build-vs-buy decision, separate from which tool writes better code today.&lt;/p&gt;

&lt;p&gt;Most teams we talk to don't pick one. They keep Cursor open for fast, in-file edits and reach for Claude Code (or Cowork, for the non-coding half of the job) when a task is big enough to hand off entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  How RevOS uses this stack
&lt;/h2&gt;

&lt;p&gt;We're not writing this as outside observers. RevOS's own CLI is &lt;a href="https://www.revos.ai/product/agentic-data-engineering" rel="noopener noreferrer"&gt;built specifically to be driven by AI coding agents&lt;/a&gt; like Claude Code and Cursor. That's a deliberate design choice, not an afterthought, because the whole point of the product is letting an agent build your data layer from plain-English intent instead of hand-written pipelines.&lt;/p&gt;

&lt;p&gt;And the meta-example: this very post exists because of a Claude Code Routine. A label on a GitHub issue triggered a cloud routine that researched the keywords, pulled the competitive landscape, drafted this MDX file, and ran it through a validation pass: the same "Routines" mechanism described two sections up, running unattended against our own content pipeline. It's the clearest sample use case we have, because you're reading its output right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Claude Code just Cursor with a different name?
&lt;/h3&gt;

&lt;p&gt;No. Cursor is a fork of VS Code with AI features built into the editor UI. Claude Code is a terminal-native agent that can also run inside an IDE, a desktop app, or a browser tab, the same engine either way. The practical difference is where you spend most of your time: inside an editor loop (Cursor) or handing off a full task to an agent that plans, edits, and runs commands across a session (Claude Code).&lt;/p&gt;

&lt;h3&gt;
  
  
  Who should use Claude Code?
&lt;/h3&gt;

&lt;p&gt;Developers and engineering teams working inside an existing repository who want to hand off a whole task, not just one line of autocomplete, and get back a plan, edited files, and a report. It fits equally well driven from a terminal, an IDE, a desktop app, or piped into a script or CI job.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Claude Cowork?
&lt;/h3&gt;

&lt;p&gt;Claude Cowork is an agentic workspace built on the same engine as Claude Code, designed for outcome-oriented work on local files and folders (contracts, spreadsheets, research) rather than a git checkout. You describe the outcome you want and check back once it's done, instead of responding turn by turn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Claude Cowork free?
&lt;/h3&gt;

&lt;p&gt;No. It's available on paid Claude plans (Pro, Max, Team, Enterprise), with no separate free tier, though it's included at no extra cost once you're on one of those plans.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is an agentic workflow?
&lt;/h3&gt;

&lt;p&gt;An agentic workflow is a task an AI agent completes by looping through perceive, reason, act, and check steps on its own, rather than answering one prompt and stopping. In the Claude ecosystem, that loop is the same whether it runs in a terminal, a desktop workspace, a Slack thread, or on a schedule. The surface changes, the underlying agent doesn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can you give an example of an agentic workflow?
&lt;/h3&gt;

&lt;p&gt;A concrete one: "write tests for the auth module, run them, and fix any failures." The agent explores the codebase, writes the tests, runs the suite, reads the failures, edits the code, and reruns the tests, looping until they pass, without a person approving each individual step along the way. A single prompt in, a working result out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is ChatGPT an agentic AI?
&lt;/h3&gt;

&lt;p&gt;It can act agentically when it uses tools, browses, or runs code across multiple steps, but its default chat mode is single-turn. "Agentic" describes a mode of operation (planning and acting toward a goal across a session), not one specific product. Claude Code, Cowork, and Claude Tag are all built around that agentic loop by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Cursor AI better than Claude Code for coding?
&lt;/h3&gt;

&lt;p&gt;Neither wins outright. They're shaped for different moments. Cursor is strongest for in-editor, keystroke-level suggestions while you're heads-down in one file. Claude Code is strongest for session-level work: describing an outcome and letting an agent plan, edit multiple files, run commands, and report back. Most teams we see run both rather than standardizing on one.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the most common Claude Code use cases?
&lt;/h3&gt;

&lt;p&gt;Writing and fixing code inside an existing repository, running and interpreting test suites, reviewing pull requests, and automating routine engineering chores like dependency bumps or log-triage scripts piped through &lt;code&gt;claude -p&lt;/code&gt;. Teams also use it for tasks that don't look like coding at all (refactoring config files, writing docs from a codebase, or scripting one-off data cleanups) because the same agent that edits code can just as easily edit text.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://www.revos.ai/blog/claude-code-cowork-tag-routines?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-code-cowork-tag-routines" rel="noopener noreferrer"&gt;RevOS blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;RevOS works inside Claude, ChatGPT, Slack and Teams, so agents answer from the same governed revenue data. Want to see it on your own data? &lt;a href="https://try.revos.ai/meetings/renat/revos-demo?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-code-cowork-tag-routines" rel="noopener noreferrer"&gt;Book a RevOS demo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
      <category>claude</category>
    </item>
    <item>
      <title>Agentic Data Engineering: How AI Agents Build Data You Can Trust</title>
      <dc:creator>RevOS</dc:creator>
      <pubDate>Tue, 20 Oct 2026 10:21:36 +0000</pubDate>
      <link>https://dev.to/revos/agentic-data-engineering-how-ai-agents-build-data-you-can-trust-2mgh</link>
      <guid>https://dev.to/revos/agentic-data-engineering-how-ai-agents-build-data-you-can-trust-2mgh</guid>
      <description>&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agentic data engineering uses autonomous AI agents to build and maintain data pipelines from plain-English intent, not line-by-line code written by hand.&lt;/li&gt;
&lt;li&gt;The bottleneck isn't the model's intelligence. It's the control layer around it: the grounding that tells the agent which answer is right, and the controls that catch a wrong one before it ships.&lt;/li&gt;
&lt;li&gt;A governed semantic layer lifts text-to-SQL accuracy from about 51% to over 90%, proof that context, not capability, decides whether an agent's SQL is correct.&lt;/li&gt;
&lt;li&gt;Trust comes from the workflow: the agent ships changes as a pull request that passes tests and CI before a human merges it. It fails at review time, not in production.&lt;/li&gt;
&lt;li&gt;The data engineer's job shifts from writing every transformation to defining intent, reviewing diffs, and governing what the agent is allowed to do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project has been on the roadmap for two quarters. Cohort retention. Lead scoring. LTV by channel. Every week without it costs something concrete: a board question you can't answer, a campaign you can't attribute, a churn signal you caught too late.&lt;/p&gt;

&lt;p&gt;So you did what any technical operator would do in 2026: you opened ChatGPT, or Claude, and asked it to write the SQL. And it did. Beautifully. The queries ran, the numbers came back, the charts looked clean. Then someone asked whether the retention number was &lt;em&gt;actually&lt;/em&gt; right, and you couldn't say. No lineage, no tests, no agreed definition of what "active" even meant. Just fluent SQL nobody had verified. Looking great and being right, it turns out, are very different things.&lt;/p&gt;

&lt;p&gt;That gap, between an AI that can write data code and an AI you can trust to &lt;em&gt;ship&lt;/em&gt; it, is the whole story of &lt;strong&gt;agentic data engineering&lt;/strong&gt;. This guide explains what the term means, how the workflow actually works, the tools that make it possible, and the part most vendors skip: how you let an agent touch production data without getting burned.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is agentic data engineering?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agentic data engineering is the practice of using autonomous AI agents to design, build, and maintain data pipelines from natural-language intent, instead of an engineer writing every transformation by hand, with limited human oversight.&lt;/strong&gt; The agent plans the work, writes the code (ingestion, SQL, tests), runs it, checks the result, and corrects itself; a human reviews and approves the final change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The key word is &lt;em&gt;agentic&lt;/em&gt;. A plain AI assistant answers a question and stops. An &lt;strong&gt;agent&lt;/strong&gt; works toward a goal across many steps on its own: it perceives the state of your data, reasons about what to do next, takes an action, reads the outcome, and loops until the goal is met. Researchers call this the &lt;strong&gt;perceive → reason → act → learn&lt;/strong&gt; loop. In data engineering, that loop looks like: explore the warehouse, write a transformation, run the tests, read the failures, fix them, and present the finished change for review.&lt;/p&gt;

&lt;p&gt;This is the shift from doing the &lt;strong&gt;"how"&lt;/strong&gt; by hand to specifying the &lt;strong&gt;"what"&lt;/strong&gt; and reviewing the result. You stop writing every line of SQL and start describing the metric you need, then the agent does the building. The promise is real, but so is the catch, which is the rest of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agentic vs. traditional data engineering, and vs. automation and copilots
&lt;/h2&gt;

&lt;p&gt;Three things get confused with agentic data engineering. They're not the same.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Who decides the steps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Static automation&lt;/strong&gt; (cron, Airflow DAGs)&lt;/td&gt;
&lt;td&gt;Runs a fixed sequence someone wrote in advance&lt;/td&gt;
&lt;td&gt;A human, ahead of time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;AI copilot&lt;/strong&gt; (autocomplete in your editor)&lt;/td&gt;
&lt;td&gt;Suggests the next line or block while you drive&lt;/td&gt;
&lt;td&gt;A human, line by line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pursues a goal across many steps, adapts to what it finds&lt;/td&gt;
&lt;td&gt;The agent, within your guardrails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Traditional data engineering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A person hand-builds each pipeline, query, and test&lt;/td&gt;
&lt;td&gt;A human, step by step&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A scheduler repeats what you already decided. A copilot autocompletes while you stay in control. An &lt;strong&gt;agent&lt;/strong&gt; takes a goal ("build me a weekly cohort-retention model") and figures out the steps itself, including the ones you didn't anticipate. That autonomy is what makes it powerful, and exactly why the controls around it matter so much.&lt;/p&gt;

&lt;p&gt;One more term to untangle: &lt;strong&gt;agentic analytics&lt;/strong&gt;. The two are siblings, not synonyms. Agentic analytics works on the &lt;em&gt;serving&lt;/em&gt; side: it asks questions of data that already exists (the BI and query layer). Agentic data engineering works one layer down: it &lt;em&gt;builds and maintains the pipelines and models&lt;/em&gt; that produce that data in the first place. You need the engineering layer to be sound before the analytics layer can be trusted.&lt;/p&gt;

&lt;h2&gt;
  
  
  How agentic data engineering works
&lt;/h2&gt;

&lt;p&gt;Under the hood, an agentic workflow runs your raw data through the same stages a human data team would, building an AI data pipeline driven by intent instead of tickets:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ingestion.&lt;/strong&gt; Source data lands in your warehouse from your apps, CRM, product database, and third-party tools. Connectors like Airbyte or Meltano handle the extract-and-load so the agent has raw tables to work from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transformation.&lt;/strong&gt; The agent writes the models that turn raw tables into clean, business-ready ones, typically as &lt;a href="https://www.getdbt.com/" rel="noopener noreferrer"&gt;dbt&lt;/a&gt; models in a layered (bronze → silver → gold) structure, with tests attached.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic layer.&lt;/strong&gt; Cleaned tables still don't know what &lt;em&gt;your business&lt;/em&gt; means by "active user" or "qualified lead." A semantic layer encodes those definitions once, so every query, human or agent, uses the same math. (We go deep on this in &lt;a href="https://www.revos.ai/blog/what-is-a-semantic-layer" rel="noopener noreferrer"&gt;what a semantic layer is and why it matters&lt;/a&gt;, and on &lt;a href="https://www.revos.ai/blog/structuring-data-for-ai-agents" rel="noopener noreferrer"&gt;how it compares to knowledge graphs, RAG, and plain markdown + grep&lt;/a&gt; as ways to structure data for an agent.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serving.&lt;/strong&gt; The finished metrics are queried by dashboards, notebooks, or, increasingly, by other AI agents over a protocol like MCP (the Model Context Protocol), which lets an agent ask your data questions in a structured, governed way.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You describe the metric; the agent explores the lakehouse, writes the dbt model, builds the semantic overlay, and runs the tests. That's the happy path. Now the part that decides whether any of it is trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the model isn't the bottleneck: it's the control layer
&lt;/h2&gt;

&lt;p&gt;If you've already pointed an AI coding agent at a data problem and watched it produce confident garbage, you've met the real bottleneck. It isn't the model. It's the &lt;strong&gt;control layer&lt;/strong&gt; the model works against.&lt;/p&gt;

&lt;p&gt;So what is a control layer? &lt;strong&gt;A control layer is the software around an AI model that makes its output safe to ship in production: the &lt;em&gt;grounding&lt;/em&gt; that tells the agent which answer is right (your lineage, business semantics, and access policies) and the &lt;em&gt;controls&lt;/em&gt; that catch a wrong answer before it lands (validation loops, data contracts, CI/CD, and an audit trail).&lt;/strong&gt; A model writes code; the control layer decides whether that code is safe to merge.&lt;/p&gt;

&lt;p&gt;The intuition is simple: the model is only the engine. Impressive on a workbench, but useless until it's bolted into the rest of the car: a chassis, wheels, a steering wheel, pedals to control the power, and a dashboard that shows what's actually happening. The control layer is the rest of the car.&lt;/p&gt;

&lt;p&gt;Put a generic agent and an agent with a control layer side by side:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Generic AI agent&lt;/th&gt;
&lt;th&gt;Agent with a control layer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Starts from&lt;/td&gt;
&lt;td&gt;A blank file: no schema, no definitions&lt;/td&gt;
&lt;td&gt;Your schema, dbt models, and business definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picks the right answer by&lt;/td&gt;
&lt;td&gt;Guessing, fluently&lt;/td&gt;
&lt;td&gt;Grounding: your lineage, semantics, and access policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catches a wrong answer with&lt;/td&gt;
&lt;td&gt;Nothing; it ships&lt;/td&gt;
&lt;td&gt;Validation loops, PK/unique checks, data contracts, CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistakes surface&lt;/td&gt;
&lt;td&gt;In production, in a downstream dashboard&lt;/td&gt;
&lt;td&gt;At review time, as a pull-request diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In production it acts&lt;/td&gt;
&lt;td&gt;Unsupervised&lt;/td&gt;
&lt;td&gt;Scoped, time-bound, human-in-the-loop, fully audit-logged&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That gap is measurable. &lt;a href="https://www.snowflake.com/en/blog/engineering/cortex-analyst-text-to-sql-accuracy-bi/" rel="noopener noreferrer"&gt;Snowflake put a number on it&lt;/a&gt;: on text-to-SQL (natural language to SQL), a general-purpose model (GPT-4o) scored just &lt;strong&gt;51%&lt;/strong&gt; on their internal evaluation, while grounding the same task in a governed semantic model pushed accuracy past &lt;strong&gt;90%&lt;/strong&gt; on real-world queries, nearly 2× single-shot GPT-4o. The difference between a wrong query and a right one is almost entirely context, not capability. That's also why &lt;a href="https://www.revos.ai/blog/data-readiness-for-machine-learning" rel="noopener noreferrer"&gt;data readiness&lt;/a&gt; (clean, tested, well-defined inputs) matters more than which model you pick.&lt;/p&gt;

&lt;p&gt;The market already senses this. In &lt;a href="https://cleanlab.ai/ai-agents-in-production-2025/" rel="noopener noreferrer"&gt;Cleanlab's 2025 survey&lt;/a&gt; of 1,837 engineering leaders, only &lt;strong&gt;~5.2%&lt;/strong&gt; run AI agents in production. &lt;a href="https://www.getdbt.com/resources/state-of-analytics-engineering-2026" rel="noopener noreferrer"&gt;dbt's 2026 report&lt;/a&gt; found &lt;strong&gt;72%&lt;/strong&gt; of practitioners want AI-assisted coding but only &lt;strong&gt;24%&lt;/strong&gt; trust it to manage pipelines. &lt;a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="noopener noreferrer"&gt;METR's 2025 study&lt;/a&gt; even measured experienced developers running &lt;strong&gt;19% slower&lt;/strong&gt; with AI on familiar code while &lt;em&gt;feeling&lt;/em&gt; faster. The appetite is real; the reliability isn't, because the control layer isn't there.&lt;/p&gt;

&lt;p&gt;One principle decides everything downstream: &lt;strong&gt;the agent fails at review time, not in production.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like in practice
&lt;/h2&gt;

&lt;p&gt;Theory is cheap; here's a concrete worked example. At RevOS we built exactly this control layer, so the abstract pieces above have real names. What you install is a packaged offering: a set of APIs, a command-line interface, documentation, and curated agentic skills, wrapped in a dev container you open in your IDE (Visual Studio Code or similar) and drive with Claude Code (or a coding agent of your choice). There's no new UI to learn; it lives where you already write code.&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%2Fcd1hj0k6gyjc0t1qfk7v.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%2Fcd1hj0k6gyjc0t1qfk7v.png" alt="The RevOS demo project open in a VS Code dev container: the dbt medallion models (bronze, silver, and gold staging and mart models) in the file explorer, with Claude Code describing the scaffolded sample datasets and data-quality stats." width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;code&gt;revos init&lt;/code&gt; scaffolds a working project (medallion dbt models, semantic cubes, and sample data) that your agent can explore from minute one.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Under that surface, RevOS wires together a best-of-breed stack (automated data ingestion, dbt for transformation, Cube.dev for the semantic layer, Git for versioning, BigQuery as the warehouse), so your agent starts with your schema, your models, and your definitions instead of a blank file. You describe the metric you need; the agent explores your lakehouse, writes the dbt model, and builds the semantic overlay. (For the full product view, see how RevOS helps you &lt;a href="https://www.revos.ai/product/agentic-data-engineering" rel="noopener noreferrer"&gt;build a revenue or growth data layer without hiring a data engineer&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Then the part that earns trust: when the agent finishes a model, the control layer doesn't accept it on faith. Validation loops run. Primary-key and unique-constraint checks fire. YAML data-contract enforcement kicks in. The change moves through the &lt;strong&gt;same Git CI/CD pipeline as your application code&lt;/strong&gt; and lands on your desk as a pull request with a diff. When the agent gets it wrong (and it will), you catch it in the PR, not at 3 a.m. in a downstream dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trust problem: governing an AI agent on production data
&lt;/h2&gt;

&lt;p&gt;The single hardest question in agentic data engineering is the one most marketing pages dodge: &lt;em&gt;how do you let an autonomous agent near production without it doing something irreversible?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The answer is workflow, not faith. Three controls do the heavy lifting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Changes ship as pull requests.&lt;/strong&gt; The agent never writes directly to production. It proposes a diff that runs through tests and CI; a human reads it and merges it. This is the concrete meaning of "fails at review time." A wrong model is a red check on a PR, not a corrupted table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions are scoped and time-bound.&lt;/strong&gt; The agent gets exactly the access a task needs, for as long as the task takes, not standing admin rights. Mutating actions in production (schema changes, deletions, permission grants) keep a human in the loop by design. Scoping is only half the job: the agent also needs an identity distinct from the authority it borrows, so that &lt;em&gt;who acted&lt;/em&gt; and &lt;em&gt;who permitted it&lt;/em&gt; stay separable after the fact. See &lt;a href="https://www.revos.ai/blog/ai-agent-identity" rel="noopener noreferrer"&gt;AI agent identity&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every action is audit-logged.&lt;/strong&gt; An immutable trail of what the agent did, when, and why means you can answer "what changed?" after the fact. That's the difference between a controlled system and a black box.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why be this strict? Because verbal guardrails don't bind an agent; technical ones do. The widely reported case of an AI agent wiping a live production database during a code freeze is the cautionary tale: it had every capability to help and none of the controls to be safe. Autonomy should scale &lt;em&gt;as trust accrues&lt;/em&gt;, never the other way around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Will AI agents replace data engineers?
&lt;/h2&gt;

&lt;p&gt;Short answer: no. They change the job. The "AI data engineer" worth imagining is a tooling shift, not a headcount replacement. The work that agents absorb is the repetitive build work: boilerplate models, test scaffolding, documentation, the tenth slightly-different staging table. What they don't absorb is judgment: deciding what a metric &lt;em&gt;should&lt;/em&gt; mean, whether a result is plausible, and what the agent is allowed to touch.&lt;/p&gt;

&lt;p&gt;So the role moves up the stack. Less time typing SQL; more time defining intent, reviewing the agent's pull requests, and owning the semantic layer and governance that keep the agent correct. The scarce, valuable skill becomes knowing what "right" looks like, which is exactly the skill a generic model lacks. Put simply, an AI data engineer doesn't replace the human one; it hands the human a faster, more reviewable way to work. (For the bigger picture of how AI reshapes data work, see our take on &lt;a href="https://www.revos.ai/blog/modern-data-strategy-age-of-ai" rel="noopener noreferrer"&gt;modern data strategy in the age of AI&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;That same shift, from recognizing a familiar pattern to reasoning through an unfamiliar one, is why the scarce skill is so hard to fake or shortcut. One of our engineers hit this exact wall &lt;a href="https://www.revos.ai/blog/dp-700-exam-recognition-vs-retrieval" rel="noopener noreferrer"&gt;studying for a Microsoft Fabric certification&lt;/a&gt;: passing every practice test only taught him to recognize answers, and the real exam tested whether he could reason his way to new ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  What tools power agentic data engineering
&lt;/h2&gt;

&lt;p&gt;There's no single product called "agentic data engineering." It's a stack, and you can assemble it from best-of-breed parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ingestion:&lt;/strong&gt; Airbyte, Fivetran, or Meltano move raw data into the warehouse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transformation:&lt;/strong&gt; dbt is the de facto standard for version-controlled, tested SQL models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic layer:&lt;/strong&gt; Cube.dev (or dbt's own semantic layer) encodes business definitions so queries stay consistent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warehouse / lakehouse:&lt;/strong&gt; BigQuery, Snowflake, Databricks, or an open table format like Iceberg or Delta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version control + CI/CD:&lt;/strong&gt; Git plus a pipeline that runs tests on every change. This is what makes the PR-review safety model possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent:&lt;/strong&gt; a coding agent like Claude Code (a data engineering agent once it's pointed at your warehouse), connected to your data and tools through MCP, that actually writes and runs the work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent is the smallest piece. The other five are the control layer, and they're what separate a fun demo from something you'd trust with a board number. Tools that bundle these into one governed workflow (RevOS pre-wires dbt, Cube.dev, BigQuery, and Git behind a Claude Code agent) save you from stitching them together yourself, but the architecture is the same whether you buy it or build it. Claude Code itself is only one surface in a growing family. If you're also weighing Claude Cowork, Claude Tag, or one of Anthropic's several "Routines" for scheduling this kind of work, see our &lt;a href="https://www.revos.ai/blog/claude-code-cowork-tag-routines" rel="noopener noreferrer"&gt;map of the Claude ecosystem&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where agentic data engineering is headed
&lt;/h2&gt;

&lt;p&gt;The category is young and moving fast, and the direction is clear: data engineering is going AI-native, with pipelines built around agents from the first commit rather than retrofitted onto a hand-built stack. A few specifics worth watching:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More backends and open formats.&lt;/strong&gt; Iceberg and Delta are pulling the warehouse and the lake together, which gives agents one consistent surface to work against.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broader warehouse support.&lt;/strong&gt; Today many agentic tools are warehouse-specific; expect coverage to widen across Snowflake, Databricks, and Microsoft Fabric.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open connectivity and semantic standards.&lt;/strong&gt; Frameworks like Meltano for ingestion, and competing semantic-model languages, are converging toward portability, so your definitions aren't locked to one vendor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents querying agents.&lt;/strong&gt; As MCP matures, the consumer of your data layer is increasingly another AI agent, not a human in a dashboard. That raises the bar on governance, because the semantic layer is now the contract between machines. Governance is only half the picture, though. The agent also has to stay reliably &lt;em&gt;running&lt;/em&gt;, and &lt;a href="https://www.revos.ai/blog/hermes-agent-kubernetes" rel="noopener noreferrer"&gt;what breaks when you deploy a self-improving agent like Hermes Agent to Kubernetes&lt;/a&gt; is its own reliability problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The throughline: the model gets cheaper and smarter every quarter, but the value keeps moving to the control layer around it. Whoever owns clean, governed, well-defined data wins, which is why we've argued the &lt;a href="https://www.revos.ai/blog/generative-ai-dilemma-opportunity-vs-monopoly" rel="noopener noreferrer"&gt;real AI advantage is your data, not the model&lt;/a&gt;, and why that data, once captured as decision traces in a governed semantic model, becomes what's now being called &lt;a href="https://www.revos.ai/blog/token-capital" rel="noopener noreferrer"&gt;token capital&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;You don't need to adopt the whole category at once. The fastest way to feel the difference is to put an agent on a stack it already understands and ask for one real metric.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The idea of giving Claude Code a structured dbt/Cube/BigQuery environment makes a lot of sense. The predefined context, conventions, and architecture should help generate more accurate and consistent results than a generic AI coding assistant.&lt;/p&gt;

&lt;p&gt;What stood out to me most was the focus on combining AI with a well-defined data framework rather than just code generation. That feels like a meaningful differentiator. For teams that need a revenue or growth data layer but don't yet have a dedicated data engineer, this could significantly accelerate implementation and reduce complexity while still allowing for human oversight where needed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vira Slipchenko, Data Analyst, Fin-Navi GmbH&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The reproducible version with RevOS: install the CLI and run &lt;code&gt;revos init&lt;/code&gt;. You land in a working project preloaded with sample datasets and models, so there's something real to point your agent at from minute one. Ask it to explore the sample lakehouse and build your first model. From install to a production-ready model is an afternoon, not a quarter. The full set of agent capabilities, skills, and interfaces is on the free plan (up to 1 GB of storage), so trying it costs you an afternoon and nothing more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i -g @revos/cli
revos init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The zero-to-scheduled-action walkthrough lives at &lt;a href="https://cli.revos.dev" rel="noopener noreferrer"&gt;cli.revos.dev&lt;/a&gt;. Try it out today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is agentic data engineering?
&lt;/h3&gt;

&lt;p&gt;Agentic data engineering is the practice of using autonomous AI agents to design, build, and maintain data pipelines from natural-language intent, instead of an engineer writing every transformation by hand. The agent plans the work, writes the code (ingestion, SQL, tests), runs it, checks the result, corrects itself, and a human approves the change.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is agentic data engineering different from traditional data engineering?
&lt;/h3&gt;

&lt;p&gt;Traditional data engineering is task-driven: a person writes each pipeline, query, and test step by step. Agentic data engineering is intent-driven and autonomous: you describe the outcome you want, an AI agent plans and executes the steps and validates its own work with limited human oversight, and you review the result. The shift is from doing the "how" by hand to specifying the "what" and approving the diff.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the difference between an AI copilot and an AI data agent?
&lt;/h3&gt;

&lt;p&gt;A copilot suggests code one line at a time while you stay in the driver's seat. An agent works toward a goal across many steps on its own: it explores your data, writes a model, runs tests, reads the errors, and fixes them in a loop. A copilot autocompletes; an agent completes a task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will AI agents replace data engineers?
&lt;/h3&gt;

&lt;p&gt;No. They change the job. Agents handle the repetitive build work (boilerplate models, tests, documentation), while engineers move up to defining metrics and intent, reviewing the agent's pull requests, and governing what it's allowed to touch. The scarce skill becomes judgment about what is correct, not typing SQL faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  How accurate is AI at writing SQL?
&lt;/h3&gt;

&lt;p&gt;A general-purpose model writing SQL from a raw schema is unreliable: GPT-4o scored about 51% on Snowflake's internal text-to-SQL evaluation. Grounding the same task in a governed semantic model pushed accuracy past 90%. The difference between a wrong query and a right one is almost entirely context, not the model's raw capability.&lt;/p&gt;

&lt;h3&gt;
  
  
  What tools power agentic data engineering?
&lt;/h3&gt;

&lt;p&gt;A typical stack pairs automated ingestion (Airbyte, Meltano), a transformation framework (dbt), a semantic layer (Cube.dev), a warehouse (BigQuery, Snowflake, Databricks), version control and CI/CD (Git), and a coding agent (Claude Code) connected to your data through MCP. The agent writes and runs the transformations; the rest is the control layer that keeps its output correct and safe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it safe to let an AI agent work on production data?
&lt;/h3&gt;

&lt;p&gt;It is safe when autonomy is earned, not granted by default. Permissions should be scoped and time-bound, every action should land in an immutable audit log, and mutating actions in production (schema changes, deletions, permission grants) should keep a human in the loop. Changes arriving as a reviewable pull-request diff mean mistakes surface at review time, not in a live dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do AI data agents need a semantic layer?
&lt;/h3&gt;

&lt;p&gt;They work far better with one. A semantic layer encodes your business definitions (what "active user", "revenue", or "churn" actually mean) so the agent doesn't have to guess them from raw column names. It's the single biggest lever on accuracy: the same model that guesses against a raw schema becomes reliable when it queries a governed semantic model.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I get started with agentic data engineering?
&lt;/h3&gt;

&lt;p&gt;Start small on a stack the agent already understands. With RevOS you install the CLI, run &lt;code&gt;revos init&lt;/code&gt;, and land in a working project preloaded with sample data, dbt models, and a semantic layer, then point a coding agent at it and ask for your first metric. From install to a production-ready model is an afternoon, and the free plan (up to 1 GB) makes trying it cost nothing but time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://www.revos.ai/blog/agentic-data-engineering?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=agentic-data-engineering" rel="noopener noreferrer"&gt;RevOS blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Want to see this on your own data? &lt;a href="https://try.revos.ai/meetings/renat/revos-demo?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=agentic-data-engineering" rel="noopener noreferrer"&gt;Book a RevOS demo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>ai</category>
      <category>dbt</category>
      <category>agents</category>
    </item>
    <item>
      <title>AI Agent Identity: Who Acted, and Under Whose Authority?</title>
      <dc:creator>RevOS</dc:creator>
      <pubDate>Fri, 16 Oct 2026 08:21:20 +0000</pubDate>
      <link>https://dev.to/revos_ai/ai-agent-identity-who-acted-and-under-whose-authority-4jho</link>
      <guid>https://dev.to/revos_ai/ai-agent-identity-who-acted-and-under-whose-authority-4jho</guid>
      <description>&lt;p&gt;Suppose you tell an agent: &lt;em&gt;move Acme to At Risk, create a task for the account owner, and prepare a renewal plan.&lt;/em&gt; The agent does exactly that.&lt;/p&gt;

&lt;p&gt;What should your CRM say happened?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Last modified by Alex&lt;/strong&gt;, because you asked for it? &lt;strong&gt;Last modified by Renewal Agent&lt;/strong&gt;, because the agent performed the operation? Or &lt;strong&gt;Renewal Agent, on behalf of Alex&lt;/strong&gt;, because both facts matter?&lt;/p&gt;

&lt;p&gt;This looks like a UX detail. It isn't. It's the question of &lt;strong&gt;AI agent identity&lt;/strong&gt;, and the honest answer is the third one. Almost no enterprise system has a place to put it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AI agent identity?
&lt;/h2&gt;

&lt;p&gt;AI agent identity is the practice of giving an AI agent its own distinct, verifiable identity in your systems. That identity is separate from the human who asked it to act, and separate from the shared service account it might otherwise borrow. It exists so every action the agent takes can be attributed to it specifically.&lt;/p&gt;

&lt;p&gt;The hard part is what the definition leaves out, so let's name it immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identity&lt;/strong&gt; answers &lt;em&gt;who performed this operation?&lt;/em&gt; Call that the &lt;strong&gt;actor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authority&lt;/strong&gt; answers &lt;em&gt;whose permissions allowed it to happen?&lt;/em&gt; Call that the &lt;strong&gt;authority&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;em&gt;principal&lt;/em&gt;, in identity terms, is any entity a system can authenticate and grant rights to. For a human user, the actor and the authority are the same principal, so enterprise software only ever built one field. A user authenticates, the user has roles, the user performs an action, the audit log records the user. One principal, start to finish.&lt;/p&gt;

&lt;p&gt;An agent breaks that. Consider two chains that produce an identical database write, both routed through the Model Context Protocol (MCP):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alex            -&amp;gt;  Renewal Agent  -&amp;gt;  MCP  -&amp;gt;  HubSpot
Renewal policy  -&amp;gt;  Renewal Agent  -&amp;gt;  MCP  -&amp;gt;  HubSpot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In both, the Renewal Agent is the actor. In the first, a person is the authority. In the second, running at 03:14 with nobody at a keyboard, the authority is an organizational policy and the permissions granted to the agent itself. Same actor, same write, completely different accountability. A system with one field cannot tell them apart.&lt;/p&gt;

&lt;p&gt;Hence the argument of this piece: &lt;strong&gt;every production agent should have an identity, but not every agent should have its own authority.&lt;/strong&gt; Those are two separate decisions. Conflating them produces both of the common failure modes: agents that vanish behind a human's name, and agents handed far more power than the job needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enterprise software was built for one kind of actor
&lt;/h2&gt;

&lt;p&gt;Identity systems have spent decades getting good at people. Then they added a second category, applications and service accounts, for machines running predefined operations. That gave us a clean two-box model: humans who decide, and software that executes.&lt;/p&gt;

&lt;p&gt;The second box is now enormous. Palo Alto Networks' 2026 Identity Security Landscape surveyed 2,900+ cybersecurity decision-makers and reports that machine identities outnumber humans 109:1. Treat that as directional rather than precise, since the publisher sells identity security. The industry's name for that box is "non-human identity," and the operational concern behind it is sprawl: thousands of long-lived credentials nobody owns or rotates.&lt;/p&gt;

&lt;p&gt;Agents don't fit either box. An agent can reason, choose which tools to call, decide which records to modify, and initiate a sequence nobody specified. That's the human box. It also needs machine credentials, deterministic policy, and tight privilege scoping. That's the service-account box.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should an AI agent be a service account or a user account?
&lt;/h3&gt;

&lt;p&gt;Neither, exactly. Treating an agent as a service account gets you credential hygiene but loses the fact that it made a choice. Treating it as a user account gets you attribution but quietly grants it a person's entire authority. Both are the one-principal model straining against a two-principal reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actor and authority are two different things
&lt;/h2&gt;

&lt;p&gt;Once you separate actor from authority, a lot of confused arguments resolve.&lt;/p&gt;

&lt;p&gt;"Just let the agent use the user's OAuth token" is the most common shortcut. It's a statement about authority that accidentally destroys the actor. The agent gets the right permissions and becomes invisible in the process, because every action it takes is indistinguishable from the human's own. That's tolerable when the agent is summarizing a report. It's misleading when the agent decided something at 03:14.&lt;/p&gt;

&lt;p&gt;The mechanics for keeping both facts already exist in the identity world. OAuth's on-behalf-of flow and RFC 8693 token exchange let one principal act with another's authority while remaining distinguishable, carrying a &lt;code&gt;subject&lt;/code&gt; and an &lt;code&gt;actor&lt;/code&gt; in the same token. What's been missing isn't cryptography. It's the enterprise convention of using it for agents, plus the fields in downstream systems to record the result.&lt;/p&gt;

&lt;p&gt;Microsoft's own guidance frames this as a question any agent identity model has to answer: was the action performed on behalf of a user or by the application itself? That's the actor/authority distinction in a vendor's words, and it's a question your CRM's &lt;code&gt;Last Modified By&lt;/code&gt; field structurally cannot answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five models of agent autonomy
&lt;/h2&gt;

&lt;p&gt;"AI agent" describes deployments so different that one identity policy can't cover them. Sorting by autonomy rather than architecture gives five models, and the amount of visible identity each needs rises as you go down the list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The invisible assistant.&lt;/strong&gt; The agent searches, summarizes, or drafts using the user's permissions. From the business application's point of view the human is still the actor, and that's fine. For low-risk assistance, inventing a separate principal adds governance overhead with nothing to govern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The named capability.&lt;/strong&gt; The organization creates a recognizable "Renewal Agent" or "Research Agent." People invoke it, and it still runs on the invoking user's authority. The agent has a product identity without becoming an independent employee. Most internal AI tooling lives here, and most of it should.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The delegated agent.&lt;/strong&gt; The agent has its own identity and acts under someone's delegated authority, so the system can record &lt;code&gt;subject: Alex, actor: Renewal Agent&lt;/code&gt;. I'd expect the bulk of enterprise agent activity to land here, because it's the first rung that survives an audit: you can reconstruct both who wanted the work and what performed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The autonomous agent.&lt;/strong&gt; Its own identity &lt;em&gt;and&lt;/em&gt; its own constrained permissions. It monitors, decides, and acts on organizational policy rather than waiting for a person to ask. Nobody is present, so borrowing a human's authority isn't just imprecise, it's a fiction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The digital coworker.&lt;/strong&gt; The agent becomes an organizational participant with its own account and presence, and colleagues interact with it roughly as they would another team member. Identity here is not optional: the agent needs a first-class organizational account, because other people will address it, assign it work, and expect its actions to be attributable the way a colleague's are.&lt;/p&gt;

&lt;p&gt;The five models aren't competing standards to pick between. They're rungs, and the useful principle is directional: &lt;strong&gt;the more independently an agent acts, the less acceptable it becomes for it to hide behind a human identity.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How six platforms handle agent identity today
&lt;/h2&gt;

&lt;p&gt;Here's what makes this architecture rather than opinion. Six platforms have taken up the same distinction, in different idioms, with no shared standard between them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;How it treats actor and authority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Entra Agent ID&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ships both principals. Two explicit modes: autonomous access (rights given directly to the agent identity) and delegated access (acting on behalf of human users). For agents created in Copilot Studio, it also records the user who created the agent as its &lt;em&gt;sponsor&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Cloud Agent Identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ships both principals, a layer lower. Each agent gets a strongly attested cryptographic identity based on the SPIFFE standard. Not a shared service account: not impersonable, no long-lived keys. Supports an agent using its own identity, and acting for a specific user.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot coding agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ships both principals as two fields on one object: commits are authored by Copilot, with the human who started the task marked as the co-author. Neither identity disappears.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Salesforce Agentforce&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Addresses authority, not attribution. Every agent is associated with a running user that determines what it can access. Whether standard audit fields name the agent is a separate, open question.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ServiceNow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Addresses authority by constraining it. Agents run as a dynamic user inheriting the invoking user's permissions, with role-masking limiting them to a subset of that user's roles. The intersection model, shipped and mandatory.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model Context Protocol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Names both principals, and lists the work as unfinished. The spec forbids token passthrough, while the roadmap states that MCP authorization assumes a person with a browser at consent time, and calls for agents to be reachable through their own or a user-delegated identity.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So the accurate scorecard is three platforms recording both principals today, two addressing the authority half, and the protocol maintainers naming both while the work is still in flight. Microsoft, Google and GitHub arrived at the same two-principal structure without coordinating on a standard, and the MCP maintainers independently named it as the gap to close. Four arrivals at one structure suggests the distinction is being forced by the problem rather than chosen as a fashion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent permissions are an intersection, not an inheritance
&lt;/h2&gt;

&lt;p&gt;Once agents are identifiable principals, a second assumption breaks: &lt;em&gt;if I can do it, should every agent I use also be able to do it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Clearly not. A chief revenue officer can view every opportunity, change ownership, approve discounts, delete records, and export customer data. A pipeline-analysis agent invoked by that executive needs to read opportunities, update a few fields, and create tasks. Nothing else.&lt;/p&gt;

&lt;p&gt;So the mental model isn't &lt;code&gt;agent permissions = user permissions&lt;/code&gt;. It's closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;effective permissions = user authority ∩ agent permissions ∩ workflow policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An intersection, not an inheritance: three constraints that all have to permit an action, rather than one grant flowing downhill.&lt;/p&gt;

&lt;p&gt;This isn't hypothetical. ServiceNow ships it: agents run as a "Dynamic user" which inherits the permissions of the invoking user, and role-masking minimizes the roles an agent can execute to a subset of the invoking user's roles. That's the invoking user's authority intersected with an agent-specific grant, and on current releases it's a required configuration, not advisory.&lt;/p&gt;

&lt;p&gt;There's a broader shift hiding in this. Traditional role-based access control asks &lt;em&gt;what can this user do?&lt;/em&gt; Agentic systems have to ask something richer: &lt;em&gt;what can this agent do, under this user's authority, through this tool, to this resource, in this context, right now?&lt;/em&gt; That's a policy problem, and the policy cannot live inside the agent, because a prompt-shaped guardrail is a suggestion. Rules that live in the layer the agent has to query hold; rules that live in the prompt are one clever injection away from a leak.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP authorization is now an agent identity problem
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol is becoming a common interface between agents and enterprise tools, which makes it where identity assumptions get tested. An agent might soon execute a chain like &lt;code&gt;agent -&amp;gt; MCP server -&amp;gt; CRM -&amp;gt; billing system -&amp;gt; another agent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The naive implementation propagates a user's bearer token down that whole chain. The specification forbids it, in normative language: clients must not send tokens to an MCP server other than ones issued by that server's authorization server, and servers must only accept tokens valid for their own resources. Tokens have to be validated as issued specifically for that server as the intended audience (RFC 8707).&lt;/p&gt;

&lt;p&gt;Audience-binding is a good rule. It solves the confused-deputy problem, where a service with broad permissions is tricked into using them on a caller's behalf. It does not solve the identity problem, and the maintainers say so. Their roadmap is unusually direct: MCP authorization assumes a person with a browser at consent time, while increasingly the caller is an agent, a cloud workload with its own identity, acting for a user who isn't present, or spawning sub-agents that should get narrower authority than their parent. They call for "an opinionated way for MCP servers to be reached by agents through their own identity or a user-delegated identity."&lt;/p&gt;

&lt;p&gt;That's both principals, named by the people who maintain the protocol, listed as unfinished work.&lt;/p&gt;

&lt;p&gt;The practical failure is familiar to anyone who has wired one up against real data. Row-level security is the database rule that decides which rows a given user is allowed to see. Skip identity propagation and it silently stops applying, because the server never passed the calling user's identity through, so every caller sees everything. MCP doesn't eliminate the identity problem. It makes solving it unavoidable.&lt;/p&gt;

&lt;h2&gt;
  
  
  From audit log to action graph
&lt;/h2&gt;

&lt;p&gt;Traditional audit logs record a fact: &lt;em&gt;Alex changed field X from A to B at 14:32.&lt;/em&gt; One actor, one action, one timestamp.&lt;/p&gt;

&lt;p&gt;That shape can't hold an agent's work. For an autonomous action, the questions that matter form a chain: Who triggered this? Which agent decided to act? What context did it use? Which policy authorized it? Was human approval required? Which tool did it invoke? What did it change? What happened as a result?&lt;/p&gt;

&lt;p&gt;Answer those and you no longer have a log. You have a graph, with nodes for principals, agents, policies and tools, and edges for delegation and causation. This is where agent observability stops being a debugging convenience and becomes the accountability record.&lt;/p&gt;

&lt;p&gt;The closest thing shipping today is GitHub's commit trail: Copilot is the author, the delegating human is the co-author, the commits are signed so they appear as "Verified," and each commit message links to the agent session logs. Actor, authority, integrity and provenance: four facts on one object, in a system nobody would describe as an identity platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which agents do we employ?
&lt;/h2&gt;

&lt;p&gt;So the question enterprises need to answer isn't &lt;em&gt;which AI agents do we allow?&lt;/em&gt; It's: &lt;strong&gt;which agents do we employ, who is responsible for them, what authority have we delegated to them, and can we reconstruct every consequential action they take?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We spent decades building identity systems on the assumption that meaningful business actions trace back to a human. Agents break that assumption by adding a second principal the schema never had room for. Getting this right means knowing more than which model generated a response. It means knowing who asked, which agent acted, under whose authority, what it was permitted to do, what it did, and why. That's what accountability looks like when humans and agents work the same jobs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://www.revos.ai/blog/ai-agent-identity?utm_source=hashnode&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=ai-agent-identity" rel="noopener noreferrer"&gt;RevOS blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Want to see this on your own revenue data? &lt;a href="https://try.revos.ai/meetings/renat/revos-demo?utm_source=hashnode&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=ai-agent-identity" rel="noopener noreferrer"&gt;Book a RevOS demo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>identity</category>
      <category>mcp</category>
    </item>
    <item>
      <title>The Best Way to Structure Data for AI Agents</title>
      <dc:creator>RevOS</dc:creator>
      <pubDate>Wed, 14 Oct 2026 10:03:35 +0000</pubDate>
      <link>https://dev.to/revos_ai/the-best-way-to-structure-data-for-ai-agents-4k90</link>
      <guid>https://dev.to/revos_ai/the-best-way-to-structure-data-for-ai-agents-4k90</guid>
      <description>&lt;p&gt;Ask five vendors how to get your data ready for an AI agent, and you'll get five different answers, and every one of them will happen to be whatever that vendor sells. The graph-database company says knowledge graph. The vector-database company says RAG. The semantic-layer company says semantic model. None of them is lying, exactly. Each one is describing the one tool in their own box.&lt;/p&gt;

&lt;p&gt;The honest answer is that &lt;strong&gt;there is no single best way to structure data for an AI agent.&lt;/strong&gt; Five real approaches are in production use today: semantic models, ontologies and knowledge graphs, retrieval-augmented generation (RAG), plain markdown files searched with grep, and open knowledge formats. Each one solves a different failure mode. Pick the wrong one for your question, and the agent doesn't fail loudly. It fails quietly, returning a fluent, confident, wrong answer, because the model was never the bottleneck. The data it was handed was.&lt;/p&gt;

&lt;p&gt;This guide walks through all five, with the evidence for when each one works, so you can match the structure to the question instead of the vendor pitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "structuring data for AI agents" means
&lt;/h2&gt;

&lt;p&gt;Structuring data for an AI agent means organizing information so the agent can find the right fact, definition, or document reliably. The alternative is guessing from raw, unlabeled data and getting it wrong in a way that sounds right. Enterprise AI agents don't fail because the underlying model is weak. They fail because nobody told the agent what "active customer" means, or where the answer to a specific question lives.&lt;/p&gt;

&lt;p&gt;This is a data problem before it's a prompting problem. A model handed a clean, governed definition of a metric will use it. A model handed a pile of raw tables and no context will invent a plausible-sounding calculation instead, and you won't find out until someone checks the number in a meeting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five ways to structure data for an AI agent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Semantic models
&lt;/h3&gt;

&lt;p&gt;A semantic model (or semantic layer) defines your business metrics and entities once: "monthly recurring revenue," "active customer," "churn rate," with the exact tables, joins, and filters behind each one. The agent queries the metric by name instead of writing SQL against raw tables from scratch.&lt;/p&gt;

&lt;p&gt;This is the highest-leverage fix for a specific, common failure: an agent guessing at a business definition and getting a number that sounds right but isn't. In dbt Labs' 2026 benchmark, agents querying a semantic model hit 98.2%-100% accuracy on a set of business questions, against 84.1%-90.0% for the same models writing raw text-to-SQL against the full schema. The same benchmark also compared today's models to a 2023-era model doing raw text-to-SQL, and found accuracy nearly doubled over that 2.5-year gap, from 32.7% to 64.5%. That's real model progress. But even the best 2026 model still trailed the semantic-model number. That's the more direct evidence: the gap between a wrong query and a right one comes from what the agent is grounded against, not from how capable the underlying model is.&lt;/p&gt;

&lt;p&gt;Semantic models are the right call when the question is a &lt;strong&gt;recurring business metric&lt;/strong&gt; that many tools and many agents will ask about repeatedly, where "everyone gets the same number" matters. They're the wrong call for a one-off question about a single document, or for connecting facts across entities the model was never designed to relate.&lt;/p&gt;

&lt;p&gt;A semantic model also earns its keep in a way the other four approaches don't automatically match: define the metric once, and any AI agent can query it through MCP (the Model Context Protocol, an open standard for connecting agents to data sources), instead of every team building its own bespoke retrieval or graph layer to answer the same question. That turns the semantic model from a one-off project into shared infrastructure: a governed layer other agents can read from directly, rather than a definition locked inside one team's dashboard.&lt;/p&gt;

&lt;p&gt;You don't need a specific vendor to get this. dbt and Cube will both get you a semantic layer. What matters more than which tool you pick is treating the metric definition as the thing worth getting right once.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Ontologies and knowledge graphs
&lt;/h3&gt;

&lt;p&gt;A knowledge graph stores entities (people, accounts, products, contracts) and the explicit relationships between them, instead of flat tables or blocks of text. An ontology is the schema that defines what those entities and relationships are allowed to mean, so the graph stays consistent as it grows. Together, they let an agent traverse connections that a keyword or embedding match would miss entirely, such as "which accounts does this contact influence, and which of those accounts churned within six months of a support escalation?"&lt;/p&gt;

&lt;p&gt;This is where GraphRAG earns its name: retrieval that queries a knowledge graph, plus generated summaries of clusters of related entities, instead of a flat vector index. Microsoft's 2024 research found GraphRAG held a 72% win rate on comprehensiveness and a 62% win rate on diversity over plain vector RAG. Its top-level summaries also needed over 97% fewer tokens than summarizing the source text directly. A separate, independent 2025 systematic evaluation of RAG versus GraphRAG found that adding selection and integration strategies on top of graph retrieval improved the best baseline by 1.1% to 6.4% on a multi-hop reasoning benchmark. That's a real but more modest gain than the headline GraphRAG numbers alone suggest, and a useful reminder that the retrieval technique matters as much as the graph itself.&lt;/p&gt;

&lt;p&gt;Knowledge graphs cost more to build and maintain than the other four approaches. Someone has to model the entities and relationships, and keep the ontology honest as the business changes. That cost is worth paying when the questions genuinely require multi-hop reasoning across connected entities. It's overkill for a question that boils down to "look up this one fact."&lt;/p&gt;

&lt;h3&gt;
  
  
  3. RAG (retrieval-augmented generation)
&lt;/h3&gt;

&lt;p&gt;RAG retrieves the most relevant chunks of text, usually by embedding similarity in a vector database, and hands them to the model as context before it answers. It's the fastest approach to stand up: chunk your documents, embed them, index them, and you have a working system in an afternoon.&lt;/p&gt;

&lt;p&gt;RAG is the right default for &lt;strong&gt;fact lookup across a large, loosely structured document set&lt;/strong&gt;: contracts, support tickets, product docs, meeting notes. It's the wrong tool when the answer requires connecting several facts across different documents (that's the knowledge-graph case above), or when the "fact" is a governed metric that should have one certified answer everywhere (that's the semantic-model case).&lt;/p&gt;

&lt;p&gt;There's also a subtler trap: more retrieved context is not automatically better context. 2025 research from Chroma, testing 18 frontier models including GPT-4.1, Claude Opus 4, and Gemini 2.5, found that accuracy degrades non-uniformly as input length grows. Even a single distractor passage measurably hurt performance relative to a cleaner baseline. Models sometimes did &lt;em&gt;worse&lt;/em&gt; on logically well-structured long context than on the same information shuffled. The finding has been corroborated widely enough that it's a fair rule of thumb: precision in what you retrieve beats volume, every time.&lt;/p&gt;

&lt;p&gt;Some teams get real gains combining approaches: retrieving with a vector index, then using graph relationships to check or expand the answer. AWS's 2024 case study with Lettria reported up to 35% improvement in answer precision when graph-based retrieval was layered on top of vector RAG, evaluated across finance, healthcare, aeronautics, and legal use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Plain markdown + grep
&lt;/h3&gt;

&lt;p&gt;The least glamorous option, and the one no infrastructure vendor will ever recommend to you, because none of them sell it: put your data in plain markdown files, organized sensibly, and let the agent search them with grep or another full-text tool. No embeddings, no vector database, no graph to maintain.&lt;/p&gt;

&lt;p&gt;This works better than it sounds for a &lt;strong&gt;small, well-organized internal corpus&lt;/strong&gt;: think hundreds of files, not millions. Coding agents already do this constantly. A well-structured repository of markdown docs, read directly by an agent with a file-search tool, is often faster to build and easier to reason about than standing up retrieval infrastructure for a corpus that would fit on a laptop. It's the same instinct behind emerging patterns like &lt;code&gt;llms.txt&lt;/code&gt; and skill-file conventions: plain, greppable text, organized by a human who knows the content, beats a half-tuned vector index over the same material.&lt;/p&gt;

&lt;p&gt;There's a maintenance upside here that's easy to undervalue. Markdown files live in version control like everything else you write. Every change is a diff a human can read, review, and revert, with no embedding pipeline to rerun, no index to rebuild, no vector database to keep in sync with the source of truth.&lt;/p&gt;

&lt;p&gt;The approach breaks down exactly where you'd expect: once the corpus gets large enough, or the phrasing gap between a query and the right document gets wide enough, that keyword matching starts missing things a semantic or graph-based search would catch. That's the signal to graduate to RAG or a knowledge graph, not a reason to skip markdown plus grep as a legitimate starting point.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Open knowledge formats
&lt;/h3&gt;

&lt;p&gt;Open knowledge formats, such as schema.org, JSON-LD (JSON for Linking Data), and RDF (Resource Description Framework), structure data using a shared, public vocabulary instead of a format only your own systems understand. Where the first four approaches structure data for &lt;em&gt;your&lt;/em&gt; agents to read, open formats matter when the data needs to be readable by &lt;strong&gt;agents you don't control&lt;/strong&gt;: a customer's AI assistant checking your product's pricing, a search engine's AI Overview summarizing your documentation, or a partner's agent pulling structured facts from your public site.&lt;/p&gt;

&lt;p&gt;This is a different job from the other four, and it's easy to conflate them. A semantic model, knowledge graph, or RAG index is &lt;em&gt;internal&lt;/em&gt; infrastructure serving your own agents. Open formats are a &lt;em&gt;publishing&lt;/em&gt; choice, closer to how you already mark up a webpage for search engines, except the audience reading that markup increasingly includes an AI agent instead of only a crawler. If your data only needs to serve your own team's agents, this is the one approach on the list you can reasonably skip.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five approaches at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Setup cost&lt;/th&gt;
&lt;th&gt;Maintenance&lt;/th&gt;
&lt;th&gt;Sharpest weakness&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Semantic model&lt;/td&gt;
&lt;td&gt;Governed business metrics, repeated questions&lt;/td&gt;
&lt;td&gt;Medium: model the metrics once&lt;/td&gt;
&lt;td&gt;Medium: update as metrics evolve&lt;/td&gt;
&lt;td&gt;Doesn't help with unstructured documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ontology / knowledge graph&lt;/td&gt;
&lt;td&gt;Multi-hop reasoning across connected entities&lt;/td&gt;
&lt;td&gt;High: model entities and relationships&lt;/td&gt;
&lt;td&gt;High: keep the ontology honest&lt;/td&gt;
&lt;td&gt;Expensive for simple lookup questions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG (vector search)&lt;/td&gt;
&lt;td&gt;Fact lookup across a large, loosely structured corpus&lt;/td&gt;
&lt;td&gt;Low: chunk, embed, index&lt;/td&gt;
&lt;td&gt;Low to medium: re-index as content changes&lt;/td&gt;
&lt;td&gt;More context isn't automatically more accurate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plain markdown + grep&lt;/td&gt;
&lt;td&gt;Small, well-organized internal corpus&lt;/td&gt;
&lt;td&gt;Very low: organize files sensibly&lt;/td&gt;
&lt;td&gt;Low: no infrastructure to run&lt;/td&gt;
&lt;td&gt;Breaks down as the corpus grows or gets ambiguous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open formats (schema.org, JSON-LD)&lt;/td&gt;
&lt;td&gt;Data read by agents you don't control&lt;/td&gt;
&lt;td&gt;Low to medium: markup your public content&lt;/td&gt;
&lt;td&gt;Low: mostly set-and-forget&lt;/td&gt;
&lt;td&gt;Doesn't structure data for your own internal agents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Which one should you use?
&lt;/h2&gt;

&lt;p&gt;Match the structure to the question, not the vendor pitch. In practice, that means asking what kind of question the agent needs to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"What's our [metric]?"&lt;/strong&gt; a recurring, governed business number. Use a &lt;strong&gt;semantic model&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"How does X connect to Y, and what does that chain imply?"&lt;/strong&gt; multi-hop reasoning across entities. Use an &lt;strong&gt;ontology or knowledge graph&lt;/strong&gt;, optionally with GraphRAG-style retrieval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"What does this document say about...?"&lt;/strong&gt; fact lookup across a large corpus you didn't write by hand. Use &lt;strong&gt;RAG&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"What's our process for...?"&lt;/strong&gt; a corpus small enough that you know roughly where the answer lives. &lt;strong&gt;Plain markdown plus grep&lt;/strong&gt; is often faster to build and equally reliable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Can an agent I don't control read this?"&lt;/strong&gt; a partner's, customer's, or a search engine's AI. Use &lt;strong&gt;open formats&lt;/strong&gt;.
Most production systems combine two or three of these rather than picking exactly one: a semantic model for metrics, RAG for contracts and support tickets, and grep-searchable internal docs for team runbooks, all read by the same agent. The mistake isn't picking one approach. It's assuming one approach has to cover every question.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How this plays out in practice
&lt;/h2&gt;

&lt;p&gt;Take a Revenue Operations team building one agent to help with renewals. In a single conversation, that agent might field five different kinds of questions, and each one wants a different structure behind it.&lt;/p&gt;

&lt;p&gt;"What's this account's net revenue retention?" is a governed metric with one correct calculation. The agent should query a &lt;strong&gt;semantic model&lt;/strong&gt;, not write its own SQL against raw subscription tables and hope it matches finance's number.&lt;/p&gt;

&lt;p&gt;"Who at Acme Corp reports to whom, and which of them also sits on the renewal decision?" is a multi-hop question across people, roles, and accounts. That's a &lt;strong&gt;knowledge graph&lt;/strong&gt; question. A flat table or a text search won't trace the reporting chain.&lt;/p&gt;

&lt;p&gt;"What did the contract say about the renewal notice period?" is one fact, buried in one document, out of thousands of contracts. &lt;strong&gt;RAG&lt;/strong&gt; retrieves the relevant clause without anyone having to read every file.&lt;/p&gt;

&lt;p&gt;"What's our internal playbook for a renewal at risk?" points to a few dozen well-organized runbook documents the team wrote and knows by heart. &lt;strong&gt;Plain markdown plus grep&lt;/strong&gt; finds the right one in milliseconds, with zero infrastructure to maintain.&lt;/p&gt;

&lt;p&gt;"Does our public pricing page make sense to the customer's own AI assistant?" is an agent-you-don't-control question. That's the &lt;strong&gt;open-format&lt;/strong&gt; case.&lt;/p&gt;

&lt;p&gt;No single approach on this list answers all five. That's the real argument for treating "how do I structure my data for AI agents" as a portfolio decision, not a one-time architecture choice.&lt;/p&gt;

&lt;p&gt;The migration path tends to run in one direction. Teams start with markdown plus grep because it's the fastest thing that works. They move pieces of it to RAG once the corpus outgrows keyword search. They add a knowledge graph only once they hit a specific class of question, usually a multi-hop one, that RAG keeps getting wrong. Few teams start with a knowledge graph on day one, and that's a reasonable default: build the structure your current questions require, and add more only when a real question exposes the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context engineering vs. prompt engineering
&lt;/h2&gt;

&lt;p&gt;Everything above is an exercise in what's now being called &lt;strong&gt;context engineering&lt;/strong&gt;: deciding what information reaches the model's context window, in what form, and how much of it. That's distinct from &lt;em&gt;prompt&lt;/em&gt; engineering, which is how you phrase the instructions in a single message. The distinction matters because a perfectly worded prompt can't fix a model that was handed the wrong facts, or too many of them.&lt;/p&gt;

&lt;p&gt;However you structure your data (semantic model, knowledge graph, RAG, or a markdown file) the same discipline applies. Give the agent exactly the facts it needs to answer the question, not everything you have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Five real approaches, five different jobs. A semantic model for governed metrics. A knowledge graph for multi-hop reasoning. RAG for fact lookup across a big corpus. Plain markdown and grep for a small one. Open formats for the agents you don't control. The vendors selling each piece will tell you theirs is the answer. It usually isn't, not on its own. Start from the question your agent needs to answer, and the right structure follows from that, not from whichever infrastructure happens to be easiest to sell you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://www.revos.ai/blog/structuring-data-for-ai-agents?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=structuring-data-for-ai-agents" rel="noopener noreferrer"&gt;RevOS blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>dataengineering</category>
      <category>devops</category>
    </item>
    <item>
      <title>AI Trends 2026: Self-Service BI Is Becoming Agentic</title>
      <dc:creator>RevOS</dc:creator>
      <pubDate>Thu, 08 Oct 2026 11:16:44 +0000</pubDate>
      <link>https://dev.to/revos/ai-trends-2026-self-service-bi-is-becoming-agentic-2ngf</link>
      <guid>https://dev.to/revos/ai-trends-2026-self-service-bi-is-becoming-agentic-2ngf</guid>
      <description>&lt;p&gt;The way people get answers out of company data is changing faster than the data stacks underneath them. For twenty years the answer to "why did that number move?" was a dashboard someone built in advance. In 2026, increasingly, the answer is an agent that goes and finds out.&lt;/p&gt;

&lt;p&gt;Among the AI trends 2026 has surfaced, that is the one worth paying attention to. Not "companies are using more AI" (they are) but something more specific: &lt;strong&gt;self-service business intelligence is becoming agentic&lt;/strong&gt;, and the constraint on whether it works has moved from the model to the data foundation underneath it.&lt;/p&gt;

&lt;p&gt;The adoption numbers are already there. According to Google Cloud's ROI of AI Report, 52% of executives report their organizations are deploying AI agents in production, and 88% of agentic AI early adopters are already seeing positive ROI. What those numbers hide is how much of the work is data architecture rather than prompting. To build a trustworthy modern data strategy for the age of AI, you have to change how machines get meaning out of your warehouse, not just how they get access to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four generations of self-service analytics
&lt;/h2&gt;

&lt;p&gt;It helps to see where agentic analytics sits in a longer arc. Self-service BI has been reinvented roughly every decade, and each generation moved the work around rather than eliminating it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;Who does the thinking&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Dashboards&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pre-built reports&lt;/td&gt;
&lt;td&gt;Humans anticipate the question and build the answer in advance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Self-service BI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filters, dimensions, drag-and-drop&lt;/td&gt;
&lt;td&gt;Business users slice pre-modelled data themselves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Natural-language analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A chat box over the warehouse&lt;/td&gt;
&lt;td&gt;An LLM turns a sentence into SQL; the user hopes it is right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Agentic analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An agent with tools and governed context&lt;/td&gt;
&lt;td&gt;The agent investigates, validates, and follows up on its own&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The fourth generation is not a nicer chat box. The difference is that an agent doesn't just answer the question you asked, it runs the next three queries a good analyst would have run, checks its own result, and tells you what it found.&lt;/p&gt;

&lt;p&gt;The infrastructure for that is already being built at scale. According to customer usage data compiled by Databricks, multi-agent workflows have grown by 327% year over year, and supervisor agents coordinating networks of specialized subagents now account for 37% of all agent usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next generation of self-service BI isn't another dashboard
&lt;/h2&gt;

&lt;p&gt;The promise of self-service BI was always straightforward: let business users answer their own questions without waiting on the data team.&lt;/p&gt;

&lt;p&gt;The interface kept getting easier. The underlying limitation never moved. Someone still had to anticipate the question, model the data, build the dashboard, define the metrics, and teach the user where to look. "Self-service" in practice meant "self-service, within the boundaries of what a data engineer already imagined you'd ask."&lt;/p&gt;

&lt;p&gt;Agents change that equation. Instead of navigating dashboards, a sales leader can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why did expansion ARR drop in DACH this quarter? Which accounts caused it? What changed in their product usage in the months before the contraction?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No dashboard answers that question, because it isn't one question, it's an investigation. An agent can run that investigation dynamically: pull the metric, decompose it by account, join in product usage, look at the period before the drop, and come back with a narrative.&lt;/p&gt;

&lt;p&gt;But only if it understands what "expansion ARR," "DACH," "account," and "product usage" mean inside &lt;em&gt;your&lt;/em&gt; business. That is the whole problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why raw text-to-SQL breaks agentic analytics
&lt;/h2&gt;

&lt;p&gt;When teams build their first internal analytics agent, the instinct is to connect it straight to the warehouse: hand the model database credentials, write a prompt, and let it generate SQL.&lt;/p&gt;

&lt;p&gt;This is where most projects stall. Direct text-to-SQL has three systemic weaknesses:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Schema complexity.&lt;/strong&gt; A typical enterprise warehouse has hundreds of tables, column names like &lt;code&gt;usr_act_v2&lt;/code&gt;, and three fields that all look like they might be revenue. A model guessing at what those mean will guess wrong often enough to matter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No metric governance.&lt;/strong&gt; If three agents query raw tables for "Monthly Recurring Revenue," you get three SQL statements and three different numbers, with no way to tell which one leadership should act on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No safety boundary.&lt;/strong&gt; Raw SQL access exposes every table the credential can reach, including the ones nobody intended an agent to see.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Databricks' customer data points the same direction: a lack of structural control is the single biggest bottleneck to shipping AI. Teams that implement governance and security tooling ship 12x more production deployments, and standardized evaluation tooling yields 6x more.&lt;/p&gt;

&lt;p&gt;The failure mode isn't that the agent can't write SQL. Modern models write excellent SQL. The failure mode is that it doesn't know what your business means.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anthropic reached the same conclusion in production
&lt;/h2&gt;

&lt;p&gt;The strongest evidence for this isn't a vendor benchmark, it's Anthropic publishing its own internal architecture.&lt;/p&gt;

&lt;p&gt;In &lt;em&gt;How Anthropic enables self-service data analytics with Claude&lt;/em&gt; (June 3, 2026), Anthropic's data team reports that &lt;strong&gt;95% of business analytics queries are now automated through Claude, at roughly 95% aggregate accuracy&lt;/strong&gt;, and close to 99% in some domains. The headline result is impressive. The explanation is the useful part.&lt;/p&gt;

&lt;p&gt;Anthropic is explicit that this is not a model story. Analytics accuracy, in their framing, is a &lt;strong&gt;context and verification problem, not a code-generation problem&lt;/strong&gt;. The same Claude that reaches 95% with the right scaffolding never got above &lt;strong&gt;21%&lt;/strong&gt; on their internal evals without it.&lt;/p&gt;

&lt;p&gt;Their agents don't start by improvising SQL. The stack they describe has four layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data foundations:&lt;/strong&gt; the warehouse itself: models, transformations, tests, and the metadata that describes them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sources of truth:&lt;/strong&gt; a human-curated semantic layer of metric and dimension definitions, plus lineage graphs and business-context knowledge. Notably, they found that auto-generating metric definitions from raw tables and query logs &lt;em&gt;didn't&lt;/em&gt; work: it reproduced the ambiguity instead of removing it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills:&lt;/strong&gt; procedural knowledge in markdown telling the agent which sources to consult, in what order, and what a finished answer looks like. That skill set is synced to multiple surfaces and served as resources over MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; offline evals, ablation testing, and online monitoring with adversarial review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two details matter most for anyone building this. First, the semantic layer is the &lt;strong&gt;required first path&lt;/strong&gt;: when a question maps to a defined metric, the agent calls that definition and gets the same number every other surface in the company produces. Raw table access is the fallback, not the default. Second, the same governed context is exposed &lt;strong&gt;across agent surfaces&lt;/strong&gt;, so the answer doesn't change depending on whether someone asks in Slack, in an IDE, or in a chat window.&lt;/p&gt;

&lt;p&gt;And they are honest about the limits. This architecture reduces failures; it doesn't eliminate them. Anthropic keeps adversarial review running precisely because silent failures still happen, and reports that without active maintenance accuracy drifts from 95% back toward 65%.&lt;/p&gt;

&lt;p&gt;Better models help. Better context architecture is what makes self-service analytics trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  A governed semantic layer gives agents shared meaning
&lt;/h2&gt;

&lt;p&gt;A semantic layer is the translation between how data is stored and how the business talks. It maps raw tables to defined business concepts: instead of querying &lt;code&gt;billing_ledgers_final&lt;/code&gt;, the agent queries an entity called &lt;code&gt;Revenue&lt;/code&gt; and asks for &lt;code&gt;MRR&lt;/code&gt; broken down by &lt;code&gt;acquisition_channel&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Combining that with agent access gives agents something raw warehouse credentials cannot: a shared definition of customers, revenue, churn, pipeline, and every other concept they need in order to reason correctly.&lt;/p&gt;

&lt;p&gt;The measurable effect is large. A general-purpose model writing SQL against an unmapped schema fails roughly half the time, Snowflake's internal benchmarks put GPT-4o at about &lt;strong&gt;51% text-to-SQL accuracy&lt;/strong&gt; on raw schemas. Grounding the same model in a governed semantic model lifts accuracy past 90%.&lt;/p&gt;

&lt;p&gt;That is the same conclusion Anthropic reached, arrived at from a different direction: the governed definition is what turns a plausible answer into a correct one.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP is becoming the interface between agents and business data
&lt;/h2&gt;

&lt;p&gt;Dashboards were the interface between people and business data. &lt;strong&gt;MCP is becoming the interface between agents and business data.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Model Context Protocol (MCP), released as an open standard by Anthropic, is the emerging connection layer of the AI ecosystem, the USB-C port for agent tooling. Rather than writing bespoke integration code for every model and every tool, you run a reusable MCP server. The agent connects, discovers what's available (metrics, schemas, reports) and calls it. The same server works for Claude, for IDEs like Cursor, and for custom orchestrators.&lt;/p&gt;

&lt;p&gt;Standardizing that interface pays off quickly. In its 2026 Business Trends Report, Google Cloud describes how pulp manufacturer Suzano cut query times by 95% for 50,000 employees by deploying standardized semantic data interfaces.&lt;/p&gt;

&lt;p&gt;But MCP on its own doesn't make data trustworthy. &lt;strong&gt;It solves connectivity, not meaning.&lt;/strong&gt; An MCP server pointed at raw tables is a faster route to the same wrong answers. The quality of what comes back still depends entirely on the governed context sitting behind it, which is exactly where the interesting engineering is.&lt;/p&gt;

&lt;h2&gt;
  
  
  People and agents working from the same definitions
&lt;/h2&gt;

&lt;p&gt;None of this makes dashboards, analysts, or data teams disappear. It changes the collaboration model.&lt;/p&gt;

&lt;p&gt;People define and govern what the business means, what counts as an account, how expansion ARR is calculated, which source system wins when two disagree. Agents perform the continuous investigation humans don't have time for. Both work from the same underlying definitions, and the semantic layer becomes the contract between them.&lt;/p&gt;

&lt;p&gt;This matters more than it sounds, because of something Anthropic observes directly: once agents become the consumers of the data model, the person asking the question often can't validate the answer themselves. The reader of a dashboard could sanity-check a number against the chart next to it. The reader of an agent's paragraph cannot. Governance stops being a compliance concern and becomes the thing that makes the output usable at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a modern data stack to an agent-ready data foundation
&lt;/h2&gt;

&lt;p&gt;The usual framing of this problem is vendor sprawl, ingestion here, warehouse there, transformation, semantics, and a custom API on top. That framing misses the point.&lt;/p&gt;

&lt;p&gt;The problem isn't that there are too many vendors. It's that traditional data stacks were designed for &lt;strong&gt;humans consuming dashboards&lt;/strong&gt;, not for &lt;strong&gt;agents consuming context&lt;/strong&gt;. A human reading a report brings their own business knowledge to it. An agent has to be given that knowledge explicitly, in a form it can navigate, which is a requirement almost no stack was built to satisfy.&lt;/p&gt;

&lt;p&gt;An agent-ready data foundation comes together in four moves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Connect&lt;/strong&gt; your data. Managed ingestion from many sources into a warehouse you control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Govern&lt;/strong&gt; what it means. Define metrics, entities, and relationships once, version-controlled like code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serve&lt;/strong&gt; it to agents. Expose the governed model through a secure MCP server, so Claude, your IDE, and your own agents all read the same definitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn&lt;/strong&gt; continuously. Definitions, lineage, and skills evolve with the business instead of drifting away from it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical difference at query time: agents don't guess against raw schemas. They work from the same governed definitions your business already trusts, rather than inventing their own interpretation of the underlying tables, which removes one of the largest sources of analytics hallucination.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://www.revos.ai/blog/ai-trends" rel="noopener noreferrer"&gt;RevOS blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dataengineering</category>
      <category>llm</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Running Hermes Agent on Kubernetes: What Breaks, What Doesn't, and a Production-Safe Setup</title>
      <dc:creator>RevOS</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:07:05 +0000</pubDate>
      <link>https://dev.to/revos/running-hermes-agent-on-kubernetes-what-breaks-what-doesnt-and-a-production-safe-setup-3bbm</link>
      <guid>https://dev.to/revos/running-hermes-agent-on-kubernetes-what-breaks-what-doesnt-and-a-production-safe-setup-3bbm</guid>
      <description>&lt;p&gt;Hermes Agent is Nous Research's self-improving AI agent. It builds skills from experience, keeps persistent memory across sessions, and connects to Telegram, Discord, Slack, WhatsApp, and Signal out of the box. With 230k+ GitHub stars, plenty of teams now want to run it somewhere more durable than a laptop.&lt;/p&gt;

&lt;p&gt;Kubernetes is the obvious destination and the least documented one. There's no official Helm chart. The container image's init sequence needs root in a way that collides with a standard restricted pod security context. Its state model assumes a single writer. And the reload story that works fine in a terminal has no equivalent your GitOps controller can call.&lt;/p&gt;

&lt;p&gt;None of that is a reason to avoid Hermes on Kubernetes. It's a reason to know the constraints before you write the manifest. Below: what genuinely breaks, what only looks like it breaks, and a reference deployment to start from.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tested against:&lt;/strong&gt; Hermes Agent &lt;code&gt;v2026.8.27&lt;/code&gt; · official image &lt;code&gt;nousresearch/hermes-agent&lt;/code&gt; · Kubernetes 1.31+ · containerd 2.x. Hermes ships releases every few days. Before you copy anything below, check it against the version you're actually deploying, and pin that version.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Is there an official Helm chart for Hermes Agent?
&lt;/h2&gt;

&lt;p&gt;No. Nous Research's own documentation covers &lt;code&gt;install.sh&lt;/code&gt;, Docker and Docker Compose, and Nix packages. Kubernetes never comes up as a deployment target. That gap is filled entirely by the community, and the three charts that fill it don't agree on much:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ultraworkers/hermes-agent-helm-chart:&lt;/strong&gt; the most feature-complete option: renders a Deployment, PVC, Secret, Service, Ingress, and an Istio VirtualService, plus an "operator-ready" mode defining a &lt;code&gt;HermesTenant&lt;/code&gt; CRD. It's also the only one that encodes the single-writer rule as a hard constraint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;jyje/hermes-agent:&lt;/strong&gt; listed on Artifact Hub as a verified publisher, distributed over an OCI registry, with multi-arch images and example ArgoCD manifests. It tracks upstream Hermes releases more closely than the other two.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;duyet/hermes-agent:&lt;/strong&gt; the simplest of the three, splitting persistence into separate data and workspace volumes, with an optional Prometheus &lt;code&gt;ServiceMonitor&lt;/code&gt;. Not a verified publisher, so read the templates before trusting the defaults.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of the three is backed by Nous Research. Read the templates end to end before you apply one, and expect to override the security context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hermes Agent is stateful: define your persistence boundary first
&lt;/h2&gt;

&lt;p&gt;This is the decision everything else hangs off, so make it before you pick a chart.&lt;/p&gt;

&lt;p&gt;Hermes keeps &lt;strong&gt;all&lt;/strong&gt; of its mutable state (configuration, &lt;code&gt;MEMORY.md&lt;/code&gt;, &lt;code&gt;USER.md&lt;/code&gt;, session history in a local SQLite database, and every learned skill) under &lt;code&gt;HERMES_HOME&lt;/code&gt;. In the official image that's the &lt;code&gt;/opt/data&lt;/code&gt; volume, which the Docker docs call "the single source of truth for all Hermes state."&lt;/p&gt;

&lt;p&gt;So the accurate invariant is not "Hermes can't scale." It's:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Treat each &lt;code&gt;HERMES_HOME&lt;/code&gt; as a single-writer state domain.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can run many Hermes instances in one cluster. What you must not do is put two active pods behind the same mutable state and assume Kubernetes has handed you horizontal scaling. Nothing arbitrates concurrent writes to that SQLite database and those Markdown files.&lt;/p&gt;

&lt;p&gt;In practice, for any deployment with persistence enabled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;replicaCount&lt;/code&gt; stays at &lt;strong&gt;1&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;strategy.type&lt;/code&gt; must be &lt;strong&gt;&lt;code&gt;Recreate&lt;/code&gt;&lt;/strong&gt;, not &lt;code&gt;RollingUpdate&lt;/code&gt;, a rolling update deliberately runs the old and new pod together, which is exactly the two-writer window to avoid.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ReadWriteOnce&lt;/code&gt; is the sensible guardrail on the PVC. RWX isn't automatically unsafe (the invariant is one &lt;em&gt;active writer&lt;/em&gt;, not one &lt;em&gt;mount&lt;/em&gt;) but RWO enforces it at the storage layer instead of trusting your deployment config.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Need Hermes for more than one team or tenant? One release per tenant, each with its own volume. Any chart that doesn't enforce this is a data-corruption risk waiting for a bad rollout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the official image fights &lt;code&gt;runAsNonRoot&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The common shorthand, "Hermes has to run as root," is wrong, and the precise version matters when you're arguing with a platform team about a Pod Security Standard exemption.&lt;/p&gt;

&lt;p&gt;The official image uses &lt;strong&gt;s6-overlay&lt;/strong&gt; as its init system. s6-overlay's &lt;code&gt;/init&lt;/code&gt; runs as root so it can &lt;code&gt;chown&lt;/code&gt; the volume on first boot, then drops to the &lt;code&gt;hermes&lt;/code&gt; user via &lt;code&gt;s6-setuidgid&lt;/code&gt; for the main program and all supervised services.&lt;/p&gt;

&lt;p&gt;So the agent process itself does &lt;em&gt;not&lt;/em&gt; run as root. Only the bootstrap does. But that's still enough to break a restricted security context: a pod spec with &lt;code&gt;runAsNonRoot: true&lt;/code&gt; or a non-zero &lt;code&gt;runAsUser&lt;/code&gt; blocks the sequence before the agent ever starts, and you get something close to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/package/admin/s6-overlay/libexec/preinit: fatal: /run belongs to uid 0 instead of 1000,
has insecure and/or unworkable permissions, and we're lacking the privileges to fix it.
s6-overlay-suexec: fatal: child failed with exit code 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One detail worth getting right, because published examples routinely get it wrong: &lt;strong&gt;the &lt;code&gt;hermes&lt;/code&gt; user is UID 10000, not 1000.&lt;/strong&gt; Set &lt;code&gt;fsGroup: 1000&lt;/code&gt; and the volume ends up owned by the wrong group.&lt;/p&gt;

&lt;p&gt;A reasonable starting security context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;podSecurityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;runAsUser&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
  &lt;span class="na"&gt;runAsNonRoot&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;fsGroup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10000&lt;/span&gt;
  &lt;span class="na"&gt;fsGroupChangePolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OnRootMismatch&lt;/span&gt;
  &lt;span class="na"&gt;seccompProfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RuntimeDefault&lt;/span&gt;
&lt;span class="na"&gt;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;allowPrivilegeEscalation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;readOnlyRootFilesystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;runAsNonRoot&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;drop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALL"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CHOWN"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SETUID"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SETGID"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is meaningfully narrower than a privileged pod: every capability is dropped and only the ones the bootstrap needs come back. Treat the exact capability list as a &lt;strong&gt;starting point to verify against your image version&lt;/strong&gt;, not a universal recipe. Start from &lt;code&gt;drop: ["ALL"]&lt;/code&gt;, add back only what your logs prove necessary, and re-test on version bumps.&lt;/p&gt;

&lt;p&gt;If your cluster enforces the &lt;code&gt;restricted&lt;/code&gt; Pod Security Standard, this workload needs a namespace exemption. Forcing the official image to start non-root isn't a setting you've missed, it wasn't built for that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hermes can hot-reload, and what it can't
&lt;/h2&gt;

&lt;p&gt;The claim that Hermes has "no hot-reload" is false, and the real limitation is more interesting.&lt;/p&gt;

&lt;p&gt;Hermes documents three reload commands: &lt;code&gt;/reload-mcp&lt;/code&gt; (reload MCP servers from &lt;code&gt;config.yaml&lt;/code&gt;), &lt;code&gt;/reload-skills&lt;/code&gt; (re-scan for newly installed or removed skills), and &lt;code&gt;/reload&lt;/code&gt; (reload &lt;code&gt;.env&lt;/code&gt; variables into the running session).&lt;/p&gt;

&lt;p&gt;The runtime can absolutely pick up new MCP servers and skills without a restart. The gap is the &lt;em&gt;interface&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hermes can hot-reload MCP servers and skills interactively, but doesn't expose the same lifecycle through its admin API.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the actual Kubernetes problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ConfigMap updated -&amp;gt; kubelet syncs file into the pod -&amp;gt; no reconciliation hook -&amp;gt; nothing happens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file changes on disk. Nothing tells the process. Your options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Restart the workload.&lt;/strong&gt; &lt;code&gt;kubectl rollout restart deployment/hermes-agent&lt;/code&gt;. Blunt but declarative, and with &lt;code&gt;Recreate&lt;/code&gt; you're accepting a brief outage anyway. Wire a checksum annotation over the ConfigMap into the pod template so the rollout fires automatically on config change, the standard Helm &lt;code&gt;checksum/config&lt;/code&gt; pattern.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drive the runtime reload path&lt;/strong&gt; from a sidecar or an operator with a channel into the agent. Workable, but you're building the missing hook yourself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Until an HTTP reload endpoint exists upstream, option 1 with a config checksum is the pragmatic default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources, probes, and graceful shutdown
&lt;/h2&gt;

&lt;p&gt;Three things almost every Hermes-on-Kubernetes writeup omits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources.&lt;/strong&gt; Nous Research's Docker documentation recommends a minimum of 1 GB memory and 1 CPU core, with 2-4 GB memory and 2 cores recommended. Browser automation (Playwright/Chromium) is the most memory-hungry feature, so budget above that range if the agent drives a browser. Set a memory &lt;em&gt;limit&lt;/em&gt;, but consider leaving CPU unlimited, agent workloads are bursty, and CPU throttling shows up as mysteriously slow tool calls rather than a clean failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Probes.&lt;/strong&gt; The gateway listens on port &lt;strong&gt;8642&lt;/strong&gt;. The Dockerfile ships &lt;strong&gt;no &lt;code&gt;HEALTHCHECK&lt;/code&gt; and no &lt;code&gt;EXPOSE&lt;/code&gt;&lt;/strong&gt; instruction, so you're defining this yourself. A &lt;code&gt;tcpSocket&lt;/code&gt; probe against 8642 is the portable choice. The one that matters most is the &lt;code&gt;startupProbe&lt;/code&gt;: first boot does volume &lt;code&gt;chown&lt;/code&gt; work and profile reconciliation, and a liveness probe with a short threshold will kill the pod mid-bootstrap and loop forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Graceful shutdown.&lt;/strong&gt; Hermes is stateful, so SIGTERM handling isn't academic. Give it room with &lt;code&gt;terminationGracePeriodSeconds: 30&lt;/code&gt;, and test what actually happens to in-flight agent runs, SQLite session writes, and open gateway connections when a pod is evicted. Node upgrades and spot reclaims will do this to you eventually, and &lt;code&gt;Recreate&lt;/code&gt; means no second pod is covering the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two security boundaries, not one
&lt;/h2&gt;

&lt;p&gt;Most Kubernetes writeups on agents cover pod security and stop. For an agent that executes code, that's half the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary 1, pod security.&lt;/strong&gt; Root init, capabilities, seccomp, filesystem, service account. Covered above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary 2, agent execution.&lt;/strong&gt; What the model can actually run, and what it can reach. This is the one that should worry you more, because the pod &lt;em&gt;is&lt;/em&gt; the blast radius.&lt;/p&gt;

&lt;p&gt;Hermes has real defences here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Credential filtering.&lt;/strong&gt; &lt;code&gt;execute_code&lt;/code&gt; blocks environment variables whose names contain &lt;code&gt;KEY&lt;/code&gt;, &lt;code&gt;TOKEN&lt;/code&gt;, &lt;code&gt;SECRET&lt;/code&gt;, &lt;code&gt;PASSWORD&lt;/code&gt;, &lt;code&gt;CREDENTIAL&lt;/code&gt;, &lt;code&gt;PASSWD&lt;/code&gt;, or &lt;code&gt;AUTH&lt;/code&gt;. MCP stdio subprocesses receive only a short safe list of variables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bypass is explicit.&lt;/strong&gt; Variables declared by a skill or listed in &lt;code&gt;env_passthrough&lt;/code&gt; skip those filters. That's the mechanism to audit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval checks are skipped in container backends.&lt;/strong&gt; Hermes skips dangerous-command approval in the &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;singularity&lt;/code&gt;, &lt;code&gt;modal&lt;/code&gt;, &lt;code&gt;daytona&lt;/code&gt;, and &lt;code&gt;vercel_sandbox&lt;/code&gt; backends, on the reasoning that "the container itself is the security boundary." In a Kubernetes pod that assumption is load-bearing: whatever your pod can reach, prompt-injected code can reach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSRF protection exists, and is disableable.&lt;/strong&gt; Web tools block RFC 1918 ranges and loopback by default. In a cluster, RFC 1918 &lt;em&gt;is&lt;/em&gt; your service mesh, your databases, and the kubelet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which leads to the control most often missing: &lt;strong&gt;default-deny egress.&lt;/strong&gt; An agent that browses the web and calls tools is not a normal web app, and "what can this pod reach?" is a more consequential question than which Linux capabilities it holds. Start from deny-all and allow only what's needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent-egress&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent&lt;/span&gt;
  &lt;span class="na"&gt;policyTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Egress"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;egress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# DNS&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;namespaceSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;kubernetes.io/metadata.name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kube-system&lt;/span&gt;
          &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;k8s-app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kube-dns&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;UDP&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;53&lt;/span&gt;
    &lt;span class="c1"&gt;# HTTPS to the internet, minus internal ranges&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;ipBlock&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;cidr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0/0&lt;/span&gt;
            &lt;span class="na"&gt;except&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;10.0.0.0/8&lt;/span&gt;
              &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;172.16.0.0/12&lt;/span&gt;
              &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;192.168.0.0/16&lt;/span&gt;
              &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;169.254.169.254/32&lt;/span&gt;   &lt;span class="c1"&gt;# cloud instance metadata&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Blocking &lt;code&gt;169.254.169.254&lt;/code&gt; matters especially: on a node without IMDSv2 enforced, an agent that can reach instance metadata can often reach the node's IAM role.&lt;/p&gt;

&lt;p&gt;On credentials: because the agent has terminal access, anything in its environment is potentially readable by it. On EKS, use IRSA or EKS Pod Identity rather than static access keys in a Secret. Elsewhere, External Secrets Operator, Vault, or Sealed Secrets all keep plaintext keys out of Git. And scope the IAM role tightly: the agent's permissions are the agent's capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimal deployment that actually works
&lt;/h2&gt;

&lt;p&gt;Pinned, single-writer, probed, and resource-bounded. Adjust the storage class and image tag, and read it before you apply it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PersistentVolumeClaim&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent-data&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;accessModes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ReadWriteOnce"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;20Gi&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Recreate&lt;/span&gt;          &lt;span class="c1"&gt;# never two writers on one HERMES_HOME&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent&lt;/span&gt;
      &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;checksum/config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;REPLACE_WITH_CONFIGMAP_CHECKSUM"&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;serviceAccountName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent&lt;/span&gt;
      &lt;span class="na"&gt;terminationGracePeriodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
      &lt;span class="na"&gt;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;runAsUser&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
        &lt;span class="na"&gt;runAsNonRoot&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="na"&gt;fsGroup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10000&lt;/span&gt;
        &lt;span class="na"&gt;fsGroupChangePolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OnRootMismatch&lt;/span&gt;
        &lt;span class="na"&gt;seccompProfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RuntimeDefault&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nousresearch/hermes-agent:v2026.8.27&lt;/span&gt;   &lt;span class="c1"&gt;# pin it; never :latest&lt;/span&gt;
          &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gateway"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway&lt;/span&gt;
              &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8642&lt;/span&gt;
          &lt;span class="na"&gt;envFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;secretRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent-secrets&lt;/span&gt;
          &lt;span class="na"&gt;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;allowPrivilegeEscalation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
            &lt;span class="na"&gt;readOnlyRootFilesystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
            &lt;span class="na"&gt;runAsNonRoot&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
            &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;drop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALL"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
              &lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CHOWN"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SETUID"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SETGID"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500m"&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2Gi&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4Gi&lt;/span&gt;
          &lt;span class="na"&gt;startupProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;tcpSocket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway&lt;/span&gt;
            &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
            &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
          &lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;tcpSocket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway&lt;/span&gt;
            &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
          &lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;tcpSocket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway&lt;/span&gt;
            &lt;span class="na"&gt;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
            &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
          &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data&lt;/span&gt;
      &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data&lt;/span&gt;
          &lt;span class="na"&gt;persistentVolumeClaim&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;claimName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent-data&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hermes-agent&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8642&lt;/span&gt;
      &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pair it with the NetworkPolicy above, a Secret (ideally rendered by External Secrets or Sealed Secrets rather than committed), and a ConfigMap for &lt;code&gt;config.yaml&lt;/code&gt; if you're managing MCP servers declaratively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Image tag pinned to a specific release, never &lt;code&gt;:latest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;replicas: 1&lt;/code&gt; and &lt;code&gt;strategy.type: Recreate&lt;/code&gt;, with one &lt;code&gt;HERMES_HOME&lt;/code&gt; per instance&lt;/li&gt;
&lt;li&gt;PVC is &lt;code&gt;ReadWriteOnce&lt;/code&gt;, and the storage class supports that access mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fsGroup: 10000&lt;/code&gt; matches the image's &lt;code&gt;hermes&lt;/code&gt; user&lt;/li&gt;
&lt;li&gt;Capabilities start from &lt;code&gt;drop: ["ALL"]&lt;/code&gt;, with additions verified against your image version&lt;/li&gt;
&lt;li&gt;Namespace exemption in place if you enforce the &lt;code&gt;restricted&lt;/code&gt; Pod Security Standard&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;startupProbe&lt;/code&gt; generous enough to survive first-boot volume work&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;terminationGracePeriodSeconds&lt;/code&gt; set, and eviction behaviour tested against in-flight runs&lt;/li&gt;
&lt;li&gt;Memory limit sized for browser automation if skills use it&lt;/li&gt;
&lt;li&gt;Default-deny egress NetworkPolicy, with instance metadata (&lt;code&gt;169.254.169.254&lt;/code&gt;) blocked&lt;/li&gt;
&lt;li&gt;No static cloud credentials in Secrets, use IRSA / Pod Identity / Vault / External Secrets&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;env_passthrough&lt;/code&gt; and skill-declared variables audited, they bypass credential filtering&lt;/li&gt;
&lt;li&gt;Config changes trigger a rollout (checksum annotation) or a deliberate reload path&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where this connects to governed data
&lt;/h2&gt;

&lt;p&gt;Everything above keeps Hermes Agent alive and contained. None of it says whether the answers it produces are correct, that depends on what it's allowed to read and how well-defined that data is. The same discipline that makes an agent's infrastructure trustworthy (scoped permissions, no unmanaged state, changes that go through review) reappears in agentic data engineering, where an agent's output earns trust through layered checks rather than raw model capability. Point an agent like this at real business data instead of chat platforms and a semantic layer is what stops it guessing at what "revenue" or "active customer" means.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://www.revos.ai/blog/hermes-agent-kubernetes" rel="noopener noreferrer"&gt;RevOS blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>ai</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
