<?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: Ben Yemini</title>
    <description>The latest articles on DEV Community by Ben Yemini (@byemini13).</description>
    <link>https://dev.to/byemini13</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%2F3427886%2Fbfc569e8-b092-4be7-abd9-72bc4ae1d20c.jpeg</url>
      <title>DEV Community: Ben Yemini</title>
      <link>https://dev.to/byemini13</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/byemini13"/>
    <language>en</language>
    <item>
      <title>How Open-Inspect and Causely close the loop on autonomous remediation</title>
      <dc:creator>Ben Yemini</dc:creator>
      <pubDate>Thu, 27 Aug 2026 20:36:29 +0000</pubDate>
      <link>https://dev.to/causely/how-open-inspect-and-causely-close-the-loop-on-autonomous-remediation-16jp</link>
      <guid>https://dev.to/causely/how-open-inspect-and-causely-close-the-loop-on-autonomous-remediation-16jp</guid>
      <description>&lt;p&gt;Originally posted to &lt;a href="https://www.causely.ai/" rel="noopener noreferrer"&gt;causely.ai&lt;/a&gt; by &lt;a href="https://www.linkedin.com/in/enlinxu/" rel="noopener noreferrer"&gt;Enlin Xu&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Open-Inspect gives a background agent somewhere to run: a full development environment, triggered by an event, with no human at the keyboard. Causely gives that agent a causal diagnosis instead of a pile of telemetry to interpret. The Cloud &amp;amp; Platform Operations team at Fountain wired both together for proactive production ops, and the pattern is now documented in a runnable example.&lt;/p&gt;

&lt;p&gt;On June 12, 2026, we ran a live session with Cole Murray, creator of Open-Inspect, and Martin Roberts, Cloud &amp;amp; Platform Operations lead at Fountain. The topic was proactive remediation: agents that fix issues before anyone notices, not agents that wait for a page. &lt;a href="https://www.youtube.com/live/L0BXwymeYvk?t=1289&amp;amp;si=0sPQwwzOa-SpY74I&amp;amp;ref=causely-blog.ghost.io" rel="noopener noreferrer"&gt;Watch the recording&lt;/a&gt; for Martin's walkthrough of the production setup. This post provides more detail on the mechanics behind this setup and includes a link to a working example.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does Open-Inspect run?
&lt;/h2&gt;

&lt;p&gt;Open-Inspect is an open-source background coding agent, &lt;a href="https://github.com/ColeMurray/background-agents?ref=causely-blog.ghost.io" rel="noopener noreferrer"&gt;built by Cole Murray&lt;/a&gt; and modeled on Ramp's internal Inspect tool. It gives an agent a full development environment (Node.js, Python, git, browser automation, VS Code) and lets that agent pick up work from a webhook, a cron schedule, a Slack message, or a monitoring alert, then run unattended until the task is done.&lt;/p&gt;

&lt;p&gt;Two important aspects of Open-Inspect are relevant to ops use cases. First, sessions persist: an agent can run for minutes or hours and be re-triggered later on the same thread, which fits an investigation that doesn't resolve in one shot. Second, the security model is single-tenant by design. Every user in a deployment shares the same GitHub App installation and repository access. That works for a trusted internal team where everyone already has access to the same repos. Everyone sharing that deployment shares the same GitHub App access. Organizations with multiple teams that need separate boundaries can run separate deployments, one per team, rather than pooling everyone into one.&lt;/p&gt;

&lt;p&gt;Open-Inspect decides where an agent runs and what it's allowed to touch. It has no opinion on why and when to act. This is the context it needs to receive from another source.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does Causely add to a background agent?
&lt;/h2&gt;

&lt;p&gt;An agent with a working development environment and repository access still must be told what to act on. It's similar to the point we made in our blog about &lt;a href="https://www.causely.ai/blog/is-access-enough-auth-patterns-for-claude-managed-agents?ref=causely-blog.ghost.io" rel="noopener noreferrer"&gt;Claude Managed Agents&lt;/a&gt;: an agent that can reach every system in your environment still isn't one you'd trust to act on a guess.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://docs.causely.ai/agent-integration/mcp-server?ref=causely-blog.ghost.io" rel="noopener noreferrer"&gt;Causely MCP server&lt;/a&gt; gives your agent a specific, mechanistic diagnosis, such as Postgres idle-in-transaction accumulation or Redis cache miss storm, that is distinct from the symptoms it produces. A peer-reviewed study we published showed that agents working from Causely's causal context reached a diagnosis 2-3x faster than agents reasoning over raw telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does Causely make agents faster?
&lt;/h2&gt;

&lt;p&gt;The reason agents leveraging Causely diagnose problems faster is that they never need to rebuild the environment's dependency structure at query time. Not only dependencies between entities in the environment, but also the symptoms that may be observed and the potential causes that could produce those symptoms given the topology at that moment in time. Read the &lt;a href="https://www.causely.ai/blog/your-ai-ops-agent-is-guessing?ref=causely-blog.ghost.io" rel="noopener noreferrer"&gt;full benchmark study&lt;/a&gt; for the methodology here.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does the integration work?
&lt;/h2&gt;

&lt;p&gt;Open-Inspect answers where and how an agent can act. Causely answers when and what it should act on. An agent with both can efficiently move from an issue to a verified fix without a human bridging the gap.&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%2Fpsnta5jz9kj5ytphn78a.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%2Fpsnta5jz9kj5ytphn78a.png" alt="Causely and Open-Inspect data flow" width="680" height="720"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Causely notification triggers the agent to Open PR&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Causely runs continuously over the environment, ingesting telemetry locally and maintaining a semantic understanding of the system. When it identifies an issue, a webhook fires carrying both the issue and the diagnosis. That notification routes to the specific background agent with repo access for that environment. The agent calls &lt;code&gt;get_issue_details&lt;/code&gt; to retrieve the causal context behind it and other Causely MCP tools, like &lt;code&gt;get_logs&lt;/code&gt;, if it needs more evidence. Then it opens a PR.&lt;/p&gt;

&lt;p&gt;The agent never starts from a raw alert. The webhook already carries a diagnosis, not a symptom. &lt;code&gt;get_issue_details&lt;/code&gt; and &lt;code&gt;get_logs&lt;/code&gt; add depth to that diagnosis. They don't build it from scratch. The output is a PR, and a human reviews the fix to verify the change before it ships.&lt;/p&gt;

&lt;p&gt;Fountain runs this exact sequence: webhook, &lt;code&gt;get_issue_details&lt;/code&gt;, &lt;code&gt;get_logs&lt;/code&gt; if needed, PR. An engineer reviews and merges from there. Martin described fixing issues before the traditional alert would have fired, let alone before any end-user escalation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"An agent works right away. It receives the request and, within seconds, identifies the root cause with help from the Causely MCP tool. Within minutes it has the pull request ready. That is much, much faster than how any ops team can function while working on the problem".&lt;br&gt;
— Martin Roberts, Cloud &amp;amp; Platform Operations lead at Fountain&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What to do next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Watch &lt;a href="https://www.youtube.com/live/L0BXwymeYvk?t=216s&amp;amp;ref=causely-blog.ghost.io" rel="noopener noreferrer"&gt;the full webinar&lt;/a&gt; for Martin's production walkthrough and the live Q&amp;amp;A.&lt;/li&gt;
&lt;li&gt;Read &lt;a href="https://github.com/causely-oss/background-agents/tree/main/open-inspect?ref=causely-blog.ghost.io" rel="noopener noreferrer"&gt;the causely-oss example&lt;/a&gt; and adapt the trigger pattern to your own alerts.&lt;/li&gt;
&lt;li&gt;If you're building a custom agent instead, start with &lt;a href="https://www.causely.ai/blog/causely-mcp-skills-stop-prompt-engineering-your-reliability-agent?ref=causely-blog.ghost.io" rel="noopener noreferrer"&gt;Causely MCP Skills&lt;/a&gt; for the tool-selection logic Open-Inspect's example already uses.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between Open-Inspect and Causely?&lt;/strong&gt; Open-Inspect is a background agent execution system: it decides where an agent runs and what it's allowed to touch. Causely is a causal reasoning system: it determines what issues need to be acted on and when. Open-Inspect provides the environment; Causely provides the diagnosis. Neither replaces the other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a background agent remediate an issue without a causal model?&lt;/strong&gt; It can work for specific events and runbooks that you have defined in advance, and it can work for localized, code-level problems. But in environments with many dependencies and complex topology, a background agent seeking to remediate an issue without a causal model is just as likely to make the situation worse as it is to fix the root cause. A causal model ensures the agent acts on the cause of the observed anomalies, rather than on the symptoms themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Open-Inspect safe to deploy across multiple teams?&lt;/strong&gt; Open-Inspect is single-tenant by design: everyone in a deployment shares the same GitHub App installation and repository scope. It's built for a trusted internal team with shared repository access, not for isolating multiple organizations or teams with different permissions within a single deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I trigger a background agent from a production alert?&lt;/strong&gt; Open-Inspect sessions can be triggered by webhooks, so a monitoring alert can start a session directly. The session then queries Causely for a diagnosis before taking any action, rather than starting from the raw alert payload. The causely-oss example documents this trigger pattern end-to-end.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>sre</category>
    </item>
    <item>
      <title>Is access enough? Auth patterns for Claude Managed Agents</title>
      <dc:creator>Ben Yemini</dc:creator>
      <pubDate>Mon, 17 Aug 2026 19:52:38 +0000</pubDate>
      <link>https://dev.to/causely/is-access-enough-auth-patterns-for-claude-managed-agents-1ldg</link>
      <guid>https://dev.to/causely/is-access-enough-auth-patterns-for-claude-managed-agents-1ldg</guid>
      <description>&lt;p&gt;Originally posted to &lt;a href="https://dev.tourl"&gt;causely.ai&lt;/a&gt; by &lt;a href="https://www.linkedin.com/in/byemini/" rel="noopener noreferrer"&gt;Ben Yemini&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL; DR&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Background agents run independently and can be triggered by events, making them a good fit for on-call work. Claude Managed Agents are one example, and MCP tunnels give them access to the environment&amp;nbsp;they're&amp;nbsp;making decisions over, reaching it, and authenticating. But access is just the starting point. An agent that can reach and log into every system still&amp;nbsp;isn't&amp;nbsp;automatically one&amp;nbsp;you'd&amp;nbsp;trust to run&amp;nbsp;on-call.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do background agents fit on-call work?&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Background agents differ from interactive assistants in one&amp;nbsp;key&amp;nbsp;way: they run on their own schedule, triggered by an event&amp;nbsp;(e.g., a page, an alert) rather&amp;nbsp;than by someone typing a prompt.&amp;nbsp;This&amp;nbsp;difference is what makes them&amp;nbsp;an ideal&amp;nbsp;fit for on-call&amp;nbsp;ops&amp;nbsp;work, where nobody&amp;nbsp;has to be&amp;nbsp;sitting at a keyboard when&amp;nbsp;performance degrades.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Background agents persist. They pick up an event, run for as long as the investigation takes, from seconds to hours,&amp;nbsp;and can be triggered again later on the same thread.&amp;nbsp;&lt;a href="https://www.youtube.com/live/L0BXwymeYvk?t=216s" rel="noopener noreferrer"&gt;Cole&amp;nbsp;Murray,&amp;nbsp;the creator of&amp;nbsp;Open-Inspect,&amp;nbsp;walks&amp;nbsp;through this distinction in detail&lt;/a&gt;, and it's worth watching: the architecture decisions that make sense for a chat assistant don't automatically transfer to something that runs unattended.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Claude Managed Agents&amp;nbsp;provide a similar instantiation:&amp;nbsp;their&amp;nbsp;sessions persist&amp;nbsp;in the&amp;nbsp;cloud, execute over time,&amp;nbsp;and can be triggered by automated events.&amp;nbsp; Anthropic's&amp;nbsp;own walkthrough of managed agents&amp;nbsp;covers the mechanics&amp;nbsp;and shows&amp;nbsp;&lt;a href="https://anthropic.ondemand.goldcast.io/on-demand/f8679328-af86-4d55-9f76-1f32dad49918" rel="noopener noreferrer"&gt;how to build an SRE&amp;nbsp;incident response agent&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;For on-call work, this approach is helpful in two ways. For reactive&amp;nbsp;workflows,&amp;nbsp;it ensures that whoever prompts the agent has the same setup and that the agent has the necessary access to assist with the investigation. More&amp;nbsp;importantly,&amp;nbsp;for proactive&amp;nbsp;workflows,&amp;nbsp;the agent can be triggered by events and start and end the investigation before an on-call engineer gets out of bed.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Recently,&amp;nbsp;at Code with Claude in London on May 19, 2026, Anthropic shipped two features that&amp;nbsp;improve&amp;nbsp;the performance of these agents when running them against production systems.&amp;nbsp;Self-hosted sandboxes (public beta) and MCP tunnels (research preview). Together, they let a cloud-run agent reach a private Kubernetes cluster or an internal Prometheus instance without opening an inbound port, closing a gap that had been blocking some on-call use cases on security review&amp;nbsp;alone.&amp;nbsp;These&amp;nbsp;welcomed&amp;nbsp;improvements make this approach much more practical.&amp;nbsp;It also surfaces&amp;nbsp;the next key question: once the agent&amp;nbsp;has&amp;nbsp;access,&amp;nbsp;does it have the context it needs to resolve the problem?&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reaching your infrastructure is (mostly) a solved problem&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;A managed agent runs in&amp;nbsp;Anthropic's&amp;nbsp;cloud; your cluster, your metrics, and your logs run in your environment. The agent never touches them directly. It&amp;nbsp;calls MCP servers that do. Your cluster exposes a Kubernetes MCP&amp;nbsp;server,&amp;nbsp;your metrics stack exposes a Prometheus MCP server, and the agent calls&amp;nbsp;both as&amp;nbsp;tools. It never gets a raw&amp;nbsp;kubeconfig&amp;nbsp;or a database connection string.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;The first wall anyone hits&amp;nbsp;is&amp;nbsp;that a cloud agent&amp;nbsp;can't&amp;nbsp;reach&amp;nbsp;localhost&amp;nbsp;or a private API server. For local development or a&amp;nbsp;&lt;code&gt;kind&lt;/code&gt;&amp;nbsp;cluster, a tunnel like&amp;nbsp;cloudflared's&amp;nbsp;quick-tunnel mode gets you unblocked in minutes. This works for&amp;nbsp;a&amp;nbsp;proof&amp;nbsp;of concept, but&amp;nbsp;not for running production traffic. The production answer is&amp;nbsp;&lt;a href="https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview" rel="noopener noreferrer"&gt;native MCP tunnels&lt;/a&gt;. A lightweight gateway inside your network opens a single outbound connection;&amp;nbsp;there's&amp;nbsp;no inbound port and no public MCP endpoint for a scanner to find. This is a general property of cloud-run agents, not something specific to Claude. Any agent platform running outside your perimeter&amp;nbsp;has to&amp;nbsp;solve the same reachability problem, and outbound-only tunneling is the shape the industry,&amp;nbsp;including&amp;nbsp;&lt;a href="https://aws.amazon.com/blogs/networking-and-content-delivery/network-connectivity-patterns-for-agents-deployed-on-amazon-bedrock-agentcore-runtime/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.cloud.google.com/architecture/multi-agent-private-networking-patterns" rel="noopener noreferrer"&gt;Google&lt;/a&gt;,&amp;nbsp;has converged on this year.&lt;br&gt;
&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you authenticate an agent to systems it can now reach?
&lt;/h2&gt;

&lt;p&gt;&amp;nbsp;&lt;br&gt;
The Managed Agents MCP connector sends one thing to your server: an&amp;nbsp;&lt;code&gt;Authorization: Bearer&lt;/code&gt;&amp;nbsp;header. Credentials live in a vault matched by the MCP server's URL, not configured on the server entry itself. This&amp;nbsp;means the hard part of auth&amp;nbsp;isn't&amp;nbsp;the agent side,&amp;nbsp;it's&amp;nbsp;getting your existing auth&amp;nbsp;approach&amp;nbsp;to&amp;nbsp;work with&amp;nbsp;that&amp;nbsp;model.&amp;nbsp;&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%2F8i6b68ssnyo06xpzb4kd.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%2F8i6b68ssnyo06xpzb4kd.png" alt="Three auth patterns for background-agents" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three cases show up in practice, in&amp;nbsp;roughly escalating&amp;nbsp;difficulty:&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No auth.&lt;/strong&gt;&amp;nbsp;A Kubernetes MCP server behind a tunnel with cluster-level RBAC as the only gate. Fine for a&amp;nbsp;&lt;code&gt;kind&lt;/code&gt;&amp;nbsp;cluster or a low-stakes internal tool; not something to run against a production API server without at least a bearer token in front of it.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static bearer token.&lt;/strong&gt;&amp;nbsp;A Grafana service-account token, stored in a vault and matched to the MCP server's URL. This is the common case for read-only observability queries.&amp;nbsp;Prometheus, Loki, and Grafana all support long-lived service-account tokens, and the vault handles rotation.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OAuth client-credentials → JWT.&lt;/strong&gt;&amp;nbsp;The hard case, since most internal APIs&amp;nbsp;weren't&amp;nbsp;built expecting a bearer-only connector.&amp;nbsp;It sends&amp;nbsp;&lt;code&gt;Authorization: Bearer&lt;/code&gt;&amp;nbsp;and nothing else, so the vault has to complete the OAuth exchange up front and hand back a plain bearer token.&amp;nbsp;Sending the client secret as a separate field instead produces a&amp;nbsp;&lt;code&gt;400 unknown field&lt;/code&gt;&amp;nbsp;error, since the&amp;nbsp;connector's&amp;nbsp;schema only expects the one header.&amp;nbsp;For a straightforward approach to&amp;nbsp;handling&amp;nbsp;this see the repo at the end of this post.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;The generalizable rule holds regardless of which of the three cases&amp;nbsp;you're&amp;nbsp;in: the&amp;nbsp;connector's&amp;nbsp;interface is&amp;nbsp;&lt;code&gt;Authorization: Bearer&lt;/code&gt;. Anything more complex belongs in the vault, not in the agent's configuration.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Once&amp;nbsp;that's&amp;nbsp;wired up&amp;nbsp;and authenticated, the reachability problem is&amp;nbsp;addressed, and the real work can begin.&amp;nbsp;&lt;br&gt;
&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  Access&amp;nbsp;isn't&amp;nbsp;understanding&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;An agent with full read access to Kubernetes, Prometheus, and your log pipeline still reasons&amp;nbsp;poorly about the system it is investigating.&amp;nbsp;Even the richest telemetry does not come with a model of what depends on what, or more specifically, what can cause what.&amp;nbsp;Metric series, multiple alerts firing, log lines, and even traces provide the agent with rich data to investigate and reason with, but the access to this data is not structured in a way that makes it effective.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Give an agent&amp;nbsp;&lt;code&gt;kubectl&lt;/code&gt;, a&amp;nbsp;PromQL&amp;nbsp;endpoint, and a log query tool, and it can retrieve almost&amp;nbsp;anything&amp;nbsp;but retrieval&amp;nbsp;isn't&amp;nbsp;diagnosis.&amp;nbsp;This&amp;nbsp;is&amp;nbsp;not&amp;nbsp;a knock on the underlying telemetry.&amp;nbsp;&lt;a href="https://opentelemetry.io/docs/specs/semconv/" rel="noopener noreferrer"&gt;OpenTelemetry's semantic conventions&lt;/a&gt;&amp;nbsp;exist precisely to make spans, metrics, and logs consistent enough to reason&amp;nbsp;over&amp;nbsp;but consistent data&amp;nbsp;isn't&amp;nbsp;the same as a causal model of the system that produced it.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;We've&amp;nbsp;written before about&amp;nbsp;&lt;a href="https://www.causely.ai/blog/how-causal-reasoning-addresses-the-limitations-of-llms-in-observability" rel="noopener noreferrer"&gt;why LLMs alone hallucinate root causes&lt;/a&gt;&amp;nbsp;for the same underlying reason: pattern-matching over telemetry&amp;nbsp;isn't&amp;nbsp;the same as reasoning over a dependency graph. The distinction between monitoring,&amp;nbsp;knowing something is wrong,&amp;nbsp;and observability,&amp;nbsp;knowing why,&amp;nbsp;makes a related point from a different angle. An agent that can query telemetry has solved the first problem. Solving the second requires encoding dependency and causality structure somewhere: in a semantic layer, a service graph, or an explicit causal model, so the agent has something to reason against, not just something to query.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&amp;nbsp;&lt;br&gt;
&lt;strong&gt;How do I connect a cloud AI agent to infrastructure it&amp;nbsp;can't&amp;nbsp;reach directly?&lt;/strong&gt;&amp;nbsp;Deploy an MCP server for the system you want the agent to reach, then bridge it with an outbound-only tunnel. For local development or a&amp;nbsp;kind&amp;nbsp;cluster, a quick tunnel like&amp;nbsp;cloudflared&amp;nbsp;works in minutes. For production, use native MCP tunnels: a gateway inside your network opens a single outbound connection, so no inbound port or public MCP endpoint is ever exposed.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does giving an agent more system access make it more reliable?&lt;/strong&gt;&amp;nbsp;Not by itself. Raw access to Kubernetes, Prometheus, and logs lets an agent retrieve data, but that doesn't mean it can diagnose. Without an encoded model of service dependencies and event ordering, an agent&amp;nbsp;can't&amp;nbsp;reliably tell a root cause from a downstream symptom. It can query more, not reason better. Access solves reachability; understanding requires a separate structural layer.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's&amp;nbsp;the difference between an agent reaching a system and an agent understanding it?&lt;/strong&gt;&amp;nbsp;Reaching a system means the agent can call an MCP server and retrieve metrics, logs, or cluster state. Understanding means the agent can tell which of those signals is the&amp;nbsp;cause&amp;nbsp;and which are downstream effects,&amp;nbsp;something that requires a dependency graph or causal model, not just a wider set of tools to query.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I authenticate a managed agent to an internal API that uses OAuth?&lt;/strong&gt;&amp;nbsp;Resolve the OAuth client-credentials flow inside your credential vault, not in the agent's configuration. The Managed Agents MCP connector only ever sends an&amp;nbsp;&lt;code&gt;Authorization: Bearer&lt;/code&gt;&amp;nbsp;header matched to the server's URL.&amp;nbsp;It&amp;nbsp;won't&amp;nbsp;perform a token exchange or accept additional OAuth fields, so the vault has to mint the JWT and return a plain bearer token.&amp;nbsp;See the reference repo below for code examples.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do next&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Read the&amp;nbsp;&lt;a href="https://github.com/causely-oss/background-agents/tree/main/claude-managed-agents" rel="noopener noreferrer"&gt;three-auth-pattern, kind-runnable reference repo&lt;/a&gt;&amp;nbsp;to see all three cases running end to end&amp;nbsp;with a Claude managed SRE agent accessing&amp;nbsp;a real cluster. The open question this setup raises&amp;nbsp;is&amp;nbsp;whether adding a causal or semantic layer on top of raw telemetry access measurably changes how well an agent investigates an incident.&amp;nbsp;We're&amp;nbsp;running a reproducible, measured comparison on&amp;nbsp;this&amp;nbsp;next. Stay tuned.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>backgroundagents</category>
      <category>ai</category>
      <category>sre</category>
    </item>
    <item>
      <title>Semantics in Observability: A Precise Vocabulary for System Understanding</title>
      <dc:creator>Ben Yemini</dc:creator>
      <pubDate>Mon, 03 Aug 2026 18:32:30 +0000</pubDate>
      <link>https://dev.to/causely/semantics-in-observability-a-precise-vocabulary-for-system-understanding-2fdp</link>
      <guid>https://dev.to/causely/semantics-in-observability-a-precise-vocabulary-for-system-understanding-2fdp</guid>
      <description>&lt;p&gt;Orignially posted to &lt;a href="https://www.causely.ai/blog/semantics-in-observability" rel="noopener noreferrer"&gt;causely.ai&lt;/a&gt; by &lt;a href="https://www.linkedin.com/in/endresara" rel="noopener noreferrer"&gt;Endre Sara&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The word &lt;strong&gt;context&lt;/strong&gt; is overloaded in observability discourse to the point of losing precision. It is used to refer to shared labels, a topology map, temporal proximity, and propagated trace identifiers. Four distinct things, each useful, none of them sufficient.&lt;/p&gt;

&lt;p&gt;This blog defines a precise, layered model of observability semantics intended for engineers and SREs building or operating complex distributed systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gap in Current Observability Tooling
&lt;/h2&gt;

&lt;p&gt;Most observability tooling today implements a shallow semantics of entity and some form of topology, often referred to as the knowledge graph – typically derived from trace data – with partial reach into behavior through threshold-based alerting and anomaly detection. A knowledge graph is a generic term that does not define the semantics of what it captures. It is typically assumed to be a list of services and their topological relationships, but as we point out later, this is not sufficient to answer questions. It is also a dynamic, ever-changing graph; capturing it only once, or once a week, is not a reliable representation for real-time, continuous, automated operation. Deeper semantics are largely absent from tooling and instead exist as undocumented knowledge held by individual engineers.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;This lack of semantics has predictable operational consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alert fatigue: alerting systems fire on symptoms without the ability to identify the root cause, producing storms where a single fault generates dozens of notifications&lt;/li&gt;
&lt;li&gt;Slow incident response: root cause reasoning and impact analysis happen manually, in real time, under pressure, because the causal and dependency knowledge exists only in human memory&lt;/li&gt;
&lt;li&gt;Blast-radius estimation is guesswork: a lack of knowledge of the impact of failure. There is no systematic way to ask what would happen if a given component failed, which dependent services would be affected, which symptoms would surface, and in what order.&lt;/li&gt;
&lt;li&gt;Causal knowledge is reactive, not preventive: no proactive reasoning about causes. Engineers cannot ask what classes of failure could produce a given set of symptoms, or which components in the current system state are most likely to trigger an incident.&lt;/li&gt;
&lt;li&gt;No counterfactual reasoning: there is no way to assert that a specific condition could cause a specific failure, or conversely that a given failure mode cannot produce a set of observed symptoms. Without formal causal and dependency knowledge, both directions of reasoning – “could this cause that?” and “could that have caused this?” – rely entirely on individual experience&lt;/li&gt;
&lt;li&gt;Knowledge loss: engineers who have internalized the causal and constraint knowledge leave, and the organization reverts to slower, less reliable incident response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data to address these problems is largely available in service meshes, infrastructure APIs, configuration management systems, and telemetry pipelines. The gap is not data. It is the absence of explicit semantic models that make that data legible to AI Agents. The sections below define the models.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Layered Semantic Model for Observability
&lt;/h2&gt;

&lt;p&gt;The following six layers describe the semantic structure required to move from “we see a signal” to “we understand what is happening and why.” Each layer builds on the previous. Tooling that skips layers will exhibit predictable gaps in reasoning capability.&lt;/p&gt;

&lt;p&gt;It is important to note that the semantics model at each layer has two parts, a knowledge base and a dynamic graph. The knowledge base captures the generic knowledge of what may be observed. The knowledge base captures abstract semantic descriptions common across all environments. The dynamic graph instantiates the knowledge base to generate a real-time model of the managed environment at a given point in time. The dynamic graph is the actual observed reality, specific to a given environment at a given point in time, and keeps adapting as the environment changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1: Entity Model
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;entity model&lt;/strong&gt; defines the named objects in the system and the attributes that describe them. An entity is any discrete thing with identity and an observable state.&lt;/p&gt;

&lt;p&gt;The entity knowledge base captures the types of entities that may be discovered, e.g., a service instance, a host, a Kubernetes pod, a database cluster, a message queue, a CDN edge node, an AI Agent, an MCP server with tools or an LLM model and its provider, and the attributes that may be observed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identity&lt;/strong&gt;: UUID with associated attributes like name, namespace, cluster, region, environment, labels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration&lt;/strong&gt;: resource limits, replica count, connection pool size, JVM flags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime state&lt;/strong&gt;: CPU utilization, memory used, request rate, error rate, queue depth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dynamic entity model instantiates the knowledge base with the discovered entities and serves as an inventory of all entities in the environment at a given point in time. For example, the list of services, hosts, pods, databases, message queues, etc., in the environment.&lt;/p&gt;

&lt;p&gt;Without an entity model, telemetry is a stream of dimensioned numbers. With one, it is a description of a system composed of named, typed, queryable objects. This semantics is a prerequisite for all higher-order reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2: Topology Model
&lt;/h2&gt;

&lt;p&gt;The topology model encodes the structural relationships between entities: which services call which databases, which pods run on which nodes, which queues are consumed by which workers, etc.&lt;br&gt;
The topology knowledge base captures the relationship that may exist between types of entities, For exaple, a service may be connected to another service, a service may be accessing a database, a service may be layered over a pod.&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%2Fbqg1m1fp48nwfsd0rkxi.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%2Fbqg1m1fp48nwfsd0rkxi.png" alt="Relationship Types" width="799" height="420"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Relationship Types&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The dynamic topology graph represents the actual discovered relationships between discovered entities. For example, the Coordinator Agent is connected to the Research, Coding, and Ops subagents; the GitHub MCP server, which includes the create pull request tool; and the GPT-4o model, which is layered over the OpenAI model provider (see Figure 1).&lt;/p&gt;

&lt;p&gt;It is important to note that the knowledge base captures design-time assertions, not runtime observations. This distinction is critical. A service dependency map derived from trace data reflects what happened during the observation window. The dynamic topology graph reflects what is. Traces may be incomplete (non-instrumented paths, async operations, batch jobs). The dynamic topology graph enables blast-radius analysis; given that entity foo is degraded, which other entities are structurally dependent on it and therefore at risk.&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%2Fma08trorwzgly5zibucj.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%2Fma08trorwzgly5zibucj.png" alt="Figure 1: Topology — structural relationships between agents, MCP servers, and Model Providers." width="800" height="546"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: Topology — structural relationships between agents, MCP servers, and Model Providers.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 3: Behavior Model
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;behavior model&lt;/strong&gt; captures the observable signals of normal and abnormal system behavior. It defines &lt;strong&gt;symptoms&lt;/strong&gt; – semantically meaningful deviations from expected state  – and &lt;strong&gt;events&lt;/strong&gt; – discrete state transitions that represent changes in entity health or configuration.&lt;/p&gt;

&lt;p&gt;A raw metric is not a symptom. The number 95.3 on a CPU utilization gauge is not meaningful without knowing the entity it describes, the threshold at which that utilization constitutes an anomaly, and the operational context in which that threshold applies. A symptom is the semantic interpretation: &lt;em&gt;this entity is exhibiting CPU saturation relative to its configured capacity and expected workload.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The behavior model is what converts monitoring data into an actionable signal. Alerting systems that operate directly on raw metrics without a behavior model produce high false-positive rates because they lack the semantic layer needed to distinguish signal from noise.&lt;/p&gt;

&lt;p&gt;The behavior knowledge base captures the possible observable anomalies an entity may experience. For example, a service may be degraded, experiencing high latency, or a node may be highly utilized, experiencing high CPU utilization.&lt;/p&gt;

&lt;p&gt;The dynamic behavior model represents the environment's actual runtime state based on what is being observed. For example, the Research subagent is degraded and experiencing high latency, or the Postgres MCP is congested and experiencing high query times.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 4: Causality Model
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;causality model&lt;/strong&gt; captures the cause-and-effect relationship between potential causes and the symptoms or events they may cause.&lt;br&gt;
The causal knowledge base describes the potential causes, the symptoms they may cause, and how they may propagate. Propagation captures how a cause occurring on one entity may propagate to another related entity. &amp;nbsp;&lt;/p&gt;

&lt;p&gt;The causal knowledge base captures generic knowledge about the types of causes that may occur in an environment and how they will manifest, i.e., the symptoms that may be observed when they occur.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An MCP service may be congested and when it is congested it may cause its tool calls to be slow, manifested as a high tool-call latency symptom, and may propagate and cause degradation of subagents that depend on it.&lt;/li&gt;
&lt;li&gt;A subagent may be degraded and when it is degraded it may cause its responses to be slow, manifested as a slow response time symptom, and may propagate and cause degradation of the coordinator agent that orchestrates it.&lt;/li&gt;
&lt;li&gt;A model provider may be degraded and when it is degraded it may cause its inference requests to be slow, manifested as high inference latency, and may propagate to subagents using its models causing them to be degraded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As the above examples illustrate, the causal knowledge base is completely independent of a given environment. It is independent of how many providers, MCP services, and/or subagents are in the environment, and which models run on which providers, which subagents access which MCPs, or which coordinator orchestrates which subagents.&lt;/p&gt;

&lt;p&gt;The dynamic causal graph represents the actual runtime causality in the environment at a given point in time. It is a function of the dynamic topology graph and represents all potential specific causes that may occur in the environment, along with the specific symptoms they may cause. The figure below illustrates a concrete example: the Postgres MCP may be congested, and the fault may propagate through the execute_sql tool call to the Coding and Ops subagents, and then onward to the Coordinator, with symptom probability decreasing at each hop. Similarly, Anthropic provider degradation may propagate through Claude inference to the Research, Coding, and Ops subagents, and then to the Coordinator.&lt;/p&gt;

&lt;p&gt;In this example, the dynamic causal graph captures that a congested Postgres MCP may cause degradation of the Coding and Ops subagents and the Coordinator. It is important to note that the keyword semantically is “may”. A congested Postgres MCP may degrade downstream entities, but that doesn’t necessarily mean the Postgres MCP is congested – Anthropic provider degradation could produce overlapping symptoms. To conclude, the cause of an observed symptom requires analyzing the state of all potential symptoms.&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%2Fecwu3z8sxui6krk4flkx.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%2Fecwu3z8sxui6krk4flkx.png" alt="Causal graph derived from the agentic topology in Figure 1. Two example fault paths (Postgres MCP congestion, Anthropic provider degradation) propagating through MCP services and subagents into the coordinator." width="799" height="247"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: Causal graph derived from the agentic topology in Figure 1. Two example fault paths (Postgres MCP congestion, Anthropic provider degradation) propagating through MCP services and subagents into the coordinator.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Cause (left) propagates rightward through topology edges. Probabilities indicate the likelihood of each symptom given the cause. Multiple symptoms may share a cause; diagnosis evaluates the full set of observed symptoms against this graph.&lt;/p&gt;

&lt;p&gt;The causality model is what makes root cause analysis tractable. Without it, a single infrastructure fault that produces symptoms across dozens of dependent services generates an alert storm with no structural differentiation between cause and effect. With it, symptoms can be suppressed or annotated as consequences once their cause is pinpointed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 5: Attributes Dependency Model
&lt;/h2&gt;

&lt;p&gt;Where the causality model operates at the symptom level, the &lt;strong&gt;attributes dependency model&lt;/strong&gt; operates at the attribute level. As its name suggests, it captures attribute dependencies. The dependent attributes can be of the same entity or of different entities. Dependency knowledge captures that attributes are correlated, along with the directionality and function of the correlation. The function can be defined in the model or learned.&lt;/p&gt;

&lt;p&gt;The attribute knowledge base captures the generic knowledge of which attribute depends on which. Examples of such dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subagent response latency is a function of the tool-call duration of the MCP services it invokes&lt;/li&gt;
&lt;li&gt;Coordinator response latency is a function of the response latencies of the subagents it orchestrates&lt;/li&gt;
&lt;li&gt;Subagent inference latency is a function of the inference latency of the model provider serving its model&lt;/li&gt;
&lt;li&gt;A subagent's token throughput is a function of the rate at which the coordinator dispatches requests to it.&lt;/li&gt;
&lt;li&gt;The end-to-end coordinator latency is a function of both per-call latencies and the number of subagent calls per task. A non-linear relationship, since a coordinator may fan out to multiple subagents in parallel, retry on failure, or recurse on intermediate results.&lt;/li&gt;
&lt;li&gt;Total tokens consumed by a subagent are a function of both the per-call token cost and the number of model-provider inference calls, which scales non-linearly with conversation depth, tool-call retries, and self-reflection loops.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dynamic attribute dependency graph represents the actual run-time dependencies in the environment at a given point in time. It is a function of the dynamic topology model. Given the above static model examples, the dynamic model examples would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the Coding subagent is accessing the Postgres MCP, Coding subagent latency is a function of execute_sql tool-call duration&lt;/li&gt;
&lt;li&gt;If the Coordinator is orchestrating the Coding subagent, Coordinator latency is a function of Coding subagent latency. Note that based on this, Coordinator latency can be computed as a function of execute_sql tool-call duration, even though the Coordinator does not directly access the Postgres MCP.&lt;/li&gt;
&lt;li&gt;If the Research subagent is using Claude served by Anthropic, the Research subagent's inference latency is a function of Anthropic's Claude inference latency.&lt;/li&gt;
&lt;li&gt;For the Ops subagent, its token throughput is a function of the rate of requests the Coordinator dispatches to it.&lt;/li&gt;
&lt;li&gt;If the Coordinator fans out a single user task to the Research, Coding, and Ops subagents in parallel, total Coordinator latency is approximately the max of the three subagent latencies, but if any subagent retries on tool-call failure, that subagent's effective latency multiplies by its retry count, so end-to-end latency grows non-linearly with failure rate.&lt;/li&gt;
&lt;li&gt;If the Coding subagent calls the Postgres MCP once per row in a result set, Coding subagent latency is a function of execute_sql duration multiplied by row count, so a query returning N rows produces N tool calls, and end-to-end latency scales with N rather than staying constant.&lt;/li&gt;
&lt;li&gt;If the Research subagent invokes Claude in a multi-turn reasoning loop with branching factor B and depth D, total Anthropic inference calls scale as B^D – so doubling reasoning depth roughly squares the inference cost, even though the Research subagent's per-task topology entry is unchanged.&lt;/li&gt;
&lt;/ul&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%2Fhv332lnulrh3haibzh4m.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%2Fhv332lnulrh3haibzh4m.png" alt="Non-linear call-count amplification. Three runtime patterns where total cost diverges from the static topology in Figure 1. (A) Parallel fan-out with retries multiplies the worst-case branch latency. (B) Per-row tool-call loops produce linear-in-N call counts that the topology graph cannot bound. (C) Recursive reasoning produces B^D inference calls, exponential in depth." width="800" height="350"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 3: Non-linear call-count amplification. Three runtime patterns where total cost diverges from the static topology in Figure 1. (A) Parallel fan-out with retries multiplies the worst-case branch latency. (B) Per-row tool-call loops produce linear-in-N call counts that the topology graph cannot bound. (C) Recursive reasoning produces B^D inference calls, exponential in depth.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The attribute dependency graph enables change impact analysis: before modifying a configuration parameter, an operator or automation system can trace the dependency graph to identify which runtime attributes will be affected, on which entities, with what expected magnitude.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 6: Constraint Model
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;constraint model&lt;/strong&gt; defines the desired state. The desired state is one in which goals are achieved while constraints are satisfied. Each entity in an environment may have a desired state, but, more interestingly, the environment as a whole may have one as well.&lt;/p&gt;

&lt;p&gt;A desired environment state is one in which all applications deliver on their goals while running within their operational constraints. Usually, the goals are performance goals of latency and throughput, and service level goals in terms of errors and availability, while the operational constraints are capacity, budget, compliance, and configuration.&lt;/p&gt;

&lt;p&gt;An entity's desired state is the configuration space within which the entity and its attributes operate without triggering symptoms or degradation events. It is the semantic encoding of the system’s operational envelope.&lt;/p&gt;

&lt;p&gt;The constraint model captures both the environment's desired state and the entity's desired state. These can be defined independently, but by using the attribute dependency model, the entity's desired state can be generated/inferred from the environment's desired state, resulting in a very compelling and powerful system.&lt;/p&gt;

&lt;p&gt;As in all other layers, the constraint knowledge base captures generic knowledge about constraints, and the dynamic constraint model represents the runtime constraints at a given point in time based on the discovered topology. Constraints are not just thresholds on metrics. They are relationships between configuration parameters and the runtime conditions required for healthy operation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Headroom constraint: Container memory limit &amp;gt;= 1.4 x used heap&lt;/li&gt;
&lt;li&gt;Budget constraint: Application cost &amp;lt; budget&lt;/li&gt;
&lt;li&gt;Latency constraint: Service latency &amp;lt; 100ms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the constraint model is explicit, it becomes possible to answer operational questions that today require senior engineering intuition: “What is the minimum safe memory limit for this service at current traffic?” “If we reduce the connection pool by 40%, at what request rate will we begin to see queuing symptoms?” The constraint model is the missing link between observability (what is happening) and operations (what configuration produces health). It is the semantic layer connecting configuration management to runtime behavior.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  What “Context” Actually Covers and Where It Falls Short
&lt;/h2&gt;

&lt;p&gt;Most observability platforms use the word loosely. Here is what the four common implementations actually encode, and where each one stops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared Labels&lt;/strong&gt;&lt;br&gt;
Common attributes – &lt;em&gt;service, environment, region, version&lt;/em&gt; – are attached to metrics, logs, and traces. This allows tooling to pivot between signal types for a given entity. The relationship is implied by label equality, not by any explicit model of dependency or causation. Two data points sharing &lt;em&gt;service=checkout&lt;/em&gt; are navigable together; they are not necessarily related by anything other than that label. This is a partial implementation of the entity model (layer 1) that lacks declarative topological relationships and behavior.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Topology Map&lt;/strong&gt;&lt;br&gt;
A topology map encodes structural relationships between entities, which services call which databases, which pods run on which nodes, and which workloads share a cluster. It is the most semantically substantive form of “context” in common tooling and is typically derived from trace data, service-mesh telemetry, or infrastructure APIs. This is a partial implementation of the topology model (layer 2): it captures that entity X is connected to entity Y, but not what behavior propagates along that edge, why a fault on X causes a symptom on Y, or which of X’s attributes drives which of Y’s. A topology map shows the wiring; it does not encode behavior (layer 3), causality (layer 4), attribute dependency (layer 5), or constraints (layer 6). Two services connected in the topology may be tightly coupled in failure propagation or entirely decoupled. The map alone cannot distinguish them. In practice, this means a topology map supports navigation (“show me what this service talks to”) but not reasoning (“if this service degrades, what symptoms should I expect, on which dependents, and why”). That reasoning requires the higher layers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Temporal Proximity&amp;nbsp;&lt;/strong&gt;&lt;br&gt;
Events co-located on a timeline are assumed by operators to be potentially related. The system carries no model of that relationship; pattern recognition is entirely delegated to the human. This is correlation by coincidence, not by structure. It addresses none of the six semantic layers explicitly; it is a UI affordance for human reasoning, not a semantic model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distributed Trace Propagation&lt;/strong&gt;&lt;br&gt;
A trace context header (W3C traceparent, B3, etc.) propagated across service boundaries encodes a genuine causal chain: span B was initiated by span A. This is the most semantically rich form of “context” in common use. It partially implements the topology model (layer 2) for instrumented call paths, and provides raw material for the behavior model (layer 3). However, it is constrained to synchronous, instrumented code paths and does not capture async operations, batch jobs, or infrastructure-level dependencies. It carries no causality, dependency, or constraint models.&lt;/p&gt;

&lt;p&gt;In summary, shared labels, temporal proximity, topology, and trace propagation collectively reach into layers 1 and 2. Layers 4 through 6 – causality, dependency, and constraints – are entirely outside the scope of what “context” addresses. That is the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Context – shared labels, topology map, temporal proximity, trace propagation – is a necessary foundation for navigating observability data. It is not sufficient for understanding systems. The jump from “we can see the signals” to “we understand what is happening and why” requires explicit semantic models at six distinct layers: entity, topology, behavior, causality, dependency, and constraint.&lt;/p&gt;

&lt;p&gt;The practical implication for SREs and platform engineers is that runbooks, tribal knowledge, and escalation paths are informal implementations of layers 4 through 6. The question is not whether to encode this knowledge, which already exists, but whether to leave it implicit in human memory or make it explicit in a form that tooling can reason about.&lt;br&gt;
Making semantics explicit is what makes a system legible to an AI agent. An agent reasoning over shared labels, topology, and temporal proximity alone is restricted to the same navigation problem a human faces, pivoting between signals without a model of why they are related. An agent reasoning over layers 4 through 6 can answer the questions that actually drive incident response, capacity planning, and change approval: what is causing this symptom, what is the blast radius of a degraded component, what configuration change would restore the constraint, and what would happen if that change were made. These questions do not require new data; the telemetry, configuration, and trace propagation already carry the raw signal. What they require is a model that the agent can reason against. One that encodes the causal, dependency, and constraint knowledge that today lives only in the engineers who happen to remember.&lt;/p&gt;

&lt;p&gt;Semantics is not an observability feature. It is the foundation that makes observability useful.&lt;/p&gt;

</description>
      <category>semantics</category>
      <category>context</category>
      <category>causality</category>
    </item>
  </channel>
</rss>
