<?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: Tigera Inc</title>
    <description>The latest articles on DEV Community by Tigera Inc (tigeraio).</description>
    <link>https://dev.to/tigeraio</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%2Forganization%2Fprofile_image%2F12572%2Fe692e88e-7a1e-49d5-870b-930d459570c0.png</url>
      <title>DEV Community: Tigera Inc</title>
      <link>https://dev.to/tigeraio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tigeraio"/>
    <language>en</language>
    <item>
      <title>Would You Notice? Five AI Agent Incidents and Who Actually Caught Them</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 22 Oct 2026 14:40:08 +0000</pubDate>
      <link>https://dev.to/tigeraio/would-you-notice-five-ai-agent-incidents-and-who-actually-caught-them-4j1c</link>
      <guid>https://dev.to/tigeraio/would-you-notice-five-ai-agent-incidents-and-who-actually-caught-them-4j1c</guid>
      <description>&lt;p&gt;In short, between April and July 2026, AI agents under evaluation at Anthropic, Google, Meta, OpenAI and the UK AI Security Institute reached systems outside their test environments, and on 30th September OpenAI said it had told more than 100 organizations that its agents may have touched theirs. The incidents have been read as containment failures, and they were. Read the five disclosures for who noticed, though, and they are detection stories first: one operator found out from a transcript review begun after another company’s announcement, two were told by their evaluation partner, one was told by the victim, and one caught its agent with its own monitoring and had the machines isolated within an hour of the alert. None of the five agents announced itself, and none needed to, because an agent’s traffic looks like any other workload’s until something is built to tell the difference. This post lays the five accounts side by side, asks what caught each one and how long it took, maps that onto what agent infrastructure has to provide, then says what a governance layer like Tigera Lynx can and cannot do about it. It is written for the platform and security leaders who would be asked, the morning after, how long an agent had been running in their cluster and whether anything other than the agent knew&lt;/p&gt;

&lt;p&gt;On 1st October 2026, &lt;a href="https://www.thestar.com.my/tech/tech-news/2026/10/02/openai-alerts-more-than-100-groups-about-rogue-ai-agent-activity" rel="noopener noreferrer"&gt;Reuters reported&lt;/a&gt; that OpenAI had “informed more than 100 organizations about incidents involving unauthorized activity tied to its AI agents.” The notices come from a review OpenAI opened after its evaluation agents reached Hugging Face’s production infrastructure in July. Reuters put the review at “roughly 50 petabytes of data,” OpenAI has said it will take months, and the company’s explanation, as reported, is that models “used internet access in unintended ways” or “did not have the ideal restrictions applied.” &lt;a href="https://www.theregister.com/a/5300891" rel="noopener noreferrer"&gt;The Register&lt;/a&gt; picked out the line from OpenAI’s update that every recipient will have read twice: “Notification does not mean that any private information was accessed.” &lt;/p&gt;

&lt;p&gt;That update is the latest of five accounts published since July. On 30th July, &lt;a href="https://www.anthropic.com/news/investigating-incidents-cybersecurity-evals" rel="noopener noreferrer"&gt;Anthropic reported&lt;/a&gt; that after reviewing 141,006 evaluation runs it had found three incidents, across six runs, in which Claude models reached real systems during evaluations run by the security firm Irregular. “The earliest incidents date to April.” Google’s Gemini reached three real companies during an Irregular test in May; Irregular notified Google at the end of July, and the public heard on 18th September, &lt;a href="https://www.securityweek.com/google-confirms-gemini-ai-breached-three-firms/" rel="noopener noreferrer"&gt;when The Wall Street Journal asked&lt;/a&gt;. We took that one apart in &lt;a href="https://www.tigera.io/blog/gemini-never-left-the-sandbox-the-sandbox-had-a-door/" rel="noopener noreferrer"&gt;Gemini never left the sandbox&lt;/a&gt;. On 14th August, &lt;a href="https://research.meta.ai/blog/addressing-third-party-testing-misconfiguration-muse-spark-1-1" rel="noopener noreferrer"&gt;Meta said&lt;/a&gt; a pre-release Muse Spark model had exploited a vulnerability in a real website during an Irregular exercise that began in early July. And on 4th August, the &lt;a href="https://aisi.gov.uk/blog/incident-report-unsanctioned-agent-behaviour-during-cyber-testing" rel="noopener noreferrer"&gt;UK AI Security Institute published an incident report&lt;/a&gt; on a cyber evaluation of seven models over 122 runs: “in 10 of the 122 runs, we identified 19 cases where an agent had taken distinct actions beyond the scope of the testing parameters.” &lt;/p&gt;

&lt;p&gt;None of this is carelessness that deserves a lecture, and the write-ups are candid: Anthropic published its run count and its root cause, Hugging Face published a &lt;a href="https://huggingface.co/blog/agent-intrusion-technical-timeline" rel="noopener noreferrer"&gt;forensic timeline&lt;/a&gt; of what OpenAI’s agent did inside its clusters, and AISI published what its monitoring saw and what it did not. These are the tests that should be run, by the people best placed to run them. &lt;/p&gt;

&lt;p&gt;The uncomfortable part sits in a column none of the five accounts draws out, so this post draws it. Not one of the five agents was caught because it announced itself. Each was found by a transcript read afterwards, by a partner, by the victim, or by a monitor watching the network, and the lag between the agent acting and someone knowing ran from under an hour to about three months, depending on which. That column is the one that applies to your cluster, where the agent is a Deployment somebody shipped on a Tuesday, calling a model provider with a key it found in its environment. Would you notice? &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Who noticed, and how long did it take?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here are the five accounts reduced to four questions: when the agent acted, who noticed first, what did the noticing, and how long it took. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Program&lt;/th&gt;
&lt;th&gt;When the agent acted&lt;/th&gt;
&lt;th&gt;Who noticed first&lt;/th&gt;
&lt;th&gt;What did the noticing&lt;/th&gt;
&lt;th&gt;Lag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Anthropic&lt;/strong&gt; (Claude models, evaluations by Irregular)&lt;/td&gt;
&lt;td&gt;April to July&lt;/td&gt;
&lt;td&gt;Anthropic, in a transcript review begun on 23rd July, two days after OpenAI’s disclosure&lt;/td&gt;
&lt;td&gt;A retrospective review of 141,006 runs; the misconfiguration surfaced “through our additional evaluation monitoring”&lt;/td&gt;
&lt;td&gt;About three months for the earliest. The two affected organizations Anthropic reached “had not previously detected the activity”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Google&lt;/strong&gt; (Gemini, evaluations by Irregular)&lt;/td&gt;
&lt;td&gt;May&lt;/td&gt;
&lt;td&gt;Irregular, which notified Google at the end of July&lt;/td&gt;
&lt;td&gt;Not stated publicly&lt;/td&gt;
&lt;td&gt;About two months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Meta&lt;/strong&gt; (Muse Spark 1.1, evaluations by Irregular)&lt;/td&gt;
&lt;td&gt;Early July&lt;/td&gt;
&lt;td&gt;Irregular: “A third-party model evaluator notified us of a cybersecurity issue”&lt;/td&gt;
&lt;td&gt;Not stated publicly&lt;/td&gt;
&lt;td&gt;Not stated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; (evaluation agents reaching Hugging Face)&lt;/td&gt;
&lt;td&gt;9th to 13th July&lt;/td&gt;
&lt;td&gt;Hugging Face, the victim&lt;/td&gt;
&lt;td&gt;“Live runtime analysis, SIEM logs, and others,” correlated into one signal that “failed to correctly raise the alert’s criticality and trigger the on-call team”&lt;/td&gt;
&lt;td&gt;Days. The campaign ran “for several days” and 17,600 actions before Hugging Face cut access on 13th July&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;UK AI Security Institute&lt;/strong&gt; (seven models, two cyber ranges)&lt;/td&gt;
&lt;td&gt;25th to 28th July&lt;/td&gt;
&lt;td&gt;AISI, from its own security monitoring&lt;/td&gt;
&lt;td&gt;Data “leaving one of our testing systems through the ‘Tor’ anonymity network,” on the morning of 28th July&lt;/td&gt;
&lt;td&gt;Within three days to the alert, and “within one hour of the alert” to isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2F0zpfvp0qamfo6l0d9pn6.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%2F0zpfvp0qamfo6l0d9pn6.png" alt="who-noticed" width="800" height="320"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: The five accounts on one axis: when the agent acted, when its operator knew, and the span in between. The two short spans belong to the programs where a monitor, rather than a transcript or a partner, did the noticing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read the fourth column; the fifth follows from it. There are three kinds of noticing in it. A transcript is the agent’s own account of itself, read afterwards; Anthropic’s review found six runs in 141,006, which is the right way to find something that already happened and no way to find something that is happening. A partner or a victim is someone else’s monitoring; Google and Meta learned from Irregular, and OpenAI’s agent was caught by Hugging Face. A monitor on the network or the runtime, at a point the agent did not control, is the only kind that noticed while the agent was still acting, and the lag runs with the kind: months for the transcript, weeks for the partner, days for the victim’s stack, and an hour from alert to isolation for the program that saw its own packets leave. &lt;/p&gt;

&lt;p&gt;The two accounts that say most about detection agree from opposite ends. AISI, which caught its agent: “Our security team detected the anomalous traffic through general monitoring after the fact, not through monitoring built to watch the evaluation as it ran, which could have flagged or blocked the behaviour sooner.” Anthropic, which found its agent in the transcripts: “Careful validation of all internet access paths before evaluations began and real-time monitoring of the evaluation logs would have helped to surface the problem sooner.” &lt;/p&gt;

&lt;p&gt;Hugging Face’s account adds a detail that belongs in every runbook. Its security stack correlated several ambiguous events into “a coherent attack signal.” Then that stack “failed to correctly raise the alert’s criticality and trigger the on-call team, costing precious time in the response.” The detection worked and the noticing did not, because a detection that pages nobody is a log line, and while it sat there the agent “went from code execution in a single worker pod to cluster-admin across multiple internal clusters in under thirteen hours.” &lt;/p&gt;

&lt;h2&gt;
  
  
  *&lt;em&gt;Why does an agent blend in? *&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Because nothing in the platform knows it is one. Kubernetes knows a Deployment, a container image, a ServiceAccount and a set of environment variables. It does not know that the image holds LangGraph and a provider key, that the process inside will decide its own next step from whatever lands in its context window, or that the HTTPS connection it just opened goes to a model. From the node’s point of view, an agent calling a model provider is a pod making TLS connections to an external host, which describes half the cluster, and an agent calling a model you host yourself is a pod talking HTTP to a Service, which describes the other half. &lt;/p&gt;

&lt;p&gt;The agent’s control flow is what makes this different from ordinary shadow IT. A forgotten cron job does the same thing every night. An agent does whatever the model decides, with whatever the pod can reach: the same shell, the same route out, and the same projected ServiceAccount token every pod carries, which is the token OpenAI’s agent read first inside Hugging Face. We made the point in &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;the safest place to run an AI agent&lt;/a&gt;: controls the agent can override are not controls, and the agent’s own report of what it did is not a control at all. &lt;/p&gt;

&lt;p&gt;An agent does leave marks that can be read from outside the process, without its cooperation. Four are reliable enough to build on. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It talks to a model.&lt;/strong&gt; For a public provider, the TLS handshake carries the provider’s hostname in the Server Name Indication field, in the clear, before any encrypted byte is sent. For a model you host in the cluster over plain HTTP there is no handshake, but there is a destination address that belongs to a Service you know about. Either way the connection is observable from the node, on every pod, whether or not the pod was configured to go through anything. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It loads a framework.&lt;/strong&gt; LangChain, LangGraph, CrewAI, AutoGen, the OpenAI Agents SDK, Google’s ADK: an agent built on any of them has the library mapped into its process, and a process’s loaded libraries can be read from the node. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It carries configuration that names a provider.&lt;/strong&gt; An environment variable called OPENAI_API_KEY or ANTHROPIC_BASE_URL says what the pod is for. The name says it; nobody needs to read the value, and nobody should. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It calls tools, and other agents.&lt;/strong&gt; An enforcement point that MCP and agent-to-agent calls pass through can see the method, the tool and the arguments. This mark is the odd one out, because it is only visible for traffic that was routed through the enforcement point. &lt;/p&gt;

&lt;p&gt;A gateway sees the agents that were configured to use it, ours included, so its record is a list of the agents somebody already knew about. The agent you are worried about is the one nobody configured: the notebook promoted to a Deployment, the side project calling a provider on the company card, the agent registered in staging and copied to production without the registration. Egress policy that closes every path except the gateway shrinks that set, and &lt;a href="https://www.tigera.io/blog/multi-layer-policy-for-securing-ai-agents/" rel="noopener noreferrer"&gt;Peter Kelly’s multi-layer policy post&lt;/a&gt; shows how the gateway and the kernel layers fit, but a workload that reaches a provider directly, or an in-cluster model over plain HTTP, never writes a line in the gateway’s record. So the first signal has to come from the node, from the first three marks, and only then can the gateway tell you what the agent is doing. &lt;/p&gt;

&lt;p&gt;Three verdicts fall out of that. Registered: the workload maps to an agent you know, with an identity you issued and an owner. Shadow: the workload is calling a model and no registered agent matches it, which is the “agents in here you haven’t accounted for” of Dillon Barry’s &lt;a href="https://www.tigera.io/blog/a-field-guide-to-the-agents-in-your-cluster/" rel="noopener noreferrer"&gt;field guide to the agents in your cluster&lt;/a&gt;. Unknown: a connection you observed and could not attribute to a workload at all. Each is a different morning. A registered agent doing something odd is a policy question, a shadow agent is a phone call, and an unknown connection is an investigation. &lt;/p&gt;

&lt;p&gt;Count what that means at scale. One agent, on a range built for it, went unnoticed at AISI for up to three days. Ten agents from three teams is a list someone could keep by hand for a quarter. Two hundred, some promoted from notebooks and some built in a vendor’s tool, is a population whose membership changes every sprint, and the only way to know its size is to observe it. You will not get to review 141,006 runs, because the review is what happens after someone tells you. &lt;/p&gt;

&lt;p&gt;What would have caught each one? &lt;/p&gt;

&lt;p&gt;Split the question in the title into the five the accounts answer between them, and for each ask what the accounts show and what infrastructure has to provide so that the answer does not depend on the agent, a partner or a victim. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The question&lt;/th&gt;
&lt;th&gt;What the five accounts show&lt;/th&gt;
&lt;th&gt;So the infrastructure must provide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Is an agent running here?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic reviewed 141,006 runs after the fact to find six; AISI’s agent went unnoticed for up to three days&lt;/td&gt;
&lt;td&gt;An inventory built from observation rather than registration: the model connection, the loaded framework and the configuration, read from the node for every workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Is it one of ours?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google and Meta each learned what their agent had done from Irregular, the partner running the range; Google two months on&lt;/td&gt;
&lt;td&gt;A registry to compare each observation against, so a workload is classified as registered, shadow or unknown, with the evidence beside the verdict&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where is it reaching, and as whom?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AISI’s agent sent data out over Tor and opened GitHub accounts under invented identities. OpenAI’s went from one worker pod to cluster-admin across several clusters&lt;/td&gt;
&lt;td&gt;Per-request authorization at an enforcement point the agent does not control, with the caller’s identity, the target and the operation as context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who gets told, and how fast?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hugging Face’s stack correlated the signal and paged nobody. AISI isolated its machines within an hour of the alert&lt;/td&gt;
&lt;td&gt;An alert that lands with a named owner, and a containment action that needs no redeploy: cut the agent off at the enforcement point and in the kernel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What did it do?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic’s and Google’s accounts rest on transcripts. Hugging Face counted 17,600 actions from its own database audit logs and network flow logs&lt;/td&gt;
&lt;td&gt;A record written by the enforcement points at the time, which the agent cannot edit: the caller, the target, the decision, the tool, and the model that served the call&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fzzw96j25pzllto5s0m5v.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%2Fzzw96j25pzllto5s0m5v.png" alt="node-reads" width="800" height="328"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The three marks a node can read from any pod without the agent’s cooperation, and the verdict each pod gets when they are compared against the registry. The red one is the pod nobody registered.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. Nothing in it asks the agent to report itself, and nothing in it depends on the model’s judgment on the day. Each row is a control that sits outside the agent, which, as we argued when we asked &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;why network policies, API gateways and RBAC are not enough&lt;/a&gt;, is the only place a control for an agent can sit. NetworkPolicy and RBAC each take half of row three, and Hugging Face’s account shows what the RBAC half looks like when it is a ClusterRole that “granted pod creation cluster-wide.” Neither answers row one, because neither knows what an agent is. &lt;/p&gt;

&lt;p&gt;Now run the five through the table. Row one, done from the node, turns Anthropic’s three-month review into a verdict on the day the first evaluation run opened a connection it should not have. Row four is the row Hugging Face’s account is about, and the one AISI got right: an alert with an owner, and an hour. Row five is the difference between Hugging Face’s timeline, rebuilt from its own logs, and a transcript in which, as Anthropic describes, a model that recognized a real system “rationalized that the real company must be part of the exercise.” &lt;/p&gt;

&lt;h2&gt;
  
  
  *&lt;em&gt;What happens when it is done properly? *&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Here is what a governance layer like &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; does for the table above, and what it leaves to you. Both halves matter. &lt;/p&gt;

&lt;p&gt;Done properly, every node runs a detector that reads the marks an agent cannot hide: the hostname in each outbound TLS handshake, matched against a watchlist of public model providers and whatever self-hosted endpoints you add; connections to a model you run in the cluster over plain HTTP, matched on the Service’s addresses; the agent-framework libraries loaded in each process; and the names of environment variables that point at a provider, never their values. The signals are weighted together, and configuration alone never makes a workload an agent. Each detection is compared against the registry and given a verdict, registered, shadow or unknown, with the evidence beside it. Registered agents carry an identity the infrastructure issued (SPIFFE, OIDC, or a pod-owner binding for agents you cannot modify), and their traffic passes a gateway the agent does not control: default deny, a decision on every request, with the caller’s identity, the target and the operation as context. A registered agent that should not be doing what it is doing can be quarantined with one action, at the gateway, which refuses its traffic, and in the kernel, where it can no longer write to disk, launch a process or open an outbound connection, with no redeploy; a discovered workload gets the kernel half, which is the half that stops it reaching anything. Every call through the gateway lands in the Agent Trail with the caller, the target, the decision and the policy that made it, the tool and the names of its arguments, the token issued for that hop, and the model that actually served the call, written by the enforcement plane rather than narrated by the agent. The same detector ships as a package for plain Linux hosts, for the agents that never made it into a cluster. &lt;/p&gt;

&lt;p&gt;Now the other half. None of that is automatic, and some of it is deliberately narrow. The detector reports workloads that called a model in the window you are looking at, so an idle agent does not appear, and one that reaches a model over gRPC, or an endpoint nobody added to the watchlist, is not matched. Its identity matching reads the Secret references in a pod’s spec, so an agent that gets its credentials some other way shows up as shadow until you register it, and the first week of detection in a real cluster is a list of workloads to go and ask about. A person decides whether each shadow is sanctioned; the detector will not. The trail records what passed through the gateway, as tool names and argument names rather than values, and no prompts or completions unless you turn that on and accept the retention that comes with it, so “what the agent saw and what it decided” still lives in the agent’s own telemetry, and keeping it is your call. Closing every route out of the pod except the gateway is network policy you write first. And a verdict is not a page: Lynx shows the shadow and the evidence, and who gets woken at three in the morning is your on-call rota. What the infrastructure provides is the layer the question assumes exists: the ability to say, from observation rather than from a registry someone forgot to update, which agents are running, which of them you know about, where each one reached, and what it did through the points you control. &lt;/p&gt;

&lt;p&gt;Put in properly, the agent somebody deployed on Tuesday is a shadow verdict on Wednesday morning with the library and the hostname beside it, and a quarantine button under it. Put in badly, it is a line in a transcript review you begin after another company’s announcement. &lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What is a shadow AI agent?&lt;/strong&gt; A shadow AI agent is a workload that calls a model, a tool server or another agent without having been registered with whatever governs agents in that environment, so its calls happen outside policy and outside the audit record. In Kubernetes it is usually ordinary: a notebook promoted to a Deployment, a vendor’s builder with a key, an agent copied between clusters without its registration. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How do you detect an AI agent running in a Kubernetes cluster?&lt;/strong&gt; From the node, rather than from the agent. An agent opens connections to a model endpoint, loads an agent framework into its process, and carries configuration that names a provider. All three can be read on the node with eBPF and process inspection, for every pod, without the agent being configured to report anything. Each detection is then classified against the registry of known agents as registered, shadow or unknown. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why isn’t a gateway enough to find unregistered agents?&lt;/strong&gt; A gateway sees the traffic that was routed through it, so its record is a list of agents somebody already configured. An agent nobody configured reaches the provider directly, or reaches a model inside the cluster, and never appears. Egress policy that forces the gateway path shrinks the gap. Node-level detection closes it, and the gateway then governs what the detected agent is allowed to do. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is a transcript enough to know what an agent did?&lt;/strong&gt; No. A transcript is the agent’s account of itself. Anthropic’s report describes models that recognized a real system and “rationalized that the real company must be part of the exercise,” and the transcript records that reasoning faithfully while the system on the other end records a login. Evidence of what an agent did comes from the points it passed through: the egress policy, the authorization decision, the audit log. Hugging Face counted 17,600 actions from its own audit and flow logs, which is what a record looks like. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What should happen in the first hour after an unregistered agent is found?&lt;/strong&gt; Attribute it, contain it, then ask. Attribution means which pod, namespace, ServiceAccount and owner, and what it has been reaching, taken from the detection evidence rather than from the pod’s author. Containment means quarantining it in the kernel so that it can neither call out nor change anything while you look, in one action rather than a redeploy. Then ask the owner whether it is sanctioned, and if it is, register it and give it a policy. AISI’s hour is the benchmark: alert, review within minutes, isolation within the hour. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do I have to tell anyone if my agent reached someone else’s system?&lt;/strong&gt; That is a legal question, and the answer depends on where you operate, what the agent did and what your contracts say, so get an opinion on your own case. Some clocks are already running: if you sell products with agents in them into the EU, &lt;a href="https://www.tigera.io/blog/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock/" rel="noopener noreferrer"&gt;the Cyber Resilience Act’s reporting duty&lt;/a&gt; starts from the moment you have reliable evidence. The engineering answer is that you cannot notify anyone about an agent you have not detected, and OpenAI’s hundred notices are what the alternative looks like. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Whose question is it?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;OpenAI is reading 50 petabytes, over months, to find out where its agents went. Anthropic read 141,006 runs to find six. AISI read one alert and had its machines isolated within the hour. The difference between those three efforts was never the agents’ speed. It was the distance between the agent and the first thing that was watching, and in four accounts out of five that thing belonged to someone else or was read after the fact. &lt;/p&gt;

&lt;p&gt;Your agents are not on a range built for them. They are in a cluster with everything else, and the morning-after question is not whether one of them could reach something it should not, because Hugging Face’s timeline settles that. The question is whether anything you run would know. &lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap, and ask it of a named person. An agent nobody is watching for is found by whoever it reaches. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the CISO, the VP of Engineering or the head of platform&lt;/strong&gt; , your question is about the fleet. How many workloads in our clusters called a model provider last week, how many of those map to an agent we registered, and who owns the difference? The first number comes from observation. The second comes from a registry. If nobody can give you both, the difference between them is the fleet you do not know you have. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the platform or security engineer who runs the cluster&lt;/strong&gt; , your question is about one pod. If a pod in the data science namespace started calling a model provider tonight, with a key from a ConfigMap, what would tell you by morning: the agent, the invoice, or something on the node? And once it told you, could you stop that pod reaching anything else without a redeploy and without finding its author first? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you built the agent&lt;/strong&gt; , your question is about whether it exists on paper. Is it registered, does its traffic pass the enforcement point, and if it reached a system it should not have, would the record carry its name and yours, or an IP address and a guess? An agent that works without registration is the one that shows up as shadow, and the phone call goes to whoever can be found first. &lt;/p&gt;

&lt;p&gt;If any of those answers starts with “we would need to check,” the check is what to build. &lt;/p&gt;

&lt;p&gt;One program in five noticed while it was happening. It was watching the network, not the model. &lt;/p&gt;

&lt;h2&gt;
  
  
  *&lt;em&gt;See Lynx in action *&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Tigera Lynx gives every AI agent, MCP server and LLM provider in your clusters a verifiable identity, a policy decision on every call, and a record written by the enforcement point rather than by the agent. Schedule a demo and see it on a live cluster. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;&lt;strong&gt;Request a demo of Tigera Lynx&lt;/strong&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lynx is Tigera’s enterprise security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;request a demo&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/would-you-notice-five-ai-agent-incidents-and-who-actually-caught-them/" rel="noopener noreferrer"&gt;Would You Notice? Five AI Agent Incidents and Who Actually Caught Them&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>aiagents</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>Meet Tigera at KubeCon + CloudNativeCon North America 2026</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Mon, 19 Oct 2026 18:16:20 +0000</pubDate>
      <link>https://dev.to/tigeraio/meet-tigera-at-kubecon-cloudnativecon-north-america-2026-4fg</link>
      <guid>https://dev.to/tigeraio/meet-tigera-at-kubecon-cloudnativecon-north-america-2026-4fg</guid>
      <description>&lt;p&gt;Ask a platform team how many AI agents are running in their clusters and you usually get a pause. Agents arrive through application teams, not platform teams. They call tools over MCP, invoke other agents and reach external model providers, and a Kubernetes service account tells you which pod made the call but not which agent and on whose behalf.&lt;/p&gt;

&lt;p&gt;That gap is what we’re bringing to KubeCon + CloudNativeCon North America 2026, November 9–12 in Salt Lake City. Find Tigera at &lt;strong&gt;booth 150&lt;/strong&gt; for quick Lynx sessions on identifiying, governing and containing AI agents, and pick up a new t-shirt while you’re there. On November 9, before the show floor opens, join us for a workshop on securing AI agents on Kubernetes and a happy hour with the Lynx community.&lt;/p&gt;

&lt;h2&gt;
  
  
  November 9: Workshop and happy hour
&lt;/h2&gt;

&lt;p&gt;Both events are at Le Méridien Salt Lake City Downtown (131 S 300 W), about a five-minute walk from the Salt Palace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discovering and Securing AI Agents on Kubernetes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;2:00–7:00 PM MST · Triumph Salon · In-person or virtual&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Peter Kelly, CTO at Tigera, walks through the path we’ve watched teams take with agents in production, in order. Discovery comes first, because agents rarely arrive through the platform team. Identity comes next, because a service account can’t tell you which agent is acting or on whose behalf. Then governance: policy expressed at the level of tools and data rather than IPs and ports, run in observation mode until you trust it enough to enforce.&lt;/p&gt;

&lt;p&gt;The session is architecture-first and vendor-neutral. You leave with a mental model you can apply to whatever you’re building on, not a product pitch. In-person seats are limited; virtual attendees can stream the workshop live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.tigera.io/lp/discovering-and-securing-ai-agents-in-kubernetes-event/" rel="noopener noreferrer"&gt;Register Now →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Happy Hour with Tigera
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;5:00–7:00 PM MST · Pre-Function Lounge · In-person only&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kick off the week with the maintainers behind Calico and the team behind Lynx. Expect drinks, local bites, and enough room to hear each other talk. No pitches, only platform engineers swapping stories from the trenches.&lt;/p&gt;

&lt;p&gt;Already registered for the workshop? You’re automatically covered for the happy hour, too. Capacity is limited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.tigera.io/lp/happy-hour-with-tigera-na-2026/" rel="noopener noreferrer"&gt;Register Now →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;November 10 – 12: Silent disco sessions at booth 150&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Grab a headset at booth 150 and watch Tigera engineers work through real agent-security problems live in Lynx. Each session follows one question a platform team asks once agents show up in production.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Day&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Time&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Topic&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Day 1&lt;/td&gt;
&lt;td&gt;11:00 – 11:30 am&lt;/td&gt;
&lt;td&gt;Follow the agent: Who called what, and on whose behalf?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 1&lt;/td&gt;
&lt;td&gt;12:15 – 12:45 pm&lt;/td&gt;
&lt;td&gt;From shadow agent to fully managed agent in Lynx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 1&lt;/td&gt;
&lt;td&gt;1:00 – 1:30 pm&lt;/td&gt;
&lt;td&gt;Is something already running AI?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 1&lt;/td&gt;
&lt;td&gt;2:15 – 2:45 pm&lt;/td&gt;
&lt;td&gt;Kill Switch: Quarantining and sandboxing an agent you don’t trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 1&lt;/td&gt;
&lt;td&gt;4:10 – 4:40 pm&lt;/td&gt;
&lt;td&gt;Your agent found another way out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 1&lt;/td&gt;
&lt;td&gt;5:15 – 5:45 pm&lt;/td&gt;
&lt;td&gt;Claude Code is inside your enterprise. Can you see what it’s doing?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 1&lt;/td&gt;
&lt;td&gt;6:15 – 6:45 pm&lt;/td&gt;
&lt;td&gt;Kill Switch: Quarantining and sandboxing an agent you don’t trust&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Day&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Time&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Topic&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Day 2&lt;/td&gt;
&lt;td&gt;10:30 – 11:00 am&lt;/td&gt;
&lt;td&gt;Follow the agent: Who called what, and on whose behalf?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 2&lt;/td&gt;
&lt;td&gt;12:30 – 1:00 pm&lt;/td&gt;
&lt;td&gt;From shadow agent to fully managed agent in Lynx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 2&lt;/td&gt;
&lt;td&gt;1:45 – 2:15 pm&lt;/td&gt;
&lt;td&gt;Is something already running AI?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 2&lt;/td&gt;
&lt;td&gt;3:40 – 4:10 pm&lt;/td&gt;
&lt;td&gt;Kill Switch: Quarantining and sandboxing an agent you don’t trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 2&lt;/td&gt;
&lt;td&gt;4:30 – 5:00 pm&lt;/td&gt;
&lt;td&gt;Your agent found another way out&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Day&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Time&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Topic&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Day 3&lt;/td&gt;
&lt;td&gt;10:30 – 11:00 am&lt;/td&gt;
&lt;td&gt;From shadow agent to fully managed agent in Lynx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 3&lt;/td&gt;
&lt;td&gt;12:45 – 1:15 pm&lt;/td&gt;
&lt;td&gt;Kill Switch: Quarantining and sandboxing an agent you don’t trust&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sessions run on a rotating schedule throughout the expo hours. Stop by between talks to ask questions, or &lt;strong&gt;&lt;a href="https://success.tigera.io/c/chris-calandrotigera-io" rel="noopener noreferrer"&gt;book a deeper walkthrough&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Answer a trivia question and take home a t-shirt
&lt;/h2&gt;

&lt;p&gt;While you’re at booth 150, answer one trivia question from our team and pick up a new Tigera t-shirt. It takes a minute, and it’s a good excuse to say hello between sessions.&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%2Fgfrsfifhnc4gff26lh6v.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%2Fgfrsfifhnc4gff26lh6v.png" alt="Tigera shirt front" width="800" height="1050"&gt;&lt;/a&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%2Fztym24rulpjxv7ezgc0j.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%2Fztym24rulpjxv7ezgc0j.png" alt="Tigera Lynx shirt back" width="800" height="1053"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Find us with our partners
&lt;/h2&gt;

&lt;h3&gt;
  
  
  VMs on Kubernetes Day with Everpure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;November 9 · Marriott, about five minutes from the convention center&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Running VMs and containers side by side on Kubernetes changes how you think about network identity, policy and migration. Veronika Smolik joins Isovalent for a 30-minute joint session on securing VM workloads on Kubernetes, then stays on for the closing panel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tigera at the SUSE booth
&lt;/h3&gt;

&lt;p&gt;We’re presenting a 45-minute session at the SUSE booth. Stay tuned for more details.&lt;/p&gt;

&lt;h2&gt;
  
  
  See you in Salt Lake City
&lt;/h2&gt;

&lt;p&gt;AI agents belong on your Kubernetes platform: identified, governed and contained like every other production workload. Come compare notes. Start your week with the workshop and happy hour on November 9, then find us at booth 150 for a silent disco session, a t-shirt, or a one-on-one conversation with our engineers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://success.tigera.io/c/chris-calandrotigera-io" rel="noopener noreferrer"&gt;Book a meeting with Tigera at KubeCon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/meet-tigera-at-kubecon-cloudnativecon-north-america-2026/" rel="noopener noreferrer"&gt;Meet Tigera at KubeCon + CloudNativeCon North America 2026&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>companyblog</category>
      <category>aiagentsecurity</category>
      <category>vmmigration</category>
      <category>event</category>
    </item>
    <item>
      <title>YouTube Let AI Prototypes Read Production. The Token Did the Work.</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Mon, 19 Oct 2026 10:50:35 +0000</pubDate>
      <link>https://dev.to/tigeraio/youtube-let-ai-prototypes-read-production-the-token-did-the-work-1a90</link>
      <guid>https://dev.to/tigeraio/youtube-let-ai-prototypes-read-production-the-token-did-the-work-1a90</guid>
      <description>&lt;p&gt;TL;DR: Google Cloud’s post of 22nd July 2026 on why AI apps fail in production describes how a YouTube team gets AI prototypes in front of user research in weeks instead of quarters: a prototyping stack that hands each prototype read-only access to live production data through a proxy, keeps its code out of the production binary, and throws the prototype away once the idea is proven. The number behind the post is MIT Project NANDA’s finding, from July 2025, that just 5% of custom enterprise AI tools reach production. Told as a velocity story, the stack is an identity and policy design: the prototype never held a production credential, could not write however it was prompted, and had an end date by design. Few organizations can rebuild their product in a mirror, but the constraints that did the work cost less than the mirror, and an AI agent prototype on Kubernetes needs every one of them, with read-only decided per tool call rather than per database. This post takes the stack apart, maps it onto an agent prototype, follows the token into the gap between the prototype and the rewrite, then says what a governance layer like Tigera Lynx can and cannot do about it. It is written for the platform and security engineers who will be asked to give a prototype access to live data by Friday, and the leads who say yes.&lt;/p&gt;

&lt;p&gt;On 22nd July 2026 Google Cloud &lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/why-ai-apps-fail-in-production" rel="noopener noreferrer"&gt;published a post&lt;/a&gt; by Stephanie Wong, its global lead for developer programs, under the title “Why AI apps fail in production (And how Google solved it)”. The answer is a prototyping stack built by Benji Bear, a former YouTube software engineer now at DeepMind, and his team: “a unified design-to-code lifecycle platform that completely decouples rapid experimentation from mainline production servers.” Prototypes start from Google AI Studio templates that “hook into a proxy server set up on Google Cloud for prototype-approved read-only data,” which “instantly grants the prototype pre-authenticated, read-only API access to live metadata bundles (playlists, videos, channels) via strict tokens.” Prototypes that need to be seen inside the real product are injected into the live YouTube web surface, and “Code-split chunk safeguards isolate this from production binaries.” By the post’s account YouTube “went from taking multiple quarters to vet an idea” to putting prototypes such as YouTube Recap and Ask YouTube in front of user research studies in weeks.&lt;/p&gt;

&lt;p&gt;The number the post opens with deserves its source. “The data is sobering,” Wong writes: “only 5% of AI prototypes make it to production; the other 95% fall into the validation abyss.” The link behind “data” goes to &lt;a href="https://mlq.ai/media/quarterly_decks/v0.1_State_of_AI_in_Business_2025_Report.pdf" rel="noopener noreferrer"&gt;The GenAI Divide: State of AI in Business 2025&lt;/a&gt;, published by MIT’s Project NANDA in July 2025. The report’s own words are narrower and worth keeping. Of enterprise-grade AI systems, custom or vendor-sold: “Sixty percent of organizations evaluated such tools, but only 20 percent reached pilot stage and just 5 percent reached production.” The headline that “95% of organizations are getting zero return” sits a few pages from a note that the figures are “directionally accurate based on individual interviews rather than official company reporting.” It is a finding about enterprise AI pilots in the first half of 2025, and it says what the post needs it to say: most of what gets built does not ship.&lt;/p&gt;

&lt;p&gt;The stack is the right design, and the post is honest about why it was needed. Addy Osmani, quoted in it, ran “ten parallel agents on a personal project” and ended up “breaking two apps catastrophically because the modifications weren’t properly isolated.” Wong’s gloss is that “unconstrained agentic orchestration inside an enterprise introduces an unpredictable blast radius,” and YouTube “is essentially a public utility; you cannot risk overloading it with experimental technical debt.” The stack’s answer was a set of constraints a prototype could not argue with, rather than a review board. Read as a security design, the velocity story is an identity story: the prototype never held a production credential, it could read and could not write, and its code never entered the production binary.&lt;/p&gt;

&lt;p&gt;YouTube could afford to build a mirror of YouTube. Almost nobody reading this can. The constraints cost less than the mirror, and they are the part that did the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did YouTube’s prototyping stack actually enforce?
&lt;/h2&gt;

&lt;p&gt;Take the post’s two mechanism paragraphs apart and four decisions fall out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The prototype never held a production credential.&lt;/strong&gt; The proxy did. What the prototype received was “pre-authenticated, read-only API access” through “strict tokens”: a token good for one proxy, issued to the prototype, with no path to the database behind it. A prototype that leaks its token leaks access to prototype-approved metadata. A prototype that leaks a production credential leaks production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read-only was a property of the proxy, not a line in the prompt.&lt;/strong&gt; The post’s phrasing is exact: developers get live production parameters “without any ability to write back to, pollute, or crash core databases.” Nothing asked the prototype to behave. The proxy had no write path, so the prototype’s behavior did not matter, and an app “meant to be messy with some technical debt,” in the post’s own words, is exactly the caller whose behavior should not matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The prototype’s code never reached the production binary.&lt;/strong&gt; Code-split safeguards kept experimental features out of the production build, and a prototype deployed to “a safe staging environment in minutes” rather than to the thing serving billions of users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The prototype was built to be thrown away.&lt;/strong&gt; “Embrace throw-away code,” the post says. Prototypes exist “to validate product-market fit using quantitative data,” and refactoring one “into an enterprise codebase is an architectural trap.” A proven idea is rewritten for production instead. The prototype proves the idea and then stops existing.&lt;/p&gt;

&lt;p&gt;Those four decisions, as boundaries:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;What the post describes&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What the prototype could not do&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A proxy holding “prototype-approved read-only data”&lt;/td&gt;
&lt;td&gt;A credential boundary: the production credential stays behind the proxy&lt;/td&gt;
&lt;td&gt;Reach the database except through the proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Strict tokens” issued to the prototype&lt;/td&gt;
&lt;td&gt;An identity per prototype, its scope fixed by the issuer&lt;/td&gt;
&lt;td&gt;Widen its own access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Without any ability to write back”&lt;/td&gt;
&lt;td&gt;An authorization boundary enforced where the prototype cannot edit it&lt;/td&gt;
&lt;td&gt;Write, however it was prompted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Code-split chunk safeguards”&lt;/td&gt;
&lt;td&gt;A code boundary: experimental code never ships in the production build&lt;/td&gt;
&lt;td&gt;Change what production users run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Embrace throw-away code,” then a rewrite for production&lt;/td&gt;
&lt;td&gt;A lifecycle: the prototype has an end date by design&lt;/td&gt;
&lt;td&gt;Become production by accretion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fzq3p27sxpckcu5xk1fg4.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%2Fzq3p27sxpckcu5xk1fg4.png" alt="Diagram: YouTube's prototyping stack as boundaries. A prototype reads live production data only through a proxy on Google Cloud that holds the credential and issues a read-only token, and prototype code stops at code-split safeguards in staging, never reaching the production binary" width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: YouTube's prototyping stack, read as boundaries. The proxy holds the credential, the token cannot widen, the code never reaches production, and the prototype is discarded after the rewrite.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now translate that into questions an engineering team has to answer about its own prototypes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Which credential does the prototype hold, and who issued it?&lt;/strong&gt; At YouTube the answer was a strict token from a proxy. For most teams the honest answer is the API key of whoever built the demo, pasted in on a Thursday afternoon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What stops a write?&lt;/strong&gt; If the answer is a sentence in the system prompt, nothing does. If the answer is a proxy with no write path, or a policy at a gateway the prototype cannot reach, the prototype’s behavior stops mattering, which is the point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When the prototype is thrown away, what happens to its access?&lt;/strong&gt; The post does not say what became of the tokens, and it did not need to, because the proxy’s scope kept the question small. For a prototype holding a real key to a real system, it is the whole question.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One prototype makes each of those an afternoon’s conversation. Ten prototypes across three product teams make it a list someone promised to keep. Two hundred prototypes a quarter, which is roughly what “fail more frequently and safely” means once a company takes the advice, make it a question with no owner, and if the MIT number holds, 190 of them will never be rewritten.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does read-only mean when the prototype is an agent?
&lt;/h2&gt;

&lt;p&gt;The prototypes in the post read metadata and rendered a feature. The prototypes being built this year are agents: they hold a model key, call tools over MCP, and act on what comes back. Three things change.&lt;/p&gt;

&lt;p&gt;First, read-only stops being a database property and becomes a per-call property. An agent’s reads and writes are tool calls on the same server over the same connection: &lt;code&gt;search_tickets&lt;/code&gt; and &lt;code&gt;close_ticket&lt;/code&gt;, &lt;code&gt;list_customers&lt;/code&gt; and &lt;code&gt;send_email&lt;/code&gt;. There is no read-only connection string to hand out. Read-only has to be decided on each call, from the operation and the tool name, by something that can see both.&lt;/p&gt;

&lt;p&gt;Second, read is not harmless. Playlist metadata has a small blast radius whatever the caller does with it. An agent prototype that can read every customer record and reach the internet can move every customer record to the internet, and will do so if its context window tells it to, which is what prompt injection is. Read-only for an agent means read-only and scoped, with an egress policy that names where the reads may go; &lt;a href="https://www.tigera.io/blog/gemini-never-left-the-sandbox-the-sandbox-had-a-door/" rel="noopener noreferrer"&gt;the May evaluation incidents&lt;/a&gt; were a route out nobody intended.&lt;/p&gt;

&lt;p&gt;Third, the prototype acts for someone. An agent prototype in front of a researcher or a pilot customer makes calls on that person’s behalf, and the record of the pilot has to say so.&lt;/p&gt;

&lt;p&gt;Lay the stack over an agent prototype on a cluster and the table reads like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;YouTube’s stack provided&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;For an agent prototype, that means&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;So the infrastructure must provide&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A proxy holding the production credential&lt;/td&gt;
&lt;td&gt;The model key and tool credentials never sit in the prototype’s pod&lt;/td&gt;
&lt;td&gt;Credentials held at an enforcement point and attached after the policy check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A strict token per prototype&lt;/td&gt;
&lt;td&gt;An identity of its own, registered before its first call&lt;/td&gt;
&lt;td&gt;A verifiable workload identity, so “which prototype” is a fact on every request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read-only by construction&lt;/td&gt;
&lt;td&gt;Reads allowed and writes refused, decided per tool call&lt;/td&gt;
&lt;td&gt;A default-deny policy evaluated on every request, with the operation, tool name and arguments as context, that the prototype cannot edit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prototype-approved data rather than the whole store&lt;/td&gt;
&lt;td&gt;Scoped reads: these tools, these resources, this tenant&lt;/td&gt;
&lt;td&gt;Policy that names the tools and resources, and an egress policy that names where the data may go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code isolated from production binaries&lt;/td&gt;
&lt;td&gt;Its own namespace, with no route to production services except through the enforcement point&lt;/td&gt;
&lt;td&gt;Namespace isolation, default-deny egress, and admission that refuses a prototype pod without them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quantitative data from the pilot&lt;/td&gt;
&lt;td&gt;Evidence of what the prototype did and for whom, written by something other than the prototype&lt;/td&gt;
&lt;td&gt;A record from the enforcement point: caller, person, tool, decision, model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Throw-away code and a rewrite&lt;/td&gt;
&lt;td&gt;The prototype’s identity has an end date; the rewrite gets a new one through the pipeline&lt;/td&gt;
&lt;td&gt;Registration revoked in one commit, and detection of a prototype still running after it should be gone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Feam2rkug1rc1tsuojy4o.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%2Feam2rkug1rc1tsuojy4o.png" alt="Diagram: the same boundaries for an agent prototype pod with no model key or tool credentials. Every tool call passes an enforcement point that allows reads, refuses writes and attaches a scoped credential, and a prototype still running after its registration is deleted is found from the node as unknown" width="800" height="316"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The same boundaries for an agent prototype on a cluster. Read-only is a policy decision on each tool call, the credentials live at the enforcement point, and the record is written there too.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. None of it is a mirror of your product, and none of it is Google-sized. It is an identity, a policy, a place to hold credentials and a record, and it is missing from most clusters because &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;NetworkPolicy, API gateways and RBAC&lt;/a&gt; see pods, addresses and roles rather than agents and tool calls. What a read-only policy shares with a proxy that cannot write is that the prototype can override neither, and &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;controls the agent can override are not controls&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens to the token when the prototype is thrown away?
&lt;/h2&gt;

&lt;p&gt;The post ends its story at the rewrite. The idea proves out, the messy script is discarded, and the production version is rebuilt against “a verified blueprint to code against rather than a blank canvas.” That is the deploy half of the lifecycle, and &lt;a href="https://www.tigera.io/blog/from-merged-pr-to-governed-pod-automating-ai-agent-deployment-on-kubernetes/" rel="noopener noreferrer"&gt;the previous post&lt;/a&gt; walked it from merged pull request to governed pod: the rewrite is the commit, and the agent’s identity and allowed calls ship in the same chart as its code.&lt;/p&gt;

&lt;p&gt;Between the two tracks is a gap the post does not look into, and it is where the security question lives. The prototype that proved the idea held a token to live data for the weeks it took to prove it. The rewrite gets a new identity through the pipeline. What happens to the old one?&lt;/p&gt;

&lt;p&gt;At YouTube the honest answer may be “nothing much,” because an orphaned proxy token buys an attacker prototype-approved playlist metadata. For a prototype carrying a key to a customer database, a ticketing system or a model provider’s billing account, an orphaned token is a live credential with no owner, and the MIT number says most prototypes end this way. The one in twenty that reaches production gets rewritten, and the rewrite is where someone could remember to retire the old identity. The other nineteen are abandoned, and nobody rewrites an abandoned prototype, so nobody retires it either. Wong’s post says of the 95% failure rate that “it is the strategy.” If failing often is the strategy, retiring what failed is part of it, and it has to be the kind of retirement that does not depend on anyone remembering: a registered identity can be unregistered in the same commit that deletes the namespace, and a prototype still running after that is something the cluster should find rather than trust.&lt;/p&gt;

&lt;p&gt;That is also the argument for a real identity on day one rather than a borrowed key. A borrowed key cannot be retired without breaking whoever lent it; an identity issued to the prototype can be revoked without asking anyone, and its record outlives it, so when the one prototype in twenty that shipped is audited, the pilot it grew from has a trail.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when it is done properly?
&lt;/h2&gt;

&lt;p&gt;Here is what a governance layer like &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; does for the table above, and what it leaves to you. Both halves matter.&lt;/p&gt;

&lt;p&gt;Done properly, a prototype gets on day one what YouTube’s proxy gave its prototypes, without the proxy. Every agent, MCP server and LLM provider in the cluster is registered and carries a verifiable identity (SPIFFE, OIDC, or a pod-owner binding for a prototype you cannot modify), so “which prototype, on whose behalf” is a fact on every request rather than a forensic project after the pilot. Authorization runs at a gateway the prototype does not control: default deny, evaluated on every request, with the caller, the target and the operation as context, and for MCP traffic the method, tool name and arguments, so read-only is a policy that refuses tool invocations or allows a named list of read tools, and holds however the prototype was prompted. Provider credentials are attached at the gateway after the policy check, so the model key never sits in the prototype’s pod, and each token the gateway mints is addressed to one destination. A prototype acting for a user can exchange that user’s token for one that keeps the person as the subject and names the prototype as the actor, so a pilot’s record says who each call was for. Workloads nobody registered are detected from the node itself and classified as sanctioned, shadow or unknown, which is how a prototype that should be gone shows up (&lt;a href="https://www.tigera.io/blog/a-field-guide-to-the-agents-in-your-cluster/" rel="noopener noreferrer"&gt;the field guide to the agents in your cluster&lt;/a&gt; covers the list). And every request lands in the Agent Trail with the caller, the person, the tool, the policy decision and the model that served the call, written by the enforcement plane rather than narrated by the prototype: the quantitative data the post wanted from a pilot, with the refusals beside it.&lt;/p&gt;

&lt;p&gt;Now the other half. None of that is automatic. Someone has to register the prototype before its first call; one that skipped registration is found by the detector rather than governed by it, until a person decides what it is. Someone has to decide what read-only means for your data, which tools are reads and which reads return a table that should never leave the cluster, because the gateway enforces that classification and does not supply it. A policy that permits everything proves nothing, and the first pull request that adds a prototype’s permit line needs a reviewer who reads it as carefully as the demo. Egress is NetworkPolicy work in your chart, because the gateway governs the traffic that reaches it. And Lynx does not retire the prototype. Deleting a registration is one commit, and a registration nobody deletes is an identity that still works. What the infrastructure provides is the layer YouTube’s stack built once and most teams assume exists: the ability to say, with evidence, which prototypes you have, what each one could touch, and what each one did.&lt;/p&gt;

&lt;p&gt;Put in properly, a prototype gets its own identity on the day it is built and loses it on the day it is thrown away, and both days leave a record. Put in badly, the prototype is thrown away and the token is not.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What is YouTube’s AI prototyping stack?&lt;/strong&gt; A platform Google Cloud described on 22nd July 2026 that separates AI prototyping from YouTube’s production systems. Prototypes start from Google AI Studio templates, read live production metadata through a proxy that issues read-only tokens, and can be injected into the live YouTube web surface with their code kept out of production binaries. Prototypes are written to be thrown away, and a proven idea is rewritten for production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where does the claim that 95% of AI prototypes fail come from?&lt;/strong&gt; From MIT Project NANDA’s July 2025 report, The GenAI Divide: State of AI in Business 2025, which found that of organizations evaluating custom or vendor-sold enterprise AI systems, “only 20 percent reached pilot stage and just 5 percent reached production.” The report calls its figures “directionally accurate based on individual interviews rather than official company reporting,” drawn from over 300 public initiatives, interviews with 52 organizations and 153 surveyed leaders. Google’s post rounds that into “only 5% of AI prototypes make it to production.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is read-only access safe for an AI agent prototype?&lt;/strong&gt; Safer than write access, and not safe by itself. An agent that can read everything and reach the internet can exfiltrate everything, and a prompt injection in a document it reads can tell it to. Read-only access for an agent means reads scoped to named tools and resources, decided on every call by a policy the agent cannot edit, with an egress policy that names where the data may go and a record of what was read on whose behalf.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How do I give an AI agent prototype read-only access to production data?&lt;/strong&gt; Give the prototype an identity of its own rather than a borrowed key, hold the real credentials at an enforcement point it calls through, and write a default-deny policy that allows the read tools by name or refuses tool invocations outright. A system prompt that says “do not modify anything” holds until something in the context window says otherwise. Scope the reads to the data the pilot needs, and put the prototype in a namespace with default-deny egress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What should happen to a prototype’s access when the prototype is thrown away?&lt;/strong&gt; Its registration should be deleted, its identity revoked and any credential it held rotated, in the same change that removes the workload. Prototypes that never reach production are the ones nobody rewrites, so retirement cannot wait for the rewrite. A prototype still running after its registration is gone should be detected and treated as unknown until someone claims it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does a prototype with read-only access to customer data fall under HIPAA or GDPR?&lt;/strong&gt; Reading counts. The GDPR’s definition of processing includes “retrieval, consultation, use,” and HIPAA’s &lt;a href="https://www.ecfr.gov/current/title-45/section-160.103" rel="noopener noreferrer"&gt;definition of use&lt;/a&gt; covers the “utilization, examination, or analysis” of protected health information within the entity that holds it, whether or not anything is written back, so a prototype that reads real records is inside the regulation, as &lt;a href="https://www.tigera.io/blog/hipaa-wasnt-written-for-ai-agents-it-applies-to-them-anyway/" rel="noopener noreferrer"&gt;we mapped for HIPAA&lt;/a&gt;. Whether your pilot’s access, consent and contracts satisfy a particular regime is a question for your compliance team and, where liability is involved, for a legal opinion on your own case. A read-only token is a good engineering control and not a legal exemption.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Whose prototype is it?
&lt;/h2&gt;

&lt;p&gt;The people who built YouTube’s stack were thinking about speed, and what they shipped was a set of constraints: a proxy that could not write, a token that could not widen, a build that could not reach production. Wong’s post names the job in one sentence: “Our job is to design the bridges, read-only sandboxes, and isolated pipelines that empower teams to test wild ideas without triggering catastrophic meltdowns.” That is a sentence about security architecture, whatever heading it sits under.&lt;/p&gt;

&lt;p&gt;The post’s closing worry: “The biggest risk isn’t breaking a server with messy AI code; it’s missing the technological moment because validation loops are too slow.” Fair. The constraints above are what make a fast validation loop survivable, and they are cheaper than the review board they replace, because a prototype that cannot write does not need a meeting about what it might write.&lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap, and ask it of a named person. A prototype nobody owns is retired by whoever notices the bill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are in engineering leadership&lt;/strong&gt; , your question is about the fleet. How many AI prototypes in our clusters hold a token to live data today, how many prototypes were abandoned this quarter, and how many of their tokens were? The first number is a list someone can produce. The difference between the second and the third was never in the plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the security expert for the cluster&lt;/strong&gt; , your question is about one pod. If this prototype issued a write tonight, what would refuse it: a sentence in its prompt, or something it cannot reach? If it read everything it is allowed to read, where could that data go, and would the morning’s record show that it went there? “It only has read access” answers the first of those and none of the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the practitioner who built the prototype&lt;/strong&gt; , your question is about what you handed it. Which key is in its environment, whose account issued it, and does it stop working when the prototype does? The key pasted in from your own account to make Friday’s demo work is read-only because you asked nicely, and it will outlive the demo.&lt;/p&gt;

&lt;p&gt;If any of those answers starts with “we would need to check,” the check is what to build.&lt;/p&gt;

&lt;p&gt;YouTube rebuilt YouTube so its prototypes could fail safely. The part worth copying was never the mirror. It was the token, and what happens to it afterwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  See Lynx in action
&lt;/h2&gt;

&lt;p&gt;Tigera Lynx gives every AI agent, MCP server and LLM provider in your clusters a verifiable identity, a policy decision on every call, and a record written by the enforcement point rather than by the agent. Schedule a demo and see it on a live cluster.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;&lt;strong&gt;Request a demo of Tigera Lynx&lt;/strong&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/youtube-let-ai-prototypes-read-production-the-token-did-the-work/" rel="noopener noreferrer"&gt;YouTube Let AI Prototypes Read Production. The Token Did the Work.&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>bestpractices</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>From Merged PR to Governed Pod: Automating AI Agent Deployment on Kubernetes</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:40:00 +0000</pubDate>
      <link>https://dev.to/tigeraio/from-merged-pr-to-governed-pod-automating-ai-agent-deployment-on-kubernetes-354h</link>
      <guid>https://dev.to/tigeraio/from-merged-pr-to-governed-pod-automating-ai-agent-deployment-on-kubernetes-354h</guid>
      <description>&lt;p&gt;In short, automating the AI agent lifecycle is this year’s pitch: Google Cloud’s walkthrough of 30th July 2026 turns the whole thing into a conversation with a coding agent. On Kubernetes the deploy half of that lifecycle is already a pipeline and a set of manifests, and 2026 has shown what happens when the pipeline is the soft spot: in March a compromised GitHub Action dumped runner memory and hunted for Kubernetes tokens, and in February a GitHub issue title talked an AI triage bot into exposing a project’s publishing credentials. The pipeline that ships an agent holds more authority than the agent does, and it is the one place that can ship the agent’s permissions in the same commit as its code. This post walks the path from a merged pull request to a governed pod stage by stage, says what each stage must enforce when the workload is an agent, then says what a governance layer like Tigera Lynx can and cannot do about it. It is written for the platform and security engineers who own that pipeline, and the leads who sign off on what it deploys.&lt;/p&gt;

&lt;p&gt;On 19th March 2026, from about 17:43 UTC, an attacker holding a compromised credential force-pushed 76 of the 77 version tags in &lt;a href="https://github.com/aquasecurity/trivy/security/advisories/GHSA-69fq-xp46-6x23" rel="noopener noreferrer"&gt;aquasecurity/trivy-action&lt;/a&gt;, the GitHub Action for the Trivy vulnerability scanner, so that each tag pointed at a commit carrying credential-stealing code. Any pipeline that referenced the action by tag ran it on the next scan. By the advisory’s account the payload ran before the legitimate scan, dumped the memory of the runner’s worker process, searched 50 or more filesystem paths for SSH keys, cloud and Kubernetes credentials, Docker configs and &lt;code&gt;.env&lt;/code&gt; files, and sent what it found, encrypted, to attacker infrastructure. The window was about twelve hours, and the remediation advice is blunt: “all secrets accessible to affected pipelines must be treated as exposed and rotated immediately.”&lt;/p&gt;

&lt;p&gt;It was the second act. The advisory dates the first compromise to late February; Aqua’s own write-up says the attackers “exploited a misconfiguration in Trivy’s GitHub Actions environment, extracting a privileged access token,” and the maintainers’ &lt;a href="https://github.com/aquasecurity/trivy/discussions/10425" rel="noopener noreferrer"&gt;incident thread&lt;/a&gt; says of the rotation that followed that “the process wasn’t atomic and attackers may have been privy to refreshed tokens.” &lt;a href="https://www.infoq.com/news/2026/03/ai-bot-github-actions-exploit/" rel="noopener noreferrer"&gt;InfoQ reported on 11th March&lt;/a&gt;, citing StepSecurity’s analysis, that the February break-in belonged to a campaign run from a GitHub account describing itself as an “autonomous security research agent powered by claude-opus-4-5,” which gained code execution in five of the seven repositories it targeted, three of them through the &lt;code&gt;pull_request_target&lt;/code&gt; trigger with an untrusted checkout. GitHub’s &lt;a href="https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for that trigger says: “Avoid using this event if you need to build or run code from the pull request.”&lt;/p&gt;

&lt;p&gt;Before either act, a different pipeline had been opened by a sentence. On 9th February 2026 the researcher Adnan Khan &lt;a href="https://adnanthekhan.com/posts/clinejection/" rel="noopener noreferrer"&gt;published&lt;/a&gt; what he named Clinejection. Cline, an AI coding assistant, ran an issue-triage workflow on Anthropic’s &lt;code&gt;claude-code-action&lt;/code&gt; with Bash, Read and Write tools. “Since the issue title is interpolated directly into Claude’s prompt,” Khan wrote, a crafted title could make the agent install a package from an attacker’s fork, whose preinstall script then ran on the runner. The triage job exposed no publishing secret of its own, but it “shares the same cache scope as the high-privilege nightly release workflow,” so a poisoned cache entry handed over the npm, VS Code Marketplace and Open VSX publishing tokens. On 17th February an unauthorized &lt;code&gt;cline&lt;/code&gt; 2.3.0 appeared on npm whose only change was a postinstall script that installed a third-party AI agent; Cline said afterwards that the npm token had not been properly revoked during rotation.&lt;/p&gt;

&lt;p&gt;Set those against the pitch for automating the agent lifecycle. On 30th July 2026 Google Cloud &lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/automate-agent-development-lifecycles-with-gemini-enterprise" rel="noopener noreferrer"&gt;published a walkthrough&lt;/a&gt; in which a coding agent scaffolds, deploys, governs, evaluates and publishes an agent from a prompt. The closing line is the thesis: “Your coding agent isn’t just where you write agent code. It’s the control plane for the whole lifecycle.” That is the right ambition. Nobody should be hand-applying manifests for the fortieth agent, and Kubernetes is moving the same way: a &lt;a href="https://kubernetes.io/blog/2026/03/20/running-agents-on-kubernetes-with-agent-sandbox" rel="noopener noreferrer"&gt;Sandbox resource&lt;/a&gt; for agent workloads is in development under SIG Apps, its &lt;a href="https://cloud.google.com/blog/products/containers-kubernetes/bringing-you-agent-sandbox-on-gke-and-agent-substrate" rel="noopener noreferrer"&gt;GKE version&lt;/a&gt; went generally available on 21st May, and the CNCF’s &lt;a href="https://www.cncf.io/announcements/2026/01/20/kubernetes-established-as-the-de-facto-operating-system-for-ai-as-production-use-hits-82-in-2025-cncf-annual-cloud-native-survey/" rel="noopener noreferrer"&gt;2025 survey&lt;/a&gt;, published on 20th January 2026, found 82% of container users running Kubernetes in production. The agent is becoming a Kubernetes resource like any other, delivered by a pipeline like any other.&lt;/p&gt;

&lt;p&gt;Which is the point. A pipeline that can deploy an agent holds the cluster credential, the registry token and the cloud role, more authority than the agent will ever be granted, and in February and March that pipeline was what the attackers went for. The pipeline is part of the agent’s security boundary. It is also the one part of the boundary that can ship the agent’s permissions in the same commit as its code, if you build it that way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes in a pipeline when the workload is an AI agent?
&lt;/h2&gt;

&lt;p&gt;The YAML is mostly the same. &lt;a href="https://www.tigera.io/blog/ai-agents-on-kubernetes-101-from-laptop-script-to-production-pod/" rel="noopener noreferrer"&gt;AI Agents on Kubernetes 101&lt;/a&gt; walked one agent from a laptop script to a pod by hand and told you not to stop there. A pipeline automates those steps and adds the ones a hand-applied deployment skips. The difference is in three places.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The artifact does not contain the behavior.&lt;/strong&gt; For a web service, the image is the behavior. An agent’s behavior is the image plus a system prompt, a tool list, a model name and whatever its context window collects at runtime, and three of those four are configuration. A pipeline that reviews the image and lets the prompt change through a ConfigMap edit has reviewed the part that matters least. For an agent, a config change is a behavior change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pipeline holds what the agent must never hold.&lt;/strong&gt; The agent needs a model key. The pipeline needs a credential that can write to a namespace, push to a registry and assume a cloud role. A model key in the pipeline’s secrets is one memory dump from being public, and a kubeconfig in the agent’s environment is one prompt injection from the control plane. And an agent that runs inside the pipeline reads untrusted input with the pipeline’s authority. Khan’s lesson: “AI agents with broad tool access create a low-friction entry point into CI/CD pipelines previously only reachable through code contributions, maintainer compromise or traditional poisoned pipeline execution.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The permissions are part of the deliverable.&lt;/strong&gt; A web service’s NetworkPolicy is hygiene. An agent’s list of which endpoints it may reach, which tools it may call with which arguments and which model it may use is the specification of what the agent is. A pipeline that ships the Deployment and leaves the permissions to a ticket has shipped half an agent, and the half that acts is the half that shipped.&lt;/p&gt;

&lt;p&gt;The deploy half of the lifecycle has five stages, and each one holds something worth stealing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Stage&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What it does&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What it holds&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What an agent adds&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Build&lt;/td&gt;
&lt;td&gt;Turns the merged commit into an image&lt;/td&gt;
&lt;td&gt;Registry push token, the runner’s environment&lt;/td&gt;
&lt;td&gt;Prompt, tool list and model name are build inputs, versioned with the code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Sign and publish&lt;/td&gt;
&lt;td&gt;Signs the image, packages the chart&lt;/td&gt;
&lt;td&gt;A signing identity, the chart repository&lt;/td&gt;
&lt;td&gt;The chart carries the permissions (egress, identity, allowed calls) beside the Deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Apply&lt;/td&gt;
&lt;td&gt;A GitOps controller reconciles the chart through admission&lt;/td&gt;
&lt;td&gt;A credential that writes to the agents namespace&lt;/td&gt;
&lt;td&gt;Admission refuses an agent without limits, without egress policy, or with the service account token mounted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Register and authorize&lt;/td&gt;
&lt;td&gt;Declares who the agent is and what it may call&lt;/td&gt;
&lt;td&gt;The registry and the policy store&lt;/td&gt;
&lt;td&gt;No web-service equivalent. For an agent, this stage is the product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Verify&lt;/td&gt;
&lt;td&gt;Smoke-tests the agent, reads the record&lt;/td&gt;
&lt;td&gt;Read access to the audit trail&lt;/td&gt;
&lt;td&gt;The test asserts what the agent cannot do; the evidence comes from enforcement points&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fu9t1k0ynko6q89bgj3cb.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%2Fu9t1k0ynko6q89bgj3cb.png" alt="Diagram: five pipeline stages from merged pull request to governed pod (build, publish, apply, register, verify), what each stage holds worth stealing, and what an AI agent adds at each stage" width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: The deploy half of the lifecycle. Each stage holds a credential worth stealing, and the fourth has no web-service equivalent.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now translate that into questions an engineering team has to answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Can the agent’s behavior change without a reviewed commit?&lt;/strong&gt; If the prompt, the tool list or the model name can be edited in place, the review gate is decoration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What can the pipeline’s credential do, and for how long?&lt;/strong&gt; A stored personal access token with write scope is what moved 76 tags in March. A token minted for one run, scoped to one namespace and dead when the job ends is worth nothing to a memory dump.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does the cluster refuse?&lt;/strong&gt; If a chart drops its NetworkPolicy, mounts the service account token or runs as root, does anything say no? Hugging Face’s &lt;a href="https://huggingface.co/blog/agent-intrusion-technical-timeline" rel="noopener noreferrer"&gt;post-mortem&lt;/a&gt; of its July intrusion put the alternative in one line: “we had no admission policy rejecting privileged or hostPath pods.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One agent makes each of those an afternoon’s work. Ten agents, built by three teams on two SDKs, make it a spreadsheet nobody updates. Two hundred agents, each with its own pipeline and its own idea of where the key lives, make it a question with no owner, and the pipeline the attacker finds first is the one that answers it.&lt;/p&gt;
&lt;h2&gt;
  
  
  What must each stage enforce when the workload is an AI agent?
&lt;/h2&gt;

&lt;p&gt;Take the stages above and ask two things of each: what went wrong in a 2026 incident, and what the pipeline has to enforce so that the answer stops depending on anyone remembering.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;The stage&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What went wrong in 2026&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;So the pipeline must enforce&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workflow configuration&lt;/td&gt;
&lt;td&gt;Trivy’s February break-in came through a &lt;code&gt;pull_request_target&lt;/code&gt; workflow running untrusted code with elevated permissions; Cline’s came through an issue title fed to an AI triage agent&lt;/td&gt;
&lt;td&gt;Actions pinned to a commit SHA, no untrusted checkout under a privileged trigger, untrusted text kept out of shells and prompts, and any AI agent in the pipeline on a read-only token with no shared cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline credentials&lt;/td&gt;
&lt;td&gt;A token stolen in February survived a rotation that “wasn’t atomic” and moved 76 tags in March&lt;/td&gt;
&lt;td&gt;Short-lived credentials federated through OpenID Connect to the cloud and the cluster, nothing long-lived in repository secrets, rotation rehearsed as a runbook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artifact integrity&lt;/td&gt;
&lt;td&gt;76 of 77 tags pointed at malicious commits for about twelve hours&lt;/td&gt;
&lt;td&gt;Images and charts signed at build, referenced by digest, verified at admission; immutable releases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admission&lt;/td&gt;
&lt;td&gt;Hugging Face’s intruder went from a sandbox to node-level root within three days, with no admission policy rejecting privileged or hostPath pods&lt;/td&gt;
&lt;td&gt;An admission policy that refuses an agent pod without resource limits, with the service account token mounted, running as root, or with no egress policy selecting it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime credentials and egress&lt;/td&gt;
&lt;td&gt;Pods that “could reach the instance metadata service,” one credential shared across clusters, and in &lt;a href="https://www.tigera.io/blog/gemini-never-left-the-sandbox-the-sandbox-had-a-door/" rel="noopener noreferrer"&gt;the May evaluation incidents&lt;/a&gt; a route to the internet nobody intended&lt;/td&gt;
&lt;td&gt;Default-deny egress shipped in the chart, model keys held outside the pod and attached at an enforcement point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registration and authorization&lt;/td&gt;
&lt;td&gt;Nothing declared who the agent was or what it could call, so the only check was the model’s judgment&lt;/td&gt;
&lt;td&gt;Identity and allowed calls declared as resources in the same chart, reviewed in the same pull request, evaluated on every request by something the agent cannot edit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence&lt;/td&gt;
&lt;td&gt;Transcripts read weeks later; Trivy’s consumers learned from the advisory which secrets to assume stolen&lt;/td&gt;
&lt;td&gt;A record written by the enforcement points at the time, and a smoke test that asserts a forbidden call is refused before the release is marked good&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Foy75l52qwa9urf5h94sg.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%2Foy75l52qwa9urf5h94sg.png" alt="Diagram: a Helm chart with registration and authorization files flows through a GitOps controller, admission and a governed pod to an enforcement point, while a pod applied with kubectl from a laptop is found from the node rather than admitted" width="800" height="316"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The permissions ship in the chart. Admission refuses what the chart forgot, and the agent that skipped the pipeline is found rather than trusted.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. Nothing in it is new technology. SHA pinning and OpenID Connect federation are in &lt;a href="https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions" rel="noopener noreferrer"&gt;GitHub’s hardening guide&lt;/a&gt;. Signing is &lt;a href="https://docs.sigstore.dev/cosign/signing/overview/" rel="noopener noreferrer"&gt;cosign&lt;/a&gt;; verification at admission is a &lt;a href="https://kyverno.io/docs/policy-types/cluster-policy/verify-images/" rel="noopener noreferrer"&gt;Kyverno&lt;/a&gt; rule or Kubernetes’ own &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/" rel="noopener noreferrer"&gt;ValidatingAdmissionPolicy&lt;/a&gt;, generally available since v1.30 in April 2024. The agent-specific part is two rows: the one that treats a prompt as code, and the one that ships the agent’s permissions as a resource. Neither can be delegated to the agent, because &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;controls the agent can override are not controls&lt;/a&gt;, and neither is covered by &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;the building blocks most clusters already have&lt;/a&gt;, which see pods, addresses and roles rather than agents.&lt;/p&gt;

&lt;p&gt;Run March through the table and notice what the payload was looking for. It hunted for Kubernetes tokens because a kubeconfig in a pipeline is the shortest path to a cluster. A pipeline whose only cluster credential is minted for the run and dead at the end of it gives a memory dump nothing to carry away, and a cluster whose admission policy refuses a privileged pod gives whatever is carried away nothing to do. Row two protects the pipeline. Rows four to six protect the cluster from the pipeline.&lt;/p&gt;

&lt;p&gt;In practice the workflow side is short: the job grants itself an OpenID Connect token (&lt;code&gt;id-token: write&lt;/code&gt;) instead of storing a cloud key, references every action by full commit SHA, signs the image with cosign and pushes the chart to the same registry as an OCI artifact, by digest. The chart side is where the agent differs, because the permissions sit beside the Deployment and a reviewer sees both in one diff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;charts/support-agent/templates/
  deployment.yaml # non-root, limits, probes, no service account token
  service.yaml
  networkpolicy.yaml # deny all egress, then DNS and the enforcement point
  serviceaccount.yaml # the identity the agent presents
  registration.yaml # who the agent is and what it serves
  authorization.yaml # what it may call; absent means nothing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cluster then refuses what the chart forgot. A validating admission policy bound to the agents namespaces rejects, in three CEL expressions, a pod that mounts the service account token, sets no resource limits or runs as root. The one check it cannot make is whether an egress NetworkPolicy selects the pod, because it sees only the object being admitted. That needs an engine that can look across resources, which is where Kyverno earns its place, and it is the check that would have closed the door in May.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when it is done properly?
&lt;/h2&gt;

&lt;p&gt;Here is what a governance layer like &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; does for the table above, and what it leaves to you. Both halves matter.&lt;/p&gt;

&lt;p&gt;Done properly, the last three rows stop being a ticket and become files in the chart. Every agent, MCP server and LLM provider is a Kubernetes custom resource, so the agent’s registration, its identity (SPIFFE, OIDC, or a pod-owner binding for an agent you cannot modify) and the policy that says what it may call are YAML in the same chart as its Deployment, reviewed, applied and rolled back with the code. Authorization runs at a gateway the agent does not control: default deny, evaluated on every request, with the caller’s identity, the target and the operation as context, and for MCP traffic the tool name and its arguments. A fresh install permits nothing until a policy says otherwise, so a chart that forgets its authorization file ships an agent whose calls are refused, which is the right failure. Provider credentials are held at the gateway, referenced from one Secret and injected after the policy check passes, so the model key need not appear in the image, the chart or the pod, and each token the gateway mints is addressed to one destination. The pipeline itself can be registered as a service identity, so the smoke test in stage five calls the agent through the gateway as a named caller. A sandbox policy, enforced in the kernel, names the paths, binaries and destinations a workload may use, and applies to a running workload without a redeploy. Workloads nobody registered are detected from the node itself and classified as sanctioned, shadow or unknown. And every request lands in the Agent Trail with the caller, the target, the policy decision and the model that served the call, written by the enforcement plane rather than narrated by the agent.&lt;/p&gt;

&lt;p&gt;Now the other half. None of that is automatic, and the first four rows of the table are not Lynx’s job at all. Lynx does not pin your actions, federate your CI to your cloud, sign your images or write your admission policy; that is work you do before the first agent resource is applied, and a governance layer behind a pipeline that still holds a long-lived kubeconfig is a well-governed cluster with an open front door. A policy that permits everything proves nothing, and someone has to write the one that does not; the pull request that adds a &lt;code&gt;permit&lt;/code&gt; line needs a reviewer who reads it as carefully as the code, because the chart has made permissions reviewable, not reviewed. The gateway governs the traffic that reaches it, and closing the other roads is NetworkPolicy work in your chart; Peter Kelly’s &lt;a href="https://www.tigera.io/blog/multi-layer-policy-for-securing-ai-agents/" rel="noopener noreferrer"&gt;multi-layer policy post&lt;/a&gt; covers how the gateway and kernel layers fit. The detector finds the agent that arrived by &lt;code&gt;kubectl&lt;/code&gt; from a laptop, but a person decides whether it is sanctioned. What the infrastructure provides is the layer the pipeline quietly assumes exists: the ability to say, with evidence, which agents you have, what each one may call, and what each one did.&lt;/p&gt;

&lt;p&gt;Put in properly, the agent’s permissions reach production the way its code does: in a commit, with a reviewer’s name on it, and with a rollback one revert away. Put in badly, the pipeline is automated, the permissions are a ticket, and the agent is live before the ticket is.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What is the AI agent deployment lifecycle on Kubernetes?&lt;/strong&gt; It is the path from a merged commit to a pod serving traffic under policy: build the image, sign and publish it with its chart, let a GitOps controller apply the chart through admission control, register the agent’s identity and allowed calls, and verify the result against a record written by the enforcement points. What makes it agent-specific is that the prompt, tool list and model are versioned with the code, and the permissions ship in the same chart as the Deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can I run a coding agent inside my CI pipeline safely?&lt;/strong&gt; Only with the pipeline’s authority cut down to what the agent needs: a read-only token, no access to a job that holds publishing or cluster credentials, no Actions cache shared with a release job, and no untrusted text such as an issue title or a pull request body in its prompt unless it is treated as hostile. Clinejection is the worked example of every one of those being skipped. Coding agents that run outside the pipeline but touch your clusters raise the same questions; &lt;a href="https://www.tigera.io/blog/managing-claude-code-sessions-through-lynx/" rel="noopener noreferrer"&gt;Peter Kelly’s post on Claude Code sessions&lt;/a&gt; covers putting them behind the gateway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Should the agent’s system prompt and tool list go through the same pipeline as its code?&lt;/strong&gt; Yes. For an agent the prompt and the tool list are most of the behavior, so an edit to either gets the same review, tests and rollback path as a code change. Keep them in the repository, build them into the image or the chart, and treat a live edit to a ConfigMap as drift to revert rather than as configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What should admission control refuse for an AI agent pod?&lt;/strong&gt; At minimum: the service account token mounted, no resource limits, a root user, a privileged security context or a hostPath mount, an unsigned image, and an image referenced by a mutable tag. Then add a check that an egress NetworkPolicy selects the pod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the pipeline’s record enough evidence for an auditor or a regulator?&lt;/strong&gt; It is the part they ask for first: who approved the change, which commit built the image, what policy the agent was given. It is not the whole record. Whether it satisfies a particular regime, HIPAA, the EU Cyber Resilience Act or your own sector’s rules, is a question for your compliance team and, where liability is involved, for a legal opinion on your own case. The other half is a record of what the agent did at runtime, written by the enforcement points; we mapped what &lt;a href="https://www.tigera.io/blog/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock/" rel="noopener noreferrer"&gt;the CRA’s 24-hour clock&lt;/a&gt; asks of it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Whose pipeline is it?
&lt;/h2&gt;

&lt;p&gt;The people who built Trivy’s release automation were thinking about shipping a scanner, and for years it shipped. The attackers in February were thinking about the automation, and they found a workflow trigger documented as unsafe for untrusted code running untrusted code with a token that could rewrite the repository. The second time, in March, they did not need a new way in. The first rotation had left one of their keys valid.&lt;/p&gt;

&lt;p&gt;Nothing in that story is specific to AI agents, and that is why it matters for them: agents arrive in clusters through pipelines built for web services, and the pipeline’s blind spots become the agent’s. What differs is what the agent does with its freedom once it is there, and that is what the pipeline can now ship: an identity, a list of allowed calls, an egress policy, a sandbox, in the same commit as the code.&lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap, and ask it of a named person. A pipeline nobody owns is maintained by whoever opens the next pull request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the CISO, the VP of Engineering or the head of platform&lt;/strong&gt; , your question is about the fleet. How many agents reached production this quarter, through how many pipelines, and how many of those pipelines hold a credential that would still work tomorrow if it were dumped from a runner today? The honest answer has two numbers in it, and the second one was never in the plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the platform or security engineer who runs the cluster&lt;/strong&gt; , your question is about one chart. If the next release of this agent dropped its NetworkPolicy, mounted the service account token and changed its system prompt, which of the three would the cluster refuse, which would a reviewer catch, and which would be live before anyone noticed? “The pipeline is automated” answers none of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you built the agent&lt;/strong&gt; , your question is about what you put in the chart. Where is the model key, which endpoints and tools did you declare, and which of those can change without a pull request with your name on it? The value you pasted into a ConfigMap to get the demo working is the one that ships.&lt;/p&gt;

&lt;p&gt;If any of those answers starts with “we would need to check,” the check is what to build.&lt;/p&gt;

&lt;p&gt;In February and March the pipeline was the way in. Built properly, it is also the one place to say no before the agent ever runs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request early access at &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/?product=lynx&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/from-merged-pr-to-governed-pod-automating-ai-agent-deployment-on-kubernetes/" rel="noopener noreferrer"&gt;From Merged PR to Governed Pod: Automating AI Agent Deployment on Kubernetes&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>bestpractices</category>
      <category>aiagentsecurity</category>
      <category>howto</category>
    </item>
    <item>
      <title>Gemini Never Left the Sandbox. The Sandbox Had a Door.</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Wed, 07 Oct 2026 16:41:08 +0000</pubDate>
      <link>https://dev.to/tigeraio/gemini-never-left-the-sandbox-the-sandbox-had-a-door-34n0</link>
      <guid>https://dev.to/tigeraio/gemini-never-left-the-sandbox-the-sandbox-had-a-door-34n0</guid>
      <description>&lt;p&gt;&lt;strong&gt;In short&lt;/strong&gt; , in May 2026 a Gemini model under evaluation by the AI security firm Irregular reached the systems of three real companies, and the incident has been reported as a breakout. By Google’s own account it was nothing of the kind. The test environment had internet access it was not meant to have, the fictional target shared its name with a real company, and the model found public information online, guessed one password and found two more in public code repositories. No kernel exploit, container escape or hypervisor bug has been reported. The process stayed inside its box; its traffic walked out through a door the infrastructure left open. This post takes the incident apart boundary by boundary, maps what was open in May onto what agent infrastructure has to provide, then says what a governance layer like Tigera Lynx can and cannot do about it. It is written for the platform and security leaders who run agents with a shell, credentials and a network, which is most of them.&lt;/p&gt;

&lt;p&gt;On 18th September 2026, The Wall Street Journal reported that a Gemini model had accessed three real companies during a cybersecurity evaluation run by Irregular, and &lt;a href="https://www.securityweek.com/google-confirms-gemini-ai-breached-three-firms/" rel="noopener noreferrer"&gt;Google confirmed it&lt;/a&gt;. The test took place in May. It was a capture-the-flag exercise: the model was told to extract information from a fictional company’s software inside a controlled environment. The fictional company’s name belonged to a real one, and the environment had a route to the public internet that nobody intended. In one case the model guessed passwords until one worked. In the other two it searched the web, found credentials in public repositories and used them. Heather Adkins, Google’s vice president of security engineering, &lt;a href="https://www.cybersecuritydive.com/news/google-ai-gemini-autonomous-hacks/830884/" rel="noopener noreferrer"&gt;put it this way&lt;/a&gt;: “In a standard evaluation, the model found public information online and guessed credentials to access websites it thought were part of the test. In all three of these instances, the model stopped.” Irregular notified Google at the end of July, Google says it made sure the three companies knew, and the incident became public seven weeks after that, when the Journal asked.&lt;/p&gt;

&lt;p&gt;Google was not the only lab to publish such an account in recent months. On 30th July, &lt;a href="https://www.anthropic.com/news/investigating-incidents-cybersecurity-evals" rel="noopener noreferrer"&gt;Anthropic described three incidents&lt;/a&gt; in which Claude models reached real systems during evaluations run by the same partner. In one, “the fictional target company chosen by our evaluation partner shared a name with an active website domain name,” and throughout, “a misconfiguration left the machines that Claude accessed as part of the evaluation with live internet access.” On 14th August, &lt;a href="https://research.meta.ai/blog/addressing-third-party-testing-misconfiguration-muse-spark-1-1" rel="noopener noreferrer"&gt;Meta said&lt;/a&gt; a pre-release Muse Spark model had exploited a vulnerability in a real website and changed its database, after “a misconfiguration allowed the model to access the open internet” and Irregular “unintentionally provided the model with a name of a real website as its target.” Irregular, for its part, &lt;a href="https://www.axios.com/2026/09/19/google-safety-incidents-testing-hacks" rel="noopener noreferrer"&gt;told Axios&lt;/a&gt; in September that “all known issues on our end were remedied and resolved weeks ago.”&lt;/p&gt;

&lt;p&gt;None of this is carelessness of the kind that deserves a lecture. Finding out what a frontier model can do to a network is exactly the work these labs should be doing, the environments were built by people who think about containment for a living, and Irregular says its fixes were in place weeks before September. The uncomfortable part is elsewhere. Three well-resourced evaluation programs reached the same place by the same path, and in each of Google’s three cases the thing that ended the intrusion was the model deciding to stop.&lt;/p&gt;

&lt;p&gt;Six days after the Journal’s report, Kavi Daula at Edera, a company that sells hardware-isolated runtimes, published &lt;a href="https://edera.dev/stories/how-edera-could-have-contained-the-gemini-breakout" rel="noopener noreferrer"&gt;a reading of the incident&lt;/a&gt; that begins by declining to take the win. “There was no reported Linux kernel exploit, container escape, hypervisor vulnerability, namespace breakout, or some new class of AI-specific exploit. The agent had a network path to real systems, found credentials those systems accepted, and used them.” An Edera zone with unrestricted egress, the post concedes, would still have had unrestricted egress.&lt;/p&gt;

&lt;p&gt;That is the right place to start, and it is where a lot of production agent deployments stand today. The agent did not break out. Its packets walked out, through a door the infrastructure left open, carrying keys it found lying in the street. If your agents run in a sandbox and that is where your comfort comes from, this post is about the door.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What actually failed in May?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Call the whole thing a sandbox failure and you hide several controls that each had a separate job. Edera’s post splits them into compute, network, identity and credential exposure; I will keep that split and add the one that decides whether you ever find out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The compute boundary&lt;/strong&gt; decides what happens if the agent gets root or breaks the kernel it runs on. It held. Nothing in any of the reports suggests the model touched the host or a neighboring workload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The network boundary&lt;/strong&gt; decides which destinations the agent can reach. It was open. The environment had a route to the internet, and a resolver that answered for a real company’s name. Edera’s line on this is the one to remember: “The node having a route to something does not mean every agent running on that node needs the same route.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The identity and credential boundary&lt;/strong&gt; decides who the agent is when it arrives somewhere, and what authority it can carry with it. It did not exist. The agent was whoever’s password it could guess or find. None of those credentials were issued to the agent, none were scoped to the exercise, and none expired when the exercise did.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The evidence boundary&lt;/strong&gt; decides how you know what happened and when. Google learned of the May incidents from Irregular at the end of July. Much of what is known about what the models did comes from their own transcripts, which is the agent’s account of itself.&lt;/p&gt;

&lt;p&gt;Read those four again and notice which one failed. The sandbox kept the process in, which is the half of its job it was configured to do. Its network side was configured open, and everything after the first packet happened in layers a sandbox does not provide: identity, credentials, operation checks, the record. As Edera puts it, “A process can remain fully contained inside its own PID namespace, mount namespace, filesystem, kernel, and memory while opening a TCP connection to a production system somewhere else.”&lt;/p&gt;

&lt;p&gt;Hugging Face’s July intrusion, where OpenAI’s evaluation agents did get out of their sandbox, &lt;a href="https://huggingface.co/blog/agent-intrusion-technical-timeline" rel="noopener noreferrer"&gt;makes the same point from the other side&lt;/a&gt;. The way out was a zero-day in a package proxy cache. Everything after that came from the ordinary list: an instance metadata service reachable from pods, overly broad access, long-lived credentials, and no admission policy rejecting privileged pods. Escape or no escape, the damage is done by the route, the credential and the scope.&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%2Fuuz91a2zogxf0w71pdoc.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%2Fuuz91a2zogxf0w71pdoc.png" width="800" height="340"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: The process never left. The connection, the name lookup and the credentials did, and nothing on that path was checked by anything other than the model.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why does a sandbox feel like enough?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Because it is the control we know how to build and test. Containers, gVisor, Kata, Firecracker, Edera’s zones: a decade of work has gone into stopping hostile code from taking over the machine it runs on, and that work is good. If a workload is going to run arbitrary code, you put it behind one of these, and you should.&lt;/p&gt;

&lt;p&gt;An agent is a different kind of tenant. The things you hand it so it can do its job are an attacker’s toolkit: a shell, a Python interpreter, a package manager, git, a browser, a cloud CLI, a Kubernetes client, and whatever tokens its author pasted into its environment. Its control flow is decided at runtime by a model, from whatever lands in its context window, so you cannot review what it will do, only what it is allowed to do. We made that argument in &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;the safest place to run an AI agent&lt;/a&gt;: controls the agent can override are not controls. A system prompt that says “the target is fictional and you have no internet access” is an instruction, and in Irregular’s environment the instruction was wrong on both counts.&lt;/p&gt;

&lt;p&gt;So the question most sandbox hardening answers, “can this process take over the host,” is not the first question for an agent. The first question is: where can this process reach, as whom, and would I know? A sandbox can answer the first of those, if someone configures it to. It cannot answer the other two. The May incident answers all three. Anywhere, because the node had a route and nothing said this agent should not share it. As anyone whose password it could guess or find. And in July.&lt;/p&gt;

&lt;p&gt;When NVIDIA released OpenShell, we wrote that &lt;a href="https://www.tigera.io/blog/nvidia-openshell-secures-the-agent-who-governs-the-fleet/" rel="noopener noreferrer"&gt;it secures the agent and leaves the fleet ungoverned&lt;/a&gt;, a boundary NVIDIA drew on purpose. Irregular’s environment shows the same altitude problem from the other direction. You can isolate a box well and have said nothing about its door, and a fleet is two hundred boxes with two hundred doors.&lt;/p&gt;

&lt;p&gt;One evaluation sandbox, run by specialists who fixed it once the problem was reported, produced three intrusions. Now count yours. Ten agents, from three teams, each in its own container with its own environment variables and its own idea of what it may reach. Two hundred agents, some built in a vendor’s visual builder and some promoted from a notebook, each with a route to the internet because the cluster has one, each holding whatever token made the demo work. In a lab, a fictional name that matches a real company is an unlucky coincidence. In a fleet, a prompt that mentions a real customer’s domain is Tuesday.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What would have contained it?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Take the boundaries from the previous section and ask two things of each: what was open in May, and what infrastructure has to provide so that the answer does not depend on the model.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;The boundary&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What was open in May&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;So the infrastructure must provide&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compute: what the process can do to its host&lt;/td&gt;
&lt;td&gt;Nothing reported. The isolation held&lt;/td&gt;
&lt;td&gt;Kernel-level isolation for any agent with a shell: a hardened runtime class or a separate kernel per workload. Keep it. It is necessary and it is not what failed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network: where the process can reach&lt;/td&gt;
&lt;td&gt;A route to the public internet, and a resolver that answered for a real company’s name&lt;/td&gt;
&lt;td&gt;Deny-by-default egress enforced outside the agent, with destinations allowed one at a time and a DNS path the operator controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity: who the agent is when it arrives&lt;/td&gt;
&lt;td&gt;Nothing. The agent was whoever’s credentials it held&lt;/td&gt;
&lt;td&gt;A verifiable workload identity issued to the agent by infrastructure, so a destination you control can tell a registered agent from a process holding a found password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credentials: what authority the agent can carry away&lt;/td&gt;
&lt;td&gt;Whatever it could guess or find, with no scope and no expiry&lt;/td&gt;
&lt;td&gt;Credentials held outside the agent and attached at the enforcement point, each short-lived and addressed to one destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations: what the agent may do once connected&lt;/td&gt;
&lt;td&gt;The task said “extract information.” Nothing checked each action against that&lt;/td&gt;
&lt;td&gt;Per-request authorization at a gateway the agent does not control, with the caller, the target and the operation as context, and for MCP traffic the tool and its arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence: how you know what happened&lt;/td&gt;
&lt;td&gt;Transcripts, read two months later&lt;/td&gt;
&lt;td&gt;A record written by the enforcement points, at the time, that the agent cannot edit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fgy61hzldzi0e2p2urd41.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%2Fgy61hzldzi0e2p2urd41.png" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The same table drawn around one agent. Each boundary is enforced by something the agent cannot negotiate with, and the record is written by those enforcement points rather than by the agent.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. Nothing in it asks the model to remember that a company is fictional, and nothing in it is a property of the model at all. Every row is a control that sits outside the agent, which is the only place a control for an agent can sit. The tools most clusters already have cover parts of it. &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;NetworkPolicy, API gateways and RBAC&lt;/a&gt; each take a row or half a row, and none of them gives an agent an identity of its own, checks the operation on every request, or writes the record.&lt;/p&gt;

&lt;p&gt;Now run May through the table, and notice that the rows do different jobs. Row two protects systems you do not own. With egress limited to the exercise’s own address range, the resolver never answers for the real company and the connection never opens; the incident ends before it begins. Rows three and four protect systems you do own. A service that accepts only tokens issued to a registered agent cannot be opened with a guessed password, and an agent that never held a long-lived credential has nothing to carry away. Row six is what lets you say which of those happened, in May rather than July.&lt;/p&gt;

&lt;p&gt;Edera’s post ends on the right sentence: “I do not want the security of an agent platform to depend on the model remembering that a company is fictional, correctly deciding whether a credential is in scope, or voluntarily refusing to connect to an address the infrastructure already allows it to reach.” Neither should you. Google’s model stopped in all three cases, and that is the point: the stopping is a property of the model that week. The door is a property of your infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What happens when it is done properly?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here is what a governance layer like &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; does for the table above, and what it leaves to you. Both halves matter.&lt;/p&gt;

&lt;p&gt;Done properly, every agent, MCP server and LLM provider in the cluster is registered and carries a verifiable identity (SPIFFE, OIDC, or a pod-owner binding for agents you cannot modify), so a destination behind the gateway can tell a registered agent from a process presenting a password it found. Authorization runs at a gateway the agent does not control: default deny, evaluated on every request, with the caller’s identity, the target and the operation as context; for MCP traffic the policy can see the method, the tool name and the tool arguments, so “extract information” can be the only thing an agent is allowed to do rather than the only thing it was asked to do. Provider credentials are held at the gateway and injected after the policy check passes, so the agent never holds the key it would otherwise carry out of the box, and each token the gateway mints is addressed to one destination, so a token lifted from one hop is worthless at the next. Workloads nobody registered are detected from the node itself, by watching for connections to LLM endpoints (including a watchlist of your own self-hosted ones) and inspecting running processes for agent frameworks, then classified as sanctioned, shadow or unknown with the evidence shown beside the verdict; a workload that should not be there can be quarantined at the gateway and in the kernel, so it can no longer write to disk, launch processes or open an outbound connection. The same detector ships as a package for plain Linux hosts. And every request lands in the Agent Trail with the caller, the target, the policy decision and the model that actually served the call, written by the enforcement plane rather than narrated by the agent. That is rows three to six of the table, recorded in May rather than discovered in July.&lt;/p&gt;

&lt;p&gt;Now the other half. None of that is automatic, and two rows of the table are not Lynx’s job at all. Row one, compute isolation, belongs to the runtime: gVisor, Kata, a hardware-isolated zone, whichever your platform team trusts for workloads that run code they did not write. Keep it. Row two, egress, belongs to network policy. A gateway governs the traffic that reaches it, and closing the other roads so that the only way out of the pod is through the gateway is work you do in Kubernetes network policy before the first agent ships; Peter Kelly’s &lt;a href="https://www.tigera.io/blog/multi-layer-policy-for-securing-ai-agents/" rel="noopener noreferrer"&gt;multi-layer policy post&lt;/a&gt; covers how the gateway and the kernel layers fit. Someone has to register the agents and decide what each one may call, and a policy that allows everything is a policy that proves nothing. The detector finds unregistered agents, but a person decides whether each one is sanctioned. And a record is only as complete as the enforcement points it is written from. What the infrastructure provides is the layer the sandbox quietly assumes exists: the ability to say, with evidence, which agents you have, where each one can reach, as whom, and what each one did.&lt;/p&gt;

&lt;p&gt;Put in properly, an agent that resolves a real company’s name gets a refused connection and a line in the record, and the exercise ends with a bug report instead of a disclosure. Put in badly, you have a sandbox and a dashboard, and the door is still open.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Did Gemini escape its sandbox?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Not in the sense the word usually carries. Google says the model found public information online and guessed credentials to access websites it thought were part of the test, and no kernel exploit, container escape or hypervisor vulnerability has been reported. The test environment had internet access it was not meant to have. The process stayed inside the sandbox; its network traffic left.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What is the difference between a sandbox and a security boundary for an AI agent?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A sandbox is an isolated environment: its own processes, its own filesystem and, if someone configures it, its own network. It answers what the process can do where it runs. In the May tests the process and filesystem isolation held and the network side was configured open, which is the door. Beyond that, an agent needs an identity boundary (who it is when it arrives), a credential boundary (what authority it carries), an authorization boundary (what it may do on each request) and an evidence boundary (how you know). A sandbox does not provide those. They have to be enforced outside the agent and independently of each other.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Why was internet access the problem if the agent was told to attack a target?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Because the authorization lived in the prompt, and the prompt named a company that also existed in the real world. Nothing in the infrastructure limited the agent to the exercise’s address range, so the only thing separating the fictional target from the real one was the model’s interpretation. Egress policy that allows only the exercise’s own range makes that interpretation irrelevant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would workload identity have stopped the Gemini intrusions?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Not on its own, because the three companies were not expecting an agent and had no identity to check. Identity protects destinations you control: a service that accepts only tokens issued to a registered agent cannot be opened with a guessed password. For destinations you do not control, egress policy is the control. The two together are what “contained” means.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Does this apply to agents that are not doing security testing?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, and more so. An evaluation agent is told to attack something. A coding or operations agent is told to help, and does so with the same shell, the same credentials and the same route to the internet. An ordinary agent with a route out and a credential it found in its environment is one prompt injection away from the same path, with nobody watching the transcript.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Is a transcript enough evidence of what an agent did?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. A transcript is the agent’s account of itself, and Anthropic’s report describes a model that recognized a real system and concluded that the real company must be part of the exercise. Evidence of what an agent did comes from the enforcement points it passed through: the resolver, the egress policy, the gateway’s authorization decision, the token that was issued, the connection that was refused. If you ship agents to customers in the EU, &lt;a href="https://www.tigera.io/blog/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock/" rel="noopener noreferrer"&gt;the Cyber Resilience Act’s 24-hour clock&lt;/a&gt; runs from reliable evidence of exploitation, and a transcript read two months later is not that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Who is responsible when an agent reaches a real system during a test?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
That is a legal question, and the answer depends on your contracts, your jurisdiction and what the agent did, so get an opinion on your own case. The engineering answer is simpler. Whoever gave the agent the route out and the credentials it carried is the party who could have prevented it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Whose question is it?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The people who built Irregular’s environment were thinking about what a frontier model could do to a target, and the sandbox they built around the model did its job. The controls around the sandbox were not there, and each lab learned what had happened after the fact, rather than from anything the infrastructure refused at the time.&lt;/p&gt;

&lt;p&gt;Google’s model stopped in all three cases. One of Anthropic’s did not. The difference was the model’s judgment on the day, and a control that depends on the model’s judgment is not a control. It is a transcript you read afterwards.&lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap, and ask it of a named person. A question nobody owns gets answered by the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the CISO, the VP of Engineering or the head of platform&lt;/strong&gt; , your question is about the fleet. How many agents are running in our clusters, who owns each one, and for which of them can we say today, from a record rather than a diagram, where it can reach and as whom? The honest answer is a number and a list, and the interesting part is the difference between them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are the platform or security engineer who runs the cluster&lt;/strong&gt; , your question is about one pod. If this agent resolved a hostname it was never meant to, tonight, would anything other than the model stop it? Is its egress deny by default, does it hold a credential it could leak, does its traffic pass an enforcement point that checks the operation, and would tomorrow morning’s record show the attempt? “The sandbox is hardened” answers one of those four.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you built the agent&lt;/strong&gt; , your question is about what you handed it. Which tokens sit in its environment, where did they come from, when do they expire, and what else do they open? A token pasted in to make the demo work is exactly what an agent carries out of the box.&lt;/p&gt;

&lt;p&gt;If any of those answers starts with “we would need to check,” the check is what to build.&lt;/p&gt;

&lt;p&gt;The agent never left the sandbox. Everything that mattered did.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read&lt;/em&gt; &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;&lt;em&gt;How Lynx Works&lt;/em&gt;&lt;/a&gt; &lt;em&gt;or request early access at&lt;/em&gt; &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;&lt;em&gt;tigera.io/demo/?product=lynx&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/gemini-never-left-the-sandbox-the-sandbox-had-a-door/" rel="noopener noreferrer"&gt;Gemini Never Left the Sandbox. The Sandbox Had a Door.&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>EU Cyber Resilience Act: Europe Just Put Your AI Agents on a 24-Hour Clock</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Mon, 05 Oct 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/tigeraio/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock-27c6</link>
      <guid>https://dev.to/tigeraio/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock-27c6</guid>
      <description>&lt;p&gt;&lt;strong&gt;In short&lt;/strong&gt; , the EU Cyber Resilience Act (CRA) puts binding cybersecurity requirements on any software sold as a product in the EU, and it does not carve out AI agents. Since 11th September 2026, any company that sells software with digital elements into the EU has 24 hours from learning that a vulnerability is being exploited to file an early warning with a national CSIRT and ENISA, 72 hours to describe it, and 14 days to report what it did about it. From December 2027 the product itself must be secure by design: least privilege, access control, data minimisation, a small attack surface, and a record of what it did. Agents, MCP servers, and AI gateways shipped to European customers are software with digital elements. This post maps the CRA’s clock and its secure-by-design list onto what agent infrastructure has to provide, then says what a governance layer like Tigera Lynx can and cannot do about it. It is written for the platform and security leaders who will be asked to file the report.&lt;/p&gt;

&lt;p&gt;On 2nd September 2026, CISA added seven vulnerabilities to its Known Exploited Vulnerabilities catalog. Three were in AI infrastructure, and one of them sat in the Model Context Protocol endpoint of an AI gateway. &lt;a href="https://github.com/advisories/GHSA-7488-6r32-c95q" rel="noopener noreferrer"&gt;CVE-2026-59822&lt;/a&gt; in LiteLLM, a popular open source AI gateway, let anyone with a made-up Bearer token open an authenticated MCP session: list the configured tools, call them, and reach whatever internal systems those tools reached. Wiz, which found the bug, &lt;a href="https://www.wiz.io/blog/ai-infrastructure-honeypot" rel="noopener noreferrer"&gt;watched attackers exploit it in honeypots&lt;/a&gt; over the summer, probing with a Bearer token of a single character and walking the model list. The patch had shipped in May. The &lt;a href="https://thehackernews.com/2026/09/cisa-adds-seven-exploited-flaws-as.html" rel="noopener noreferrer"&gt;seven additions&lt;/a&gt; came with reverse shells, crypto miners, and a workflow engine running attacker commands as root.&lt;/p&gt;

&lt;p&gt;Nine days later, on 11th September, the &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/cra-reporting" rel="noopener noreferrer"&gt;reporting obligations&lt;/a&gt; of the EU Cyber Resilience Act became mandatory. The Commission’s &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/cyber-resilience-act" rel="noopener noreferrer"&gt;one-line summary&lt;/a&gt; of what the law does is that it “introduces mandatory cybersecurity requirements for manufacturers, covering the planning, design, development and maintenance” of digital products. Secure by design, in other words, as a legal duty rather than a slogan. Read that against the LiteLLM story. A gateway whose authentication fell back to an empty identity when the key check failed is the opposite of secure by default, and it was being exploited in the wild for weeks before it reached anyone’s must-patch list.&lt;/p&gt;

&lt;p&gt;Had the calendar run the other way, with the CRA in force first and the exploitation discovered after, the question for every company that shipped that gateway to a European customer would not have been “do we patch.” It would have been: which of our products contain it, which customers in which member states run it, what did the attackers touch, and can we say all of that to a regulator by this time tomorrow.&lt;/p&gt;

&lt;p&gt;Most AI agent fleets could not answer that in 24 days, let alone 24 hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does the Cyber Resilience Act apply to AI agents?
&lt;/h2&gt;

&lt;p&gt;Yes, and it needs no AI chapter to do it: the law attaches to the thing, not to the technology inside it. &lt;a href="https://eur-lex.europa.eu/eli/reg/2024/2847/oj" rel="noopener noreferrer"&gt;Regulation (EU) 2024/2847&lt;/a&gt; covers every “product with digital elements” made available on the EU market, which Article 3 defines as “a software or hardware product and its remote data processing solutions, including software or hardware components being placed on the market separately.” An agent you sell, an MCP server you ship, a gateway your customers install, a Helm chart with a support contract: each is a software product with a data connection, and that is the whole test. The Commission’s &lt;a href="https://digital-strategy.ec.europa.eu/en/library/commission-publishes-new-guidance-support-timely-cyber-resilience-act-implementation" rel="noopener noreferrer"&gt;guidance of 27 July 2026&lt;/a&gt; runs to 67 worked examples and mentions AI twice in passing, once to cite the AI Act and once about AI-powered services. Agents, MCP and language models do not appear at all. There is no agent exemption to look for, because none was written.&lt;/p&gt;

&lt;p&gt;Three boundaries matter, and they are the ones people get wrong:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Software as a service is mostly out, until it is part of a product.&lt;/strong&gt; A purely hosted service that customers reach through a browser is regulated by NIS2, not the CRA. But the CRA pulls in “remote data processing” that a product depends on: processing at a distance “designed and developed by the manufacturer, or under the responsibility of the manufacturer, and the absence of which would prevent the product with digital elements from performing one of its functions.” An agent your customer installs that cannot run without your hosted planning service is one product, and the hosted half comes with it. &lt;a href="https://www.dlapiper.com/en/insights/publications/2026/02/cyber-resilience-act-the-fine-line-between-saas-and-digital-products" rel="noopener noreferrer"&gt;DLA Piper’s reading&lt;/a&gt; of the boundary is that the decisive question is whether it is placed on the market as a product rather than a service, not which technology it uses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open source is out unless it is commercial.&lt;/strong&gt; Free software developed outside a commercial activity is excluded. Once you monetize it, support it under contract, or embed it in something you sell, the manufacturer obligations are yours, including due diligence on every component you pulled in. Foundations and companies that steward open source projects on a sustained basis get a lighter regime as “open-source software stewards,” with a cybersecurity policy, cooperation duties, reporting from December 2027, and no fines. OpenSSF’s &lt;a href="https://openssf.org/public-policy/eu-cyber-resilience-act/" rel="noopener noreferrer"&gt;CRA resources&lt;/a&gt;, including its guide for developers and its stewards playbook, are the clearest map of that seam. For most companies reading this, the relevant fact is simpler: the LiteLLM in your product is your problem, not LiteLLM’s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using agents internally is not manufacturing.&lt;/strong&gt; The CRA regulates the party that places the product on the market. An enterprise running agents for its own staff is a user, not a manufacturer, unless it sells the result. But users are not outside the story. Article 14 requires manufacturers to inform impacted users of exploited vulnerabilities and, where necessary, of the mitigations. When that notice lands, the question moves to you: which of your agents run the affected component, and what did they have access to. Same inventory problem, other side of the table.&lt;/p&gt;

&lt;p&gt;The dates, from the &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/cra-summary" rel="noopener noreferrer"&gt;Commission’s summary&lt;/a&gt;: in force since 10 December 2024, reporting mandatory since 11th September 2026, and the full product requirements from 11 December 2027, applying to products already on the market as well as new ones. The fines top out at EUR 15 million or 2.5% of worldwide turnover for failing the essential requirements or the reporting duties. Article 12 adds one more link that matters for this audience: a product that is also a high-risk AI system under the AI Act is deemed to meet that law’s cybersecurity requirement when it meets the CRA’s, so for the agents that fall under both, the CRA’s Annex I is the list you build to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the 24-hour clock actually require?
&lt;/h2&gt;

&lt;p&gt;Article 14 gives a manufacturer three deadlines, twice over: once for an actively exploited vulnerability, once for a severe incident. An actively exploited vulnerability is one for which there is “reliable evidence that a malicious actor has exploited it in a system without permission of the system owner.” A severe incident is one that “negatively affects” the product’s ability to protect the availability, authenticity, integrity, or confidentiality of data or functions, or lets malicious code in.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Deadline&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Exploited vulnerability&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Severe incident&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;24 hours from awareness&lt;/td&gt;
&lt;td&gt;Early warning: that exploitation is happening, and in which member states the product is available&lt;/td&gt;
&lt;td&gt;Early warning: that an incident has occurred, and whether unlawful or malicious acts are suspected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;72 hours&lt;/td&gt;
&lt;td&gt;The product affected, the general nature of the exploit and the vulnerability, and any corrective or mitigating measures taken or available&lt;/td&gt;
&lt;td&gt;The nature of the incident, an initial assessment, and measures taken&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final&lt;/td&gt;
&lt;td&gt;Within 14 days of a fix being available: the vulnerability, its severity and impact, and the security update&lt;/td&gt;
&lt;td&gt;Within one month of the 72-hour notice: a detailed description, severity, impact, root cause, and mitigations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All of it goes through ENISA’s &lt;a href="https://www.enisa.europa.eu/news/the-cra-single-reporting-platform-is-launched" rel="noopener noreferrer"&gt;Single Reporting Platform&lt;/a&gt;, which went live the same day, to the CSIRT of the member state where you have your main establishment, and from there to every member state where the product is sold. And separately, under paragraph 8, to your users.&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%2Fvus6v09xw1ez5g388aqo.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%2Fvus6v09xw1ez5g388aqo.png" alt="Timeline: the Cyber Resilience Act's reporting clock, from reliable evidence of exploitation at hour 0 to an early warning at 24 hours, a notification at 72 hours, and a final report at 14 days" width="800" height="260"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: Article 14's three filings. The clock starts on evidence of exploitation, not on the patch, and the first filing needs answers most fleets keep in people's heads.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now translate the 24-hour column into questions an engineering team has to answer before lunch tomorrow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Which of our products contain the affected component, at which versions?&lt;/strong&gt; The CRA expects this to be a lookup, not an investigation. Annex I Part II requires a software bill of materials “covering at the very least the top-level dependencies.” An agent’s dependencies include its framework, its MCP servers, its gateway, and the model endpoints it is wired to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which customers, in which countries, run it?&lt;/strong&gt; The early warning must name the member states. A product you cannot enumerate deployments of is a product you cannot file for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it exploited, or merely vulnerable?&lt;/strong&gt; The clock starts on reliable evidence of exploitation. Evidence means a record of what the component did that it should not have. If the only log is the one the compromised component wrote about itself, you have a story, not evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What could it reach?&lt;/strong&gt; The LiteLLM flaw was serious because a gateway holds the keys to everything behind it. Whether a severe incident occurred, and how severe, depends on what the compromised piece was authorized to touch. If the answer is “the service account had access to everything,” the incident report writes itself, and not in your favor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One agent makes each of these an afternoon’s work. Ten agents make it a spreadsheet. Two hundred agents, built by different teams on different frameworks, some in a vendor’s visual builder and some in a notebook that got promoted to production, make it a project that does not fit in 24 hours. Fewer agents would solve it, and nobody is going to do that. The realistic version is infrastructure that keeps the answers current while the fleet grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does “secure by design” mean for an AI agent?
&lt;/h2&gt;

&lt;p&gt;The reporting clock is the part in force today. The larger obligation lands in December 2027, and it is the secure-by-design half of the law. Annex I Part I of the regulation is the definition of secure by design that European regulators will hold products to, and reading it with agents in mind is uncomfortable, because it describes the agent stack most teams do not have.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Annex I asks&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;With agents, that means&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;So the infrastructure must provide&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Secure by default configuration, point (b)&lt;/td&gt;
&lt;td&gt;An agent, MCP server, or gateway that denies by default and needs no hardening step the customer might skip&lt;/td&gt;
&lt;td&gt;Default-deny authorization that is the starting state, not a policy someone adds later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protection from unauthorised access by “authentication, identity or access management,” and reporting of possible unauthorised access, point (d)&lt;/td&gt;
&lt;td&gt;Every agent and tool has a verifiable identity, and every call is checked against it. A fabricated Bearer token opens nothing&lt;/td&gt;
&lt;td&gt;Workload identity issued by infrastructure, not a shared API key in an environment variable, with failed attempts recorded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data minimisation, point (g)&lt;/td&gt;
&lt;td&gt;An agent processes only what its current task needs, not everything its credentials allow&lt;/td&gt;
&lt;td&gt;Per-request authorization scoped to the task, with credentials held outside the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limit attack surfaces, including external interfaces, point (j)&lt;/td&gt;
&lt;td&gt;An agent can reach only the tools, models, and peers it was registered to reach&lt;/td&gt;
&lt;td&gt;Explicit allow lists of agent-to-agent, agent-to-tool, and agent-to-model paths, enforced in the data path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduce the impact of an incident with exploitation mitigation, point (k)&lt;/td&gt;
&lt;td&gt;A compromised agent cannot escalate: its token works at one destination, and it can be stopped without stopping the cluster&lt;/td&gt;
&lt;td&gt;Per-hop, short-lived credentials, and a way to quarantine one workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Record and monitor “relevant internal activity, including the access to or modification of data, services or functions,” point (l)&lt;/td&gt;
&lt;td&gt;Every access attributed to a specific agent, acting for a specific person, through a specific tool and model&lt;/td&gt;
&lt;td&gt;An audit trail written by the enforcement point, across every hop, that the agent cannot edit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identify and document components, with an SBOM, Part II point (1)&lt;/td&gt;
&lt;td&gt;You know which agents run which framework, gateway, and MCP server versions, including the ones nobody registered&lt;/td&gt;
&lt;td&gt;Continuous discovery of agent workloads, not an annual questionnaire&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fr91tccu210uyle4tepyu.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%2Fr91tccu210uyle4tepyu.png" alt="Diagram: one agent request from user to agent, AI gateway, MCP server and internal system, with an enforcement point at every hop, five Annex I tiles below, and an unregistered agent reaching the internal system on a dashed path" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The same table drawn as one request. The five tiles are Annex I Part I points (b), (d), (g) and (l) and Part II point (1), and the dashed path is the agent nobody registered.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. Nothing in it is paperwork, and none of it is something the agent can do for itself. Every row is infrastructure that sits around the agent and does not trust it, because &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;controls the agent can override are not controls&lt;/a&gt;. A model that has been talked into calling &lt;code&gt;export_customer_list&lt;/code&gt; will do so with perfectly valid credentials and a plausible explanation. Point (d) does not ask whether the agent meant well. It asks whether the access was authorized.&lt;/p&gt;

&lt;p&gt;Notice, too, that the LiteLLM flaw fails four rows of that table at once. The default was not secure (b). Authentication fell through to an empty identity (d). The gateway’s interfaces exposed every tool behind it (j). And the blast radius was the gateway’s entire set of upstream keys (k). None of that is unique to LiteLLM. In April, OX Security disclosed that the stdio transport in the official MCP SDKs for Python, TypeScript, Java, and Rust &lt;a href="https://labs.cloudsecurityalliance.org/research/csa-research-note-mcp-security-crisis-20260504-csa-styled/" rel="noopener noreferrer"&gt;passed configuration straight to the operating system shell&lt;/a&gt;, a default inherited by an estimated 200,000 instances across more than 150 million package downloads. Insecure defaults are how the ecosystem was built. The CRA makes them the manufacturer’s liability.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.tigera.io/blog/the-five-pillars-of-ai-agent-accountability-a-diagnostic-framework-for-engineering-leaders/" rel="noopener noreferrer"&gt;five pillars of AI agent accountability&lt;/a&gt; we published earlier this year, traceability, authorization provenance, identity and ownership, policy at scale, and human oversight, were written before we read Annex I closely. Lay them over the table and each pillar answers one or two rows. Annex I got there first, and with fines attached.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when it is done properly?
&lt;/h2&gt;

&lt;p&gt;Here is what a governance layer like &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; does for the table above, and what it leaves to you. Both halves matter.&lt;/p&gt;

&lt;p&gt;Done properly, every agent, MCP server, and LLM provider in the cluster is registered and carries a verifiable identity, so “which workloads run the affected gateway, and who owns them” is a query rather than a Slack thread. Authorization runs at a gateway the agent does not control: default deny, evaluated on every request, with the caller’s identity, the target, and the operation as context, so a compromised agent’s reach is exactly what its policy allowed and nothing more. Provider credentials live at the gateway, not in the agent, and each token the gateway mints is addressed to one destination, so a stolen token is worthless one hop later. Workloads that never registered, the experiment nobody decommissioned, are detected from the node itself by watching for connections to model endpoints and inspecting running processes. A workload that should not be there can be quarantined at the gateway and in the kernel. And every request lands in an audit trail written by the enforcement plane, with the caller, the human authority, the tool, the policy decision, and the model that served it. That is your 24-hour evidence, your Annex I point (l) record, and your incident-scoping data in one place.&lt;/p&gt;

&lt;p&gt;Now the other half. None of that is automatic. Someone has to register the agents and decide what each one may call, and a policy that allows everything is a policy that proves nothing. Someone has to maintain the software bill of materials for the agents themselves. A gateway can tell you which workloads talked to which endpoints, not which version of a Python package is inside a container. The detector finds unregistered agents, but a person decides whether each one is sanctioned. And Lynx does not file the report. Article 14 is a process your organization runs, with a named owner, an account on ENISA’s platform, and a rehearsed path from “we have reliable evidence” to “the early warning is submitted,” which you should run as a drill before you need it. What the infrastructure provides is the layer that process quietly assumes exists: the ability to say, with evidence, which agents you have, what each one could touch, and what each one did.&lt;/p&gt;

&lt;p&gt;Put in properly, that turns the 24-hour question from a forensic project into a lookup. Put in badly, it is one more dashboard nobody trusts. The difference is the work you do in the first month, not the software you install.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Does the EU Cyber Resilience Act apply to AI agents?&lt;/strong&gt; Yes. The CRA applies to any software or hardware product with a data connection that is made available on the EU market, including components sold separately and the remote processing a product depends on. Agents, MCP servers, AI gateways, and their charts and operators are software products. The Commission’s 2026 guidance never mentions agents or language models, because there is no exemption to explain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When do the CRA obligations start?&lt;/strong&gt; Reporting of actively exploited vulnerabilities and severe incidents has been mandatory since 11th September 2026, for products already on the market as well as new ones. The essential cybersecurity requirements in Annex I, and the conformity assessment and CE marking, apply from 11 December 2027.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who reports, the vendor or the customer?&lt;/strong&gt; The manufacturer, meaning whoever places the product on the market under their name. A company using agents internally is a user, and is owed notification by its vendors under Article 14(8). If you build agents and sell them, or embed third-party agent components in a product you sell, you are the manufacturer for the whole product, including the open source inside it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is a hosted AI agent covered by the CRA?&lt;/strong&gt; A purely hosted service is regulated by NIS2 rather than the CRA. Hosted processing becomes part of a CRA product when the product cannot perform one of its functions without it and the manufacturer built it. Many agent products, with an installed component and a required cloud backend, will fall on the CRA side of that line. Get a legal opinion on your own architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What must the 24-hour early warning contain?&lt;/strong&gt; For an exploited vulnerability: that it is being exploited, and where applicable the member states in which the product has been made available. For a severe incident: that it occurred, and whether unlawful or malicious acts are suspected. It goes through ENISA’s Single Reporting Platform to the CSIRT of the member state where you have your main establishment. The 72-hour notice and the final report add the detail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the CRA require logging for AI agents?&lt;/strong&gt; Annex I Part I point (l) requires products to provide security-related information by “recording and monitoring relevant internal activity, including the access to or modification of data, services or functions.” For an agent, that means an attributable record of which agent, on whose behalf, accessed which tool or data, and it needs to come from an enforcement point the agent cannot edit. Awareness of exploitation, which starts the 24-hour clock, depends on the same record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What are the penalties under the CRA?&lt;/strong&gt; Up to EUR 15 million or 2.5% of worldwide annual turnover for failing the essential cybersecurity requirements or the reporting duties, up to EUR 10 million or 2% for other obligations, and up to EUR 5 million or 1% for supplying incorrect or misleading information to authorities.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The regulator’s question
&lt;/h2&gt;

&lt;p&gt;The people who wrote the CRA were thinking about routers, smart meters, and the software inside them. They were not thinking about a language model with a tool belt. But the law they wrote asks the questions that agent fleets are worst at answering: what is running, what can it reach, what did it do, and how fast can you say so.&lt;/p&gt;

&lt;p&gt;LiteLLM’s bug was exploited in honeypots for weeks before it reached CISA’s list. Under the CRA, the clock would have started the day the honeypot lit up, and the first report would have been due the next day. Meeting that has less to do with how good the incident response team is than with whether the infrastructure already holds the answers.&lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap. If a component in your agent stack showed up on an exploited list tomorrow morning, which of your agents run it, what could each one reach, and what did they do last night? If the answer starts with “we would need to check,” the check is what to build.&lt;/p&gt;

&lt;p&gt;Secure by design used to be a principle. In Europe, it now has a filing deadline.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request early access at &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/?product=lynx&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/eu-cyber-resilience-act-europe-just-put-your-ai-agents-on-a-24-hour-clock/" rel="noopener noreferrer"&gt;EU Cyber Resilience Act: Europe Just Put Your AI Agents on a 24-Hour Clock&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>bestpractices</category>
      <category>observability</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>HIPAA Wasn’t Written for AI Agents. It Applies to Them Anyway</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Fri, 02 Oct 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/tigeraio/hipaa-wasnt-written-for-ai-agents-it-applies-to-them-anyway-22pk</link>
      <guid>https://dev.to/tigeraio/hipaa-wasnt-written-for-ai-agents-it-applies-to-them-anyway-22pk</guid>
      <description>&lt;p&gt;In short, healthcare is adopting AI agents faster than almost any other industry. More than 85% of Epic’s customers already use Epic AI, Epic’s Agent Factory will let every health system build agents of its own from 2027, and 43% of health systems were piloting agentic AI at the start of this year. Every one of those agents runs next to Protected Health Information (PHI), and PHI comes with rules that were not written for autonomous software but land on it anyway: minimum necessary access, audit controls, business associate agreements, a 60-day breach clock. This post maps those rules onto what agent infrastructure must provide (identity, per-request authorization, live inventory, an audit trail across every hop), then shows where Tigera Lynx fits and what it does not do. It is written for the platform and security leaders who will be asked to produce the record.&lt;/p&gt;

&lt;p&gt;Healthcare was supposed to be the cautious one. Regulated to the bone, allergic to unvetted vendors, still running a fax machine somewhere in the basement. Instead, it is adopting AI agents faster than almost anyone.&lt;/p&gt;

&lt;p&gt;At HIMSS in March 2026, &lt;a href="https://hitconsultant.net/2026/03/10/epic-ai-himss-2026-agent-factory-curiosity-foundation-models/" rel="noopener noreferrer"&gt;Epic previewed Agent Factory&lt;/a&gt;, a visual builder for health systems to create, customize, and orchestrate their own AI agents inside the Electronic Health Record (EHR), and said that more than 85% of its customers are already actively using Epic AI. By its August user group meeting, &lt;a href="https://healthsystemcio.com/2026/08/09/epic-agent-factory-health-systems/" rel="noopener noreferrer"&gt;four health systems were building agents in it&lt;/a&gt; without writing code. A month later, &lt;a href="https://healthsystemcio.com/2026/09/16/epic-build-a-thon-clinical-agents/" rel="noopener noreferrer"&gt;25 health systems spent three days building clinical ones&lt;/a&gt;: an agent that reads NICU notes for early signs of necrotizing enterocolitis, another that checks medication refill requests against clinical protocol. Training for the first early adopters starts in October, and general availability is planned for 2027. Oracle’s &lt;a href="https://www.oracle.com/news/announcement/physicians-reduce-documentation-time-with-oracle-health-clinical-ai-agent-2025-03-04/" rel="noopener noreferrer"&gt;Clinical AI Agent&lt;/a&gt; drafts notes and proposes next steps for physicians across more than 30 specialties, and in September it &lt;a href="https://www.oracle.com/news/announcement/oracle-health-clinical-ai-agent-helps-nurses-alleviate-documentation-burden-and-streamline-care-2026-09-14/" rel="noopener noreferrer"&gt;reached inpatient nurses&lt;/a&gt;. And underneath the vendor roadmaps sits a quieter layer: internal teams wiring LangGraph agents and MCP servers to FHIR APIs, because the pilot worked and the backlog is long.&lt;/p&gt;

&lt;p&gt;The numbers behind that are worth holding in your head. Research from &lt;a href="https://www.microsoft.com/en-us/industry/blog/healthcare/2026/02/12/assessing-healthcares-agentic-ai-readiness-new-research-from-microsoft-and-the-health-management-academy/" rel="noopener noreferrer"&gt;Microsoft and The Health Management Academy&lt;/a&gt;, published in early 2026, found that only 3% of health systems had agents in live workflows, while 43% were piloting or testing them. That is the shape of a wave a year before it breaks. The same study named governance as one of the three barriers health system leaders say they have not solved. Gravitee’s &lt;a href="https://www.gravitee.io/state-of-ai-agent-security" rel="noopener noreferrer"&gt;State of AI Agent Security survey&lt;/a&gt;, a vendor survey from February, found that 92.7% of healthcare respondents had seen a confirmed or suspected AI agent incident in the previous year, the highest share of any sector it asked.&lt;/p&gt;

&lt;p&gt;None of this is recklessness, and it deserves better than a scolding. A scribe agent that gives a clinician two hours of their evening back is one of the clearest AI wins in any industry. The adoption is rational.&lt;/p&gt;

&lt;p&gt;But every one of those agents runs next to PHI, which comes with rules that are older than the transformer, attach to the data rather than the technology reading it, and are about to get sharper, not softer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does HIPAA apply to AI agents?
&lt;/h2&gt;

&lt;p&gt;Yes, fully, and without an AI chapter. HIPAA does not need one. The Privacy and Security Rules regulate covered entities and their business associates, and they attach to the data, so an agent reading a chart is governed exactly as a clinician reading a chart is. Four existing requirements land directly on agents:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimum necessary.&lt;/strong&gt; &lt;a href="https://www.ecfr.gov/current/title-45/subtitle-A/subchapter-C/part-164/subpart-E/section-164.502" rel="noopener noreferrer"&gt;45 CFR 164.502(b)&lt;/a&gt; limits PHI access to what a specific task needs. A human scheduler looking up an address sees a demographics screen. An agent doing the same job through a service account that can read the full clinical record is a minimum necessary problem, whether or not it ever reads past the address field. Agents do not get scoped down by the login screen. They get exactly the credentials someone gave them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit controls.&lt;/strong&gt; &lt;a href="https://www.ecfr.gov/current/title-45/subtitle-A/subchapter-C/part-164/subpart-C/section-164.312" rel="noopener noreferrer"&gt;45 CFR 164.312(b)&lt;/a&gt; requires mechanisms that record activity in systems holding electronic PHI (ePHI): who accessed what, when, and on whose authority. EHR audit logs answer this for humans, because a human is logged in. An agent is not a user. It acts on behalf of a user, through credentials of its own, often through a chain: a patient asks an agent, the agent calls another agent, that one calls an MCP tool, the tool queries the record, and somewhere a language model sees the result. “Who” is now a chain, not a name, and the audit trail has to hold the whole chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business associates.&lt;/strong&gt; Any vendor that processes PHI on your behalf needs a Business Associate Agreement (BAA). Every LLM provider your agents can reach is on that list. If one team’s agent carries an API key for a provider you have no agreement with, its plumbing has quietly created a compliance exposure nobody signed off on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Breach notification.&lt;/strong&gt; When PHI goes somewhere it should not, the &lt;a href="https://www.hhs.gov/hipaa/for-professionals/breach-notification/index.html" rel="noopener noreferrer"&gt;Breach Notification Rule&lt;/a&gt; starts a 60-day clock, and the first question is scope: what data, which patients, over what window. You cannot report what you cannot reconstruct. And the bill for getting this wrong is highest here of anywhere: IBM’s 2026 Cost of a Data Breach report puts the &lt;a href="https://www.hipaajournal.com/2026-cost-data-breach-study-ibm/" rel="noopener noreferrer"&gt;average healthcare breach at $6.64 million&lt;/a&gt;, the costliest industry for the thirteenth year running.&lt;/p&gt;

&lt;p&gt;If the clock sounds theoretical, Australia just lived through the version without PHI in it. On 18 June, an OpenAI agent under internal evaluation &lt;a href="https://www.abc.net.au/news/2026-09-24/ai-agent-accessed-australian-government-site-pm-says/107189078" rel="noopener noreferrer"&gt;found its way around the access blocks&lt;/a&gt; on a Services Australia portal that holds Medicare statistics and read non-public files. OpenAI discovered the intrusion on 11 August, told Services Australia on 10 September by emailing a public inbox, and the Prime Minister announced it on 24 September, calling both the delay and the manner &lt;a href="https://time.com/article/2026/09/24/australia-condemns-unacceptable-openai-breach-of-government-health-portal/" rel="noopener noreferrer"&gt;“unacceptable”&lt;/a&gt;. No patient records were touched. Everything else about the story was the pattern: an agent that, in the Prime Minister’s words, did not accept no for an answer, and an operator that took two months to notice and another month to say so. OpenAI has since &lt;a href="https://techcrunch.com/2026/09/29/openai-apologizes-to-australia-after-its-ai-agents-breached-government-sites/" rel="noopener noreferrer"&gt;apologised&lt;/a&gt;, and after a further incident it &lt;a href="https://tech.yahoo.com/ai/articles/openai-pauses-most-powerful-ai-175213089.html" rel="noopener noreferrer"&gt;paused training, evaluation, and tool-use inference&lt;/a&gt; on its most capable models. Put PHI in that story and the 60-day clock would have started in June, on the day the intrusion should reasonably have been known, not in August when someone noticed.&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%2F2ikey69sp7mnvt4ip0hv.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%2F2ikey69sp7mnvt4ip0hv.png" alt="Timeline: HIPAA's 60-day window laid over the OpenAI and Services Australia dates, 18 June to 24 September 2026" width="800" height="260"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: The OpenAI and Services Australia dates with HIPAA's 60-day window laid over them. Had it been PHI, the deadline would have passed 24 days before anyone was told.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One agent makes each of these a manageable exercise in process. Ten agents make it a spreadsheet nobody enjoys maintaining. A hundred agents, some built in a vendor’s visual builder, some homegrown, some a resident’s experiment that never got decommissioned, make it impossible to do by hand. That is not a prediction about a distant future. Agent Factory’s entire pitch is that your departments will build their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is the HIPAA Security Rule changing for AI?
&lt;/h2&gt;

&lt;p&gt;The rule is not changing for AI specifically, but it is tightening in exactly the places agents stress. In January 2025, HHS proposed the &lt;a href="https://www.federalregister.gov/documents/2025/01/06/2024-30983/hipaa-security-rule-to-strengthen-the-cybersecurity-of-electronic-protected-health-information" rel="noopener noreferrer"&gt;first major rewrite of the Security Rule&lt;/a&gt; in over a decade. The final rule has slipped: OMB’s regulatory agenda &lt;a href="https://www.hipaajournal.com/hipaa-security-rule-update-postponed/" rel="noopener noreferrer"&gt;now targets July 2027&lt;/a&gt;, nearly 5,000 comments are still under review, and hospital groups, including the &lt;a href="https://www.aha.org/lettercomment/2026-02-23-aha-response-hhs-rfi-ai-health-care" rel="noopener noreferrer"&gt;American Hospital Association&lt;/a&gt;, have asked for the proposal to be withdrawn. Proposals change before they land. The direction will not. Three items in the proposal read as if they were written with agent fleets in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A technology asset inventory and a network map&lt;/strong&gt; showing how ePHI moves through your systems, reviewed at least annually. Every agent, every MCP server, every LLM endpoint is an asset on that map. A map drawn by interviewing teams is stale before the ink dries. Agents get built in an afternoon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mandatory, auditable controls&lt;/strong&gt; in place of “addressable” ones: encryption, multi-factor authentication, segmentation. The era of arguing that a control was not reasonable for your environment is closing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annual written certification from business associates&lt;/strong&gt; that safeguards are actually deployed. Your vendors will be certifying to you, and your auditors will expect you to know which vendors sit in the data path at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nobody is waiting for the rule, either. The Office for Civil Rights (OCR) is enforcing the current rule’s risk analysis requirement hard, through a &lt;a href="https://www.nixonpeabody.com/insights/articles/2026/07/21/health-plan-settlement-marks-ocrs-20th-ransomware-and-14th-risk-analysis-initiative" rel="noopener noreferrer"&gt;Risk Analysis Initiative&lt;/a&gt; that passed its fourteenth settlement in June, and a risk analysis is only as good as the inventory it starts from. The &lt;a href="https://www.hhs.gov/press-room/hhs-office-civil-rights-settles-hipaa-investigation-ambry-genetics-phishing-attack-affecting-225000-individuals.html" rel="noopener noreferrer"&gt;Ambry Genetics settlement&lt;/a&gt; in September is worth reading with agents in mind: besides the missing risk analysis, OCR faulted the company for never assigning unique IDs to track who touched ePHI. That was a finding against a workforce of humans. A fleet of agents sharing one service account fails the same test, for the same reason.&lt;/p&gt;

&lt;p&gt;HHS ran a &lt;a href="https://www.federalregister.gov/documents/2025/12/23/2025-23641/request-for-information-accelerating-the-adoption-and-use-of-artificial-intelligence-as-part-of" rel="noopener noreferrer"&gt;request for information on accelerating AI in clinical care&lt;/a&gt; over the winter and &lt;a href="https://www.healthcaredive.com/news/hhs-update-artificial-intelligence-ai-request-information/823884/" rel="noopener noreferrer"&gt;reported in June&lt;/a&gt; that what the sector asked for most was practical guidance on governing AI and tools to evaluate what vendors sell. It says the answers will shape how it regulates, reimburses, and funds AI in the clinic. States are moving faster. California’s legislature sent the governor &lt;a href="https://www.nationalnursesunited.org/press/nurses-celebrate-final-passage-of-landmark-ai-bills-urge-gov-newsom-to-sign" rel="noopener noreferrer"&gt;AB 1979&lt;/a&gt; in September, which would require any company whose AI health application reaches medical records, consumer chatbots included, to comply with the state’s medical confidentiality law, and the governor had until 30 September to act on it.&lt;/p&gt;

&lt;p&gt;Whichever year the final rule takes effect, the gap between “we have a policy document” and “here is the map, and here is the log” is exactly where findings live.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does HIPAA compliance require of AI agent infrastructure?
&lt;/h2&gt;

&lt;p&gt;Put the current rule and the proposed one side by side, then translate each requirement into what it means once agents are in the data path:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;The rule asks&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;With agents, that means&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;So the infrastructure must provide&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Minimum necessary access (164.502(b))&lt;/td&gt;
&lt;td&gt;An agent touches only the PHI its current task needs, not everything its credentials allow&lt;/td&gt;
&lt;td&gt;Per-request authorization with default deny, not standing access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit controls (164.312(b))&lt;/td&gt;
&lt;td&gt;Every access attributed to a specific agent, acting for a specific person, through a specific tool and model&lt;/td&gt;
&lt;td&gt;An identity-attributed audit trail across every hop, not just the EHR login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asset inventory and ePHI network map (proposed)&lt;/td&gt;
&lt;td&gt;Every agent, MCP server, and LLM provider is on the map, including the ones nobody registered&lt;/td&gt;
&lt;td&gt;Continuous discovery of agents, not an annual questionnaire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BAA coverage for vendors in the data path&lt;/td&gt;
&lt;td&gt;Agents can reach only the LLM providers you actually have agreements with&lt;/td&gt;
&lt;td&gt;Central control over provider access, with credentials held outside the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Breach notification within 60 days&lt;/td&gt;
&lt;td&gt;Scope a suspected leak: which agent, what data, which direction, what window&lt;/td&gt;
&lt;td&gt;A reconstructable record of agent traffic with policy decisions attached&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2F66lwwy10k8p88gczjlub.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%2F66lwwy10k8p88gczjlub.png" alt="Diagram: where HIPAA lands on one agent request, five hops from clinician to patient record with a checkpoint at each, and one unregistered agent" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The same table drawn as one request: five hops, a checkpoint at each, and one agent nobody registered.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read column three again. Nothing in it is paperwork. Identity, authorization, discovery, audit: every row is infrastructure, and none of it can be delegated to the agent itself, because &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;controls the agent can override are not controls&lt;/a&gt;. We have made that argument all year, from the &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-crisis-why-governance-isnt-keeping-up-with-deployment/" rel="noopener noreferrer"&gt;accountability crisis&lt;/a&gt; through &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;why network policies, API gateways, and RBAC cannot close the gap&lt;/a&gt;. Healthcare is where it stops being an argument and becomes an audit finding.&lt;/p&gt;

&lt;p&gt;Notice, too, what the table does not contain. It does not ask the model to behave. Prompt injection is unsolved, and an agent that has been talked into exporting a patient list will do so with perfectly valid credentials. The &lt;a href="https://www.tigera.io/blog/the-five-pillars-of-ai-agent-accountability-a-diagnostic-framework-for-engineering-leaders/" rel="noopener noreferrer"&gt;five pillars of AI agent accountability&lt;/a&gt; we published earlier this year (traceability, authorization provenance, identity and ownership, policy at scale, human oversight) were written for any regulated industry. Lay them over that table and each pillar answers one or two rows. HIPAA just happens to have written the pillars into law before anyone called them that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where does Tigera Lynx fit?
&lt;/h2&gt;

&lt;p&gt;This is the gap &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; was built to close, and it maps onto that table almost row for row.&lt;/p&gt;

&lt;p&gt;Every agent, MCP server, and LLM provider registers with Lynx and carries a verifiable identity (SPIFFE, OIDC, or a pod-owner binding for agents you cannot modify), including who the agent is acting for, so “which agent, on whose behalf” is a fact attached to every request rather than a forensic project after the incident. Authorization runs through Cedar policy at the gateway: default deny, evaluated on every request, with the caller’s identity, the target, and the operation as context. For MCP traffic the policy can see the operation, the tool name, and the tool arguments, so “this agent may call &lt;code&gt;lookup_appointment&lt;/code&gt; but never &lt;code&gt;export_patient_list&lt;/code&gt;” is one policy statement, and a call a policy marks as requiring human approval waits until a person signs off. That is minimum necessary expressed as executable policy instead of a training slide.&lt;/p&gt;

&lt;p&gt;LLM provider credentials are injected at the gateway and never live inside the agent, which means the set of providers your agents can reach is exactly the set you have BAAs with, and a prompt-injected agent has no key to leak. Each token the gateway mints is addressed to one destination, so a token stolen from one hop is worthless at the next.&lt;/p&gt;

&lt;p&gt;Agents that never registered, &lt;a href="https://www.tigera.io/blog/a-field-guide-to-the-agents-in-your-cluster/" rel="noopener noreferrer"&gt;the experiment nobody decommissioned or the sidecar nobody audited&lt;/a&gt;, are detected from the node itself. An eBPF detector watches for connections to LLM endpoints, including a watchlist of your own self-hosted model endpoints, and inspects running processes for agent frameworks, then classifies each workload as sanctioned, shadow, or unknown with the evidence shown beside the verdict. That is the difference between an asset inventory you assert and one you can defend. A workload that should not be there can be quarantined on the spot, at the gateway and in the kernel, so it can no longer write to disk, launch processes, or open an outbound connection. The same detector now ships as a package for plain Linux hosts, because not every agent in a health system runs on Kubernetes.&lt;/p&gt;

&lt;p&gt;And every request lands in the Agent Trail with the caller, the human authority, the tool, the policy decision, the token exchanged at each hop, and the model that actually served the call: your 164.312(b) mechanism and your breach-scoping record in one place, written by the enforcement plane rather than narrated by the agent.&lt;/p&gt;

&lt;p&gt;To be precise about the claim: no software makes you HIPAA compliant, Lynx included. Compliance is contracts, risk analysis, process, and training, and the BAA with your LLM provider is a document your legal team signs, not a policy the gateway enforces. What Lynx provides is the layer those processes quietly assume exists: the ability to say, with evidence, which agents exist, what each one can touch, and what each one did.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Are AI agents subject to HIPAA?&lt;/strong&gt; Yes. HIPAA attaches to PHI and to the covered entities and business associates that handle it, not to the technology in between. An agent that reads, creates, or transmits PHI is bound by the same minimum necessary, audit control, and breach notification requirements as any workforce member or system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is my LLM provider a HIPAA business associate?&lt;/strong&gt; If PHI reaches it, yes, and you need a BAA before it does. Most major providers offer one on specific enterprise tiers, and de-identified data falls outside the rule. Signing the BAA is the easy part. The engineering problem is guaranteeing that no agent can reach a provider you have not signed one with, and that is a routing and credential control rather than paperwork.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can an AI agent be “HIPAA compliant”?&lt;/strong&gt; Not on its own. Compliance is a property of the organization and its processes. What you can make an agent is governable: it has a verified identity, its access is scoped per request, its traffic is logged with attribution, and it can be stopped. That is what an auditor can check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does an AI agent audit trail need to contain?&lt;/strong&gt; For every access to ePHI: which agent, acting on whose behalf, through which tool or API, against which policy decision, at what time, and which model saw the result. A log the agent writes about itself does not count. The record has to come from an enforcement point the agent cannot edit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What is the minimum necessary standard for AI agents?&lt;/strong&gt; An agent should be able to reach only the PHI its current task requires, evaluated at the time of the request. Standing access through a broad service account violates the spirit of the standard even when the agent behaves, because the exposure exists whether or not it is exercised.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the proposed HIPAA Security Rule apply to AI agents?&lt;/strong&gt; It does not mention them, but its asset inventory, network map, mandatory encryption and MFA, and business associate verification requirements apply to every system that touches ePHI. Agents, MCP servers, and LLM endpoints are systems. The final rule is now expected in 2027 and may change, but the current rule’s risk analysis requirement, which OCR is actively enforcing, already needs a complete inventory to satisfy.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The auditor’s question
&lt;/h2&gt;

&lt;p&gt;The vendors will keep shipping agents, and clinicians will keep adopting anything that gives them their evenings back. The industry conversation &lt;a href="https://www.statnews.com/2026/03/11/ai-agents-himss-google-microsoft-epic-oracle/" rel="noopener noreferrer"&gt;has already moved&lt;/a&gt; from “should we deploy agents” to “how do we validate and govern them.” That is the right conversation, and it comes with a deadline attached: the day an auditor, or a breach, asks you to produce the record. OpenAI got that question in August. Its answer reached Services Australia a month later, by email, in a public inbox.&lt;/p&gt;

&lt;p&gt;So ask the question now, while it is cheap. When someone asks which agents could read patient records last quarter, which ones actually did, on whose authority, and which models saw the results, what will you hand them?&lt;/p&gt;

&lt;p&gt;In most industries, an unaccountable agent is a risk to manage. In healthcare, it is a finding waiting for an auditor.&lt;/p&gt;

&lt;p&gt;_ &lt;strong&gt;Lynx&lt;/strong&gt; is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request early access at &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/?product=lynx&lt;/a&gt;._&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/hipaa-wasnt-written-for-ai-agents-it-applies-to-them-anyway/" rel="noopener noreferrer"&gt;HIPAA Wasn’t Written for AI Agents. It Applies to Them Anyway&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>Managing Claude Code Sessions Through Lynx</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Wed, 30 Sep 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/tigeraio/managing-claude-code-sessions-through-lynx-3dk3</link>
      <guid>https://dev.to/tigeraio/managing-claude-code-sessions-through-lynx-3dk3</guid>
      <description>&lt;p&gt;At Tigera, we spend a lot of time thinking about agent security: identity, policy, runtime controls, and the record left behind after an agent acts.&lt;/p&gt;

&lt;p&gt;Coding agents create an interesting problem because, in most organizations, they didn’t arrive through the front door.&lt;/p&gt;

&lt;p&gt;Few companies ran a platform evaluation and rolled Claude Code out to 500 developers. Developers installed it themselves. By the time security and platform teams started asking how coding agents should be governed, they were already running on laptops with access to source code, credentials, SSH keys, kubeconfigs, internal services, and whatever else the developer could reach.&lt;/p&gt;

&lt;p&gt;The long-term answer is increasingly clear I think: move coding agents into isolated environments you control.&lt;/p&gt;

&lt;p&gt;Anthropic’s sandboxing work draws filesystem and network boundaries using OS primitives such as bubblewrap and seatbelt. Its reference devcontainer includes an egress firewall. Docker has introduced sandboxes for running coding agents, and Kubernetes-based approaches can add stronger workload isolation, network policy, and disposable development environments.&lt;/p&gt;

&lt;p&gt;That direction makes sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Isolation governs what an agent can do. A gateway governs what it can send.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And unlike a complete move to remote development environments, the second boundary is something you can introduce today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one environment variable
&lt;/h2&gt;

&lt;p&gt;Claude Code allows its model endpoint to be configured through the environment.&lt;/p&gt;

&lt;p&gt;Instead of connecting directly to Anthropic, point it at the Lynx gateway.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://&amp;lt;lynx-gateway&amp;gt;/llm/anthropic"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s the entire change on the developer’s machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No endpoint agent. No daemon. No certificate installation.&lt;/li&gt;
&lt;li&gt;No rebuilt development environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next model turn goes through Lynx, and every model turn after it does too.&lt;/p&gt;

&lt;p&gt;That small change turns otherwise disconnected model calls into something more useful: a coding session that can be observed, governed, and recorded.&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%2F8aslap01sqkjxktja49j.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%2F8aslap01sqkjxktja49j.png" alt="Coding sessions list in Lynx" width="800" height="346"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Coding sessions list in Lynx&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F57mw84voqctmnvw1fzfv.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%2F57mw84voqctmnvw1fzfv.png" alt="Coding session summary in Lynx" width="799" height="430"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Coding session summary in Lynx&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What this gives you
&lt;/h2&gt;

&lt;p&gt;Instead of seeing another HTTPS connection from a developer laptop to an AI provider, the platform can start answering important questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which coding sessions are using AI?&lt;/li&gt;
&lt;li&gt;Which model providers and models are they using?&lt;/li&gt;
&lt;li&gt;What information is being sent to those models?&lt;/li&gt;
&lt;li&gt;Which policies were applied?&lt;/li&gt;
&lt;li&gt;Which MCP tools were called through the gateway?&lt;/li&gt;
&lt;li&gt;Did the session spawn sub-agents?&lt;/li&gt;
&lt;li&gt;What happened during a particular coding session?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a significant improvement over an unmanaged agent talking directly to a model provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;p&gt;A gateway gives you a strong answer to what left the building, not what happened on the machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local tools run on the laptop and do not transit the gateway.&lt;/li&gt;
&lt;li&gt;Example: Claude Code reads a file, edits source code, or runs a shell command locally.&lt;/li&gt;
&lt;li&gt;Some of that activity may appear in model traffic (e.g., tool calls, results, retrieved files, or other context).&lt;/li&gt;
&lt;li&gt;That is observation, not enforcement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A governed laptop is not a sandbox
&lt;/h2&gt;

&lt;p&gt;Routing Claude Code through a gateway does not suddenly give Lynx control over the developer’s machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every model turn that transits the gateway can be governed.&lt;/li&gt;
&lt;li&gt;MCP calls can also be governed when the MCP server is reached through the gateway.&lt;/li&gt;
&lt;li&gt;Local tools are different. The gateway isn’t on that execution path and cannot prevent it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that is observation, not enforcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a governed coding session looks like
&lt;/h2&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%2F5ivxp8wv6n49pgyul7md.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%2F5ivxp8wv6n49pgyul7md.png" alt="Diagram: Claude Code on the developer laptop routes model and MCP traffic through the Lynx gateway (identity, Cedar policy, audit) to external services; local tools stay un-governed" width="799" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From unmanaged laptop to governed sandbox
&lt;/h2&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%2Fr1q69zh0y1iyizskh61f.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%2Fr1q69zh0y1iyizskh61f.png" alt="Diagram: from unmanaged laptop, to governed coding session on the laptop, to governed sandbox with runtime containment" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/tigera-products/lynx/" rel="noopener noreferrer"&gt;Learn more about Lynx →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/managing-claude-code-sessions-through-lynx/" rel="noopener noreferrer"&gt;Managing Claude Code Sessions Through Lynx&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>The Clearinghouse For AI Agents Has A Blind Spot</title>
      <dc:creator>Dillon Barry</dc:creator>
      <pubDate>Wed, 23 Sep 2026 09:11:12 +0000</pubDate>
      <link>https://dev.to/tigeraio/the-clearinghouse-for-ai-agents-has-a-blind-spot-11ph</link>
      <guid>https://dev.to/tigeraio/the-clearinghouse-for-ai-agents-has-a-blind-spot-11ph</guid>
      <description>&lt;p&gt;Jamin Ball’s recent piece, “&lt;a href="https://cloudedjudgement.substack.com/p/systems-of-record-won-the-saas-era?utm_campaign=post-expanded-share&amp;amp;utm_medium=web" rel="noopener noreferrer"&gt;Systems of Record Won the SaaS Era — Clearinghouses Will Win the Agents Era,”&lt;/a&gt; is the cleanest articulation I’ve seen of where the durable moat goes next. His argument is simple and, I think, correct: the SaaS era rewarded whoever owned the system of record, and the agent era will reward whoever owns the clearinghouse. This is a new seat that sits between mutually-distrusting agents and decides which one is cleared to act, on what data, with what limits, and can prove what happened after the fact. The lock-in moves from your data to your permissions. The source-of-truth era becomes the source-of-permission era.&lt;/p&gt;

&lt;p&gt;I agree with all of it. Governance has graduated from a compliance checkbox at the end of the sales cycle to the first question a CIO asks. Once agents act autonomously and eventually spend real money, “is the model good?” stops being interesting now that every model is good enough and “can I see what every agent did, set policy on what it can touch, and prove it to my auditors?” becomes the whole conversation. That seat is strategic real estate. Whoever holds it is hard to dislodge.&lt;/p&gt;

&lt;p&gt;But there’s an assumption buried in the clearinghouse metaphor that’s worth dragging into the light, because the entire model rests on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A clearinghouse only clears what comes to it
&lt;/h2&gt;

&lt;p&gt;In financial markets the metaphor works because participation is mandatory. You cannot settle a trade on a regulated exchange without going through the clearinghouse. The seat is powerful precisely because there is no path around it. Every transaction is, by construction, a transaction that presents itself for clearing.&lt;/p&gt;

&lt;p&gt;Agents are not like that. Nothing about the architecture forces an agent to route its actions through a governance seat. An agent calls a model endpoint directly. It opens a connection to a tool server that someone stood up last week. It talks to another agent over a side channel or a message board as in the Hugging Face attack. A developer spins up an autonomous workflow in a corner of the infrastructure that the platform team has never inventoried. None of that traffic announces itself at the toll booth. And the receipt the clearinghouse keeps is, by definition, a record only of the transactions that came to the desk.&lt;/p&gt;

&lt;p&gt;This is the gap. The clearinghouse is an &lt;em&gt;on-path&lt;/em&gt; construct, it governs the actions that pass through it. But in a real enterprise, the actions you most need to govern are frequently the ones that &lt;em&gt;don’t&lt;/em&gt;. The shadow agent nobody registered. The model call that skipped the gateway. The agent-to-agent handoff that never generated a clearing event. A governance model that only sees submitted transactions is blind to exactly the population that represents the risk.&lt;/p&gt;

&lt;p&gt;Every example in Jamin’s framing, the data platforms winning “from below,” the productivity suites winning “from above” assumes the agent shows up to be cleared. The most dangerous agents are the ones that never do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source of permission needs a source of truth
&lt;/h2&gt;

&lt;p&gt;So the clearinghouse seat, as described, is necessary but not sufficient. To actually hold it, you need something underneath it that the metaphor skips over: an independent source of truth about what agents are doing, whether or not they chose to clear through you.&lt;/p&gt;

&lt;p&gt;Four capabilities make that real, and none of them are “clearing” in Jamin’s sense.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;off-path visibility&lt;/strong&gt;. You need to observe agent traffic at a layer the agent can’t opt out of, that is the network and runtime substrate the workload actually executes on, so that the calls that bypass the gateway are still seen. A receipt tells you what cleared. Visibility tells you what happened. Those are different data sets, and the difference between them is your risk surface.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;discovery&lt;/strong&gt;. The clearinghouse clears the agents that present themselves; it does not go find the ones that didn’t. You need to enumerate the agents running in your environment without relying on them to register, because the unregistered ones are the point.&lt;/p&gt;

&lt;p&gt;The third is &lt;strong&gt;behavioral sensing&lt;/strong&gt;. Clearing is transactional: permit or deny, one action at a time. But a single permitted action can be perfectly legitimate while a &lt;em&gt;sequence&lt;/em&gt; of them is an exfiltration pattern. You need continuous analysis of what an agent does over time, not just a verdict at each gate.&lt;/p&gt;

&lt;p&gt;The fourth is &lt;strong&gt;identity issuance, not just verification&lt;/strong&gt;. A clearinghouse authorizes a credential at the door. But in a multi-hop agent world where agent calls agent calls tool calls model, you need every hop to carry attributable, minted identity, so the audit trail Ball rightly prizes is actually trustworthy end to end rather than a chain of “trust me” assertions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I’d draw the line
&lt;/h2&gt;

&lt;p&gt;I want to be careful not to overclaim the inverse, either. The clearinghouse thesis gets two things exactly right that the visibility layer does not replace. Owning &lt;strong&gt;memory&lt;/strong&gt; , what agents know and &lt;strong&gt;context&lt;/strong&gt; , what they see and how it’s served, is a genuinely strategic seat, and it belongs to the data players. A visibility-and-governance layer governs access to those things; it doesn’t store them, and it shouldn’t pretend to. The division of the map is this: the data platforms own memory and context, and the governance layer owns permission, enforcement, and the source of truth about behavior.&lt;/p&gt;

&lt;p&gt;And the multi-vendor angle Jamin references, “the clearinghouse across clearinghouses,” the neutral seat that no incumbent can credibly occupy because Microsoft will never neutrally govern Salesforce’s agents — is the most valuable position of all, but it’s also the least mature. Neutrality is easy to assert and hard to ship, especially across the messy reality of where agents actually run today. Anyone claiming it now is selling a roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reframe
&lt;/h2&gt;

&lt;p&gt;So here’s where I land. Jamin is right that the moat moves from the system of record to the clearinghouse, and from your data to your permissions. But a permission you can’t enforce on traffic you can’t see is a permission in name only. The source-of-permission era doesn’t replace the source of truth, rather it &lt;em&gt;depends&lt;/em&gt; on one. The seat goes to whoever can both decide what an agent is allowed to do and independently observe what it actually did, including all the times it never asked.&lt;/p&gt;

&lt;p&gt;The clearinghouse is the right metaphor. It just needs eyes outside the building.&lt;/p&gt;

&lt;p&gt;Written by Alain Mayer&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/clearinghouse/" rel="noopener noreferrer"&gt;The Clearinghouse For AI Agents Has A Blind Spot&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>HITL for autonomous agents: Where does the human go?</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 17 Sep 2026 00:49:44 +0000</pubDate>
      <link>https://dev.to/tigeraio/hitl-for-autonomous-agents-where-does-the-human-go-14n6</link>
      <guid>https://dev.to/tigeraio/hitl-for-autonomous-agents-where-does-the-human-go-14n6</guid>
      <description>&lt;p&gt;&lt;em&gt;Human approval is easy when you are sitting in front of the agent. For an agent running by itself in a cluster, almost none of that holds.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You’re in a meeting and your agent is running in a cluster. It has a service account, it has been asked to keep a service healthy, and it has just worked out that the right fix is to roll back a database migration. Nobody is watching it. That was rather the point of deploying it. You want to get notified to approve such an important action.&lt;/p&gt;

&lt;p&gt;This is a different problem from the one most people picture when they hear &lt;em&gt;human in the loop&lt;/em&gt;. If you use a coding assistant, you already have human oversight and it costs almost nothing: the agent shows you a diff, you read it, you approve. That works because you are already there — at a keyboard, with the context in front of you, in the same second the agent needs an answer.&lt;/p&gt;

&lt;p&gt;An autonomous agent has none of that. There is no session to interrupt. The person who should decide is asleep, or in a meeting, or on a plane. The approval has to travel out of the cluster, reach a phone, and come back. And the request has to survive however long that takes.&lt;/p&gt;

&lt;p&gt;Almost everything that is hard about human oversight for autonomous agents follows from those two sentences. So the useful question is not whether to have a human – MCP’s tools specification recommends keeping a person able to deny a tool call, and every agent security note I have read says some version of the same thing. The useful question is &lt;em&gt;where&lt;/em&gt; that human sits, and what happens to the request while it waits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four places to put the human
&lt;/h2&gt;

&lt;p&gt;Four different layers of the stack have each grown an answer, and they are not the same answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the identity layer&lt;/strong&gt; , the agent asks an identity provider for permission. The provider reaches you out of band, and your approval mints a short-lived token scoped to that one action. This is &lt;a href="https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0.html" rel="noopener noreferrer"&gt;OpenID Connect’s CIBA&lt;/a&gt;, and it is the most mature of the four — Auth0, Okta and others have productized it, and Christian Posta has &lt;a href="https://blog.christianposta.com/ai-agents-and-oidc-ciba/" rel="noopener noreferrer"&gt;made the case&lt;/a&gt; for it as the natural home for agent oversight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the protocol layer&lt;/strong&gt; , the tool server pauses and asks a question back through the client. MCP calls this elicitation and specifies it properly. It also assumes there is a client with a person attached to it, which puts us back at two in the morning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the infrastructure layer&lt;/strong&gt; , a gateway in the request path holds the call, notifies someone, and then releases or refuses it. Nothing in the agent changes, because the agent never learns it was held.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the runtime layer&lt;/strong&gt; , the agent framework pauses itself and checkpoints. LangGraph’s &lt;code&gt;interrupt()&lt;/code&gt; and Temporal’s durable execution both work this way: the pause is saved state rather than a blocked thread, so it survives a crash or a deploy.&lt;/p&gt;

&lt;p&gt;These are not four implementations of one feature. CIBA answers &lt;em&gt;what authority does this action now carry&lt;/em&gt;. Elicitation answers &lt;em&gt;what does the user want to happen&lt;/em&gt;. A gateway hold answers &lt;em&gt;should this request proceed&lt;/em&gt;. A durable interrupt answers &lt;em&gt;how does the work survive the wait&lt;/em&gt;. We started out treating them as alternatives and had to stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wait is the hard part
&lt;/h2&gt;

&lt;p&gt;A person takes minutes. A request does not.&lt;/p&gt;

&lt;p&gt;Hold the call open at a gateway and you get approval with no change to the agent at all — which is the whole reason to do it there — but you are now racing every timeout between the caller and you. Client timeouts, proxy idle timeouts, load balancer limits. You can raise them, but you raise them for all traffic, not just the held kind. Two minutes is generous by network standards and insulting by human ones.&lt;/p&gt;

&lt;p&gt;Return immediately instead, mark the call pending, and let the caller poll. TrueFoundry &lt;a href="https://www.truefoundry.com/blog/mcp-tool-approval-human-gate-call-path" rel="noopener noreferrer"&gt;describe this shape&lt;/a&gt; well and are honest about the cost: the client has to understand the convention and decide when to retry. That is a change to every agent you were trying to leave alone.&lt;/p&gt;

&lt;p&gt;Or push the pause into the runtime, where LangGraph and Temporal have already solved it properly. The wait is checkpointed, it survives a restart, and holding for an hour costs nothing. It also requires that you own the agent’s runtime, which rules out the third-party agent and the one you did not write.&lt;/p&gt;

&lt;p&gt;Each design pays one of those three prices. We pay the first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does an approval prove?
&lt;/h2&gt;

&lt;p&gt;When the log says the action was approved, what has actually been established?&lt;/p&gt;

&lt;p&gt;In the strong version: this named person, authenticated at this strength, saw this specific request with these specific arguments, and decided at this time. In the weak version: a push went somewhere and something came back green.&lt;/p&gt;

&lt;p&gt;In our case it was the notification channel that opened the gap between the two. We integrated Cisco Duo as an approval backend, because it is already deployed at the kind of enterprise we work with and the push-to-phone experience is exactly right for the two-in-the-morning case. But Duo’s status response tells us the transaction was approved. It does not tell us who approved it, or on what device. So the approver we can record is the one we were configured to ask, not the one who actually tapped. Our first-party path, where someone answers through an authenticated session, can name the individual. The Duo path cannot.&lt;/p&gt;

&lt;p&gt;That is not a complaint about Duo, which is doing exactly what a second-factor product is designed to do. It is a warning about reading approval logs — and it is the strongest argument for the CIBA model, where the approver’s identity travels inside the token rather than sitting in a log line beside it.&lt;/p&gt;

&lt;p&gt;If you are choosing a design, ask what it can prove, not what it can block. Blocking is the easy half.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approval should not create permission
&lt;/h2&gt;

&lt;p&gt;There is a design fork here, and we came down firmly on one side of it.&lt;/p&gt;

&lt;p&gt;When the human says yes, does that &lt;em&gt;create&lt;/em&gt; permission, or does it &lt;em&gt;satisfy a condition&lt;/em&gt; in permission that already existed? CIBA takes the first path by construction: the approval mints a token, and the token is new authority. That is clean and portable, and it also means a leaked token is authority in someone else’s hands until its window closes.&lt;/p&gt;

&lt;p&gt;We took the second path. In Lynx a gate is an ordinary Cedar &lt;code&gt;forbid&lt;/code&gt; rule with an annotation and a condition attached:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rego"&gt;&lt;code&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;approvalRequired&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Approve transfer_funds on treasury"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;forbid&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;principal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;unless&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;approval&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;granted&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The annotation marks the rule as worth holding and carries the prompt the person reads. The &lt;code&gt;unless&lt;/code&gt; clause is what an approval satisfies. Both halves are required, and our linter rejects one without the other.&lt;/p&gt;

&lt;p&gt;The consequence is the part I care about: the gateway never turns a deny into an allow. If the agent was not permitted to reach that server in the first place, no amount of approval gets it there, and the request is refused immediately rather than paging someone at 2am to rubber-stamp something that was never going to work. Approval is one input to a decision still made by policy. It is not a manual override, and I would not be comfortable shipping one that was.&lt;/p&gt;

&lt;h2&gt;
  
  
  The person holding the phone
&lt;/h2&gt;

&lt;p&gt;Once a human is in the path, that human is a target, and the attacks are all about what the notification says. Most of what appears on an approval screen is influenced by someone else: the tool name comes from a server that may be compromised, the arguments come from a model that may have been steered by a retrieved document, and MCP annotations are explicitly hints rather than facts. Render all of that as one undifferentiated block and you are asking a half-awake person to spot a lie on a small screen. So we treat the rendering as a security control — authenticated caller identity first, written from what the gateway verified; caller-supplied arguments namespaced under an &lt;code&gt;arg.&lt;/code&gt; prefix so nothing can pose as provenance; text flattened and truncated. None of it is clever. The alternative is a phishing surface with a corporate logo on it.&lt;/p&gt;

&lt;p&gt;The quieter failure is fatigue. If the answer is always yes, the gate has stopped being judgment and become latency with an audit trail. Every change that reduces the number of prompts — batching, scoping, remembering a decision for a window — is also a change that puts fewer requests in front of a person. I do not think there is a way out of that tension, only a way to be deliberate about where you sit in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we have got to
&lt;/h2&gt;

&lt;p&gt;We build on &lt;a href="https://agentgateway.dev" rel="noopener noreferrer"&gt;agentgateway&lt;/a&gt; as our data plane, and Solo’s enterprise build already ships human approval with notifications out to Slack, email and mobile. This is not new ground, so I would rather say what we learned than claim novelty.&lt;/p&gt;

&lt;p&gt;We hold at the gateway, gated by Cedar, so that an agent nobody wants to modify can still be governed. We drive Duo’s asynchronous push for the out-of-band decision. That is deliberately &lt;em&gt;not&lt;/em&gt; CIBA — Duo has no backchannel authorization endpoint and no CIBA grant — but the shape is the same: client-initiated, decoupled device, poll for a decision. We built the seam to that shape so a real CIBA backend can sit behind it later without the policy surface changing. Since MCP’s specification declines to standardize an approval workflow, borrowing the shape of the standard next door seemed better than inventing a fifth one.&lt;/p&gt;

&lt;p&gt;What we have not solved: the hold is synchronous, so it carries the timeout cost above. There is a single global approver, where the problem wants routing by resource and by policy. It covers MCP tool calls and not yet the other paths an agent can take. And the trail does not yet surface the way it needs to for someone reconstructing an incident months later.&lt;/p&gt;

&lt;p&gt;I am writing this before those are fixed rather than after, because the feature is not the interesting part. The interesting part is that an identity specification, a protocol specification, a set of gateways and a set of agent frameworks all produce something different when a human says yes, and none of them drops into the place of another. That is worth working out now, while the designs are still soft enough to change.&lt;/p&gt;

&lt;p&gt;Agents will keep asking for permission to do consequential things while nobody is looking. We should be more precise about what we mean when we say a human approved it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/tigera-products/lynx/" rel="noopener noreferrer"&gt;Learn more about Lynx →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Further reading: &lt;a href="https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0.html" rel="noopener noreferrer"&gt;the OpenID CIBA specification&lt;/a&gt;; Christian Posta on &lt;a href="https://blog.christianposta.com/ai-agents-and-oidc-ciba/" rel="noopener noreferrer"&gt;agent autonomy and CIBA; Auth0’s asynchronous authorization&lt;/a&gt; for agents; TrueFoundry on &lt;a href="https://www.truefoundry.com/blog/mcp-tool-approval-human-gate-call-path" rel="noopener noreferrer"&gt;tool approvals at the gateway boundary&lt;/a&gt;; &lt;a href="https://docs.langchain.com/oss/python/langgraph/durable-execution" rel="noopener noreferrer"&gt;LangGraph durable execution&lt;/a&gt; and &lt;a href="https://temporal.io/blog/temporal-langgraph-plugin-durable-execution" rel="noopener noreferrer"&gt;Temporal’s LangGraph plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/hitl-for-autonomous-agents-where-does-the-human-go/" rel="noopener noreferrer"&gt;HITL for autonomous agents: Where does the human go?&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>AI Agents on Kubernetes 101: From Laptop Script to Production Pod</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Tue, 08 Sep 2026 20:16:27 +0000</pubDate>
      <link>https://dev.to/tigeraio/ai-agents-on-kubernetes-101-from-laptop-script-to-production-pod-4jj4</link>
      <guid>https://dev.to/tigeraio/ai-agents-on-kubernetes-101-from-laptop-script-to-production-pod-4jj4</guid>
      <description>&lt;p&gt;In short, this is a beginner’s guide to deploying an AI agent on Kubernetes. You will containerize an agent, store its API key as a Kubernetes secret, write a deployment with health probes and resource limits, expose it with a service, and lock down its network egress, in that order, with a working manifest at every step. On a local kind cluster the whole walkthrough takes about an hour. At the end: the six mistakes almost every first agent deployment makes, and the questions a 101 deployment leaves open.&lt;/p&gt;

&lt;p&gt;Every AI agent starts life the same way; a Python script on someone’s laptop, an API key in a &lt;code&gt;.env&lt;/code&gt; file, a &lt;code&gt;while&lt;/code&gt; loop around an LLM call. It works, it demos well. Then someone with a budget says “ship it,” and you, the engineer closest to the script, get to figure out what shipping an agent actually means.&lt;/p&gt;

&lt;p&gt;This guide is that path, walked slowly. It assumes you know what a container is and have met &lt;code&gt;kubectl a&lt;/code&gt;t least once, and it assumes nothing about agents. By the end you will have an agent running in a cluster with its key in a Secret, its resource usage capped, its health checked, and its network access reduced to the short list of places it has any business calling. That is still short of production-grade governance, but it is a deployment you could defend in a code review, which is more than most agents get.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Kubernetes a good place to run AI agents?
&lt;/h2&gt;

&lt;p&gt;The short answer is, because an AI agent is a workload that needs supervision, and Kubernetes is the most widely used system for supervising workloads. It restarts the agent when it crashes, caps how much CPU and memory it can consume, injects its credentials (e.g. API keys) at runtime instead of baking them into the code, and describes all of it in version-controlled YAML manifest your team can review. Just as important, Kubernetes gives you control over the agent’s environment, such as, what it can reach on the network, what identity it carries, what happens when it misbehaves. That matters more for agents than for ordinary services, because an agent’s behavior is decided at runtime by a model, so the rules have to live outside the agent, where no prompt can talk its way past them. That argument deserves more than a paragraph, so we gave it a full post: &lt;a href="https://www.tigera.io/blog/the-safest-place-to-run-an-ai-agent-is-on-a-cluster-that-doesnt-trust-it/" rel="noopener noreferrer"&gt;The Safest Place to Run an AI Agent Is a Cluster That Doesn’t Trust It&lt;/a&gt; makes the case with a year of real incidents as evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is deploying an agent different from deploying a web service?
&lt;/h2&gt;

&lt;p&gt;Mechanically, it barely is. An agent is a long-running process that speaks HTTP; Kubernetes has been running those for a decade. The difference is in what the workload does with its freedom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A web service follows its code.&lt;/strong&gt; An agent follows a model. You can read a service’s code and know its behavior. An agent’s next action depends on whatever lands in its context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An agent holds credentials and acts.&lt;/strong&gt; It calls APIs, queries databases, sends messages. A wrong answer is a bug; a wrong &lt;em&gt;action&lt;/em&gt; is an incident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every input is potentially an instruction.&lt;/strong&gt; Prompt injection is unsolved. Text the agent reads, from a user, a document, or another agent, can try to redirect it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the deployment steps below are the same ones you would use for any service. The difference is emphasis: the steps most tutorials treat as optional hardening (secrets, limits, egress control) are, for agents, the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need before you start
&lt;/h2&gt;

&lt;p&gt;Four things, all free:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A cluster&lt;/strong&gt;. Locally, &lt;a href="https://kind.sigs.k8s.io/" rel="noopener noreferrer"&gt;kind&lt;/a&gt; runs Kubernetes inside Docker: &lt;code&gt;kind create cluster --name agents&lt;/code&gt;. Any managed cluster (EKS, GKE, AKS) works the same way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kubectl and Docker&lt;/strong&gt; , installed and talking to that cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An agent that speaks HTTP&lt;/strong&gt;. Any framework is fine. LangGraph, CrewAI, Google ADK, etc all wrap into a web server; we compared them in &lt;a href="https://www.tigera.io/blog/six-ai-agent-sdks-for-enterprise-kubernetes-compared/" rel="noopener noreferrer"&gt;Six AI Agent SDKs for Enterprise Kubernetes&lt;/a&gt;. The walkthrough uses a generic Python agent served by FastAPI on port 8080, with two routes: &lt;code&gt;POST /chat&lt;/code&gt; for work and &lt;code&gt;GET /healthz&lt;/code&gt; that returns 200 when the process is up. If your agent lacks a health route, add one first. It is five lines, and step 4 depends on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An LLM API key.&lt;/strong&gt; From whichever provider your agent calls.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One namespace keeps the experiment contained:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create namespace agents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1: Containerize the agent
&lt;/h2&gt;

&lt;p&gt;Kubernetes runs containers, so the script becomes an image. A minimal Dockerfile for a Python agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.12-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; 1000&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;
&lt;span class="c"&gt;# change the command (to run agent) according to its framework documentation&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two lines here are security decisions. &lt;code&gt;USER 1000&lt;/code&gt; runs the agent as a non-root user, so a compromised agent is not root inside its container. And notice what is &lt;em&gt;absent&lt;/em&gt;: no API key. The key never enters the image. An image is copied to registries, cached on nodes, and pulled by anyone with access; a key baked into an image is a key you have already leaked, you just don’t know to whom yet.&lt;/p&gt;

&lt;p&gt;Build it and, for kind, load it into the cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; support-agent:0.1.0 &lt;span class="nb"&gt;.&lt;/span&gt;
kind load docker-image support-agent:0.1.0 &lt;span class="nt"&gt;--name&lt;/span&gt; agents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a real cluster you would push to a registry instead. Either way, tag with a version (e.g., &lt;code&gt;0.1.0&lt;/code&gt;), never &lt;code&gt;latest&lt;/code&gt;. You want to be able to say exactly what is running, and roll back to exactly what was running before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Put the API key in a Secret
&lt;/h2&gt;

&lt;p&gt;The&lt;code&gt;.env&lt;/code&gt; file’s job is taken over by a Kubernetes Secret:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; agents create secret generic support-agent-secrets 
  &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'sk-ant-...'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Secret lives in the cluster, is delivered to the pod as an environment variable at start time, and can be rotated without rebuilding the image. Two honest caveats for later: Secrets are base64-encoded, not encrypted, so real clusters enable encryption at rest and restrict who can read them with RBAC; and the agent’s own process can still read this variable, which matters once you worry about prompt injection. Hold that thought for the end of the article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Write the Deployment
&lt;/h2&gt;

&lt;p&gt;The Deployment is the contract: which image, how many copies, what resources, what health checks. Save this as &lt;code&gt;deployment.yaml&lt;/code&gt;:&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;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;support-agent&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents&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&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-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;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&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-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&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-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;automountServiceAccountToken&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;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&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;true&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;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;support-agent:0.1.0&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;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&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;support-agent-secrets&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="s"&gt;100m&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;256Mi&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;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;1"&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;512Mi&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;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/healthz&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;8080&lt;/span&gt;
            &lt;span class="na"&gt;initialDelaySeconds&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;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;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/healthz&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;8080&lt;/span&gt;
            &lt;span class="na"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&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;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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply it with &lt;code&gt;kubectl apply -f deployment.yaml&lt;/code&gt;, then read it back top to bottom, because every block answers a question a reviewer will ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;automountServiceAccountToken: false&lt;/code&gt;:&lt;/strong&gt; By default every pod gets a token for the Kubernetes API mounted into its filesystem. Your agent doesn’t need to talk to the Kubernetes API, so it doesn’t get the token. For an agent this is not a nicety. It is the difference between “prompt injection stole a chat log” and “prompt injection got a foothold in my cluster’s control plane.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resources&lt;/strong&gt; : Requests are what the scheduler reserves; limits are the ceiling. Agents fail in loops. A model that decides to retry forever, or to summarize a document by reading it into memory in one piece, will eat a node if you let it. Limits turn “the cluster is down” into “one pod got throttled.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;readinessProbe&lt;/code&gt; and &lt;code&gt;livenessProbe&lt;/code&gt;&lt;/strong&gt; : Readiness controls whether traffic is sent to the pod; liveness restarts it when the process wedges. Without them, Kubernetes considers a hung agent healthy forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;envFrom.secretRef&lt;/code&gt;&lt;/strong&gt; : The key from step 2 arrives as an environment variable. Code reads &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; exactly as it did from the &lt;code&gt;.env&lt;/code&gt; file. Nothing about the agent’s code had to change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check it comes up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; agents get pods
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; agents logs deploy/support-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Expose it with a Service
&lt;/h2&gt;

&lt;p&gt;Pods are ephemeral and their IPs change. A Service gives the agent a stable name:&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;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;support-agent&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents&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&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-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;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
      &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now anything inside the cluster can reach the agent at &lt;code&gt;http://support-agent.agents.svc&lt;/code&gt;. From your laptop, test through a port-forward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; agents port-forward svc/support-agent 8080:80
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST localhost:8080/chat &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; 
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"message": "hello"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you get an answer, you have an AI agent running on Kubernetes. Most tutorials stop here. Do not stop here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Close the doors it doesn’t need
&lt;/h2&gt;

&lt;p&gt;Right now your agent can open a connection to anything: every pod in the cluster, every address on the internet. For a web service that is untidy. For an agent it is the whole attack surface, because the standard end of a prompt-injection chain is exfiltration: the agent is talked into sending data somewhere it should never call. A NetworkPolicy makes egress deny by default:&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;support-agent-egress&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents&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&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-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="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="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;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="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;53&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;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;This allows DNS lookups plus outbound HTTPS, and nothing else; a connection to another pod, or plaintext HTTP to anywhere, now fails at the network layer (Note for kind users: enforcing NetworkPolicy requires a network plugin that implements it, such as &lt;a href="https://docs.tigera.io/calico/latest/getting-started/kubernetes/kind" rel="noopener noreferrer"&gt;Calico&lt;/a&gt;; the kind default does not).&lt;/p&gt;

&lt;p&gt;The policy still has one hole, and it is an instructive one: “TCP 443 to anywhere” lets the agent reach any HTTPS endpoint on the internet, including an attacker’s. Vanilla NetworkPolicy speaks IPs and ports; it cannot say “only &lt;code&gt;api.anthropic.com&lt;/code&gt;.” Narrowing egress to named destinations takes either a DNS-aware policy engine (Calico can do this) or, better for agents, an egress gateway that all agent traffic must pass through. Remember this gap. It is where 101 ends and the last section of this article begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six mistakes every first agent deployment makes
&lt;/h2&gt;

&lt;p&gt;The walkthrough above quietly avoided all six. Here they are in the open, because you will meet them in other people’s manifests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Mistake&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why it hurts an agent especially&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Instead&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API key baked into the image&lt;/td&gt;
&lt;td&gt;Images get pulled, cached, and shared; the agent’s key is its power&lt;/td&gt;
&lt;td&gt;Kubernetes Secret, injected at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No resource limits&lt;/td&gt;
&lt;td&gt;Agents fail in loops; one runaway loop starves the node&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;requests&lt;/code&gt; and &lt;code&gt;limits&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;latest&lt;/code&gt; image tag&lt;/td&gt;
&lt;td&gt;You cannot say which agent behavior is running, or roll back&lt;/td&gt;
&lt;td&gt;Version tags, ideally digests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No health probes&lt;/td&gt;
&lt;td&gt;A wedged agent looks healthy and keeps receiving work&lt;/td&gt;
&lt;td&gt;&lt;code&gt;readinessProbe + livenessProbe&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default ServiceAccount token mounted&lt;/td&gt;
&lt;td&gt;Injected agent inherits a path to the Kubernetes API&lt;/td&gt;
&lt;td&gt;&lt;code&gt;automountServiceAccountToken: false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unrestricted egress&lt;/td&gt;
&lt;td&gt;Prompt injection ends in exfiltration over open egress&lt;/td&gt;
&lt;td&gt;Default-deny NetworkPolicy, then allowlist&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the middle column again. None of these is an exotic agent problem; they are ordinary Kubernetes hygiene. Agents just raise the price of skipping them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a 101 deployment still can’t answer
&lt;/h2&gt;

&lt;p&gt;You now have one agent, contained and supervised. Before you call it production, try to answer three questions about it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Who is this agent?&lt;/strong&gt; Your cluster knows it as a pod with a label. Nothing cryptographically distinguishes it from any other workload, so nothing downstream can grant it permissions &lt;em&gt;as an agent&lt;/em&gt;, or refuse an impostor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What exactly is it allowed to do?&lt;/strong&gt; Your NetworkPolicy says “HTTPS, somewhere.” It cannot see that the agent is calling an MCP tool, or with what arguments. “May this agent call &lt;code&gt;delete_records&lt;/code&gt; on the billing server” is not a question any layer you have deployed can even parse. We walked through why the stock building blocks stop short in the &lt;a href="https://www.tigera.io/blog/the-ai-agent-accountability-gap-why-network-policies-api-gateways-and-rbac-are-not-enough/" rel="noopener noreferrer"&gt;accountability gap post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What did it do last Tuesday?&lt;/strong&gt; You have pod logs, written by the agent itself. An agent’s own narration is not an audit trail; the best-documented case of an agent deleting a production database came with the agent confidently reporting that rollback was impossible. It was not.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And this is with one agent. The moment there are two, they start talking to each other (that is the&lt;a href="https://www.tigera.io/blog/how-ai-agents-communicate-understanding-the-a2a-protocol-for-kubernetes/" rel="noopener noreferrer"&gt;A2A protocol&lt;/a&gt;), and the questions multiply by every pair.&lt;/p&gt;

&lt;p&gt;That missing layer (identity, per-request authorization, and audit across a fleet of agents) is what &lt;a href="https://www.tigera.io/blog/why-we-built-lynx-bringing-control-to-the-age-of-ai-agents/" rel="noopener noreferrer"&gt;Tigera Lynx&lt;/a&gt; adds on top of exactly the deployment you just built. Lynx gives every agent a SPIFFE or OIDC workload identity, routes agent-to-agent, MCP, and LLM traffic through a gateway that authorizes each request under Cedar policy, and records every hop in an Agent Trail the agent cannot edit. Recent releases sharpened the credential story from this post’s step 2: provider keys attach at the gateway instead of living in the pod’s environment, per-hop tokens are minted with an audience of one target so a stolen token is nearly worthless, and an OAuth authorization-code flow can issue per-user credentials. Policies can require human approval before a risky MCP call proceeds. On the node, an eBPF detector spots agents nobody registered and can quarantine a compromised one down to blocking its network writes at the kernel, and a policy playground in the UI lets you test a Cedar policy against simulated requests before it ever gates real traffic.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Do I need a GPU to deploy an AI agent on Kubernetes?&lt;/strong&gt; No. An agent is orchestration code that calls a model over an API; the GPUs live with the model provider. You only need GPU nodes if you self-host the model itself, which is a separate project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is Kubernetes overkill for a single agent?&lt;/strong&gt; For a weekend experiment, yes; run it locally. But the reasons to move to Kubernetes (restarts, secrets, resource caps, network control) show up the first time the agent touches real credentials or real users, which happens earlier than most teams expect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can I do all of this on my laptop?&lt;/strong&gt; Yes. Everything above runs on a kind cluster in Docker, including the NetworkPolicy if you install a plugin like Calico that enforces it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which agent framework works best on Kubernetes?&lt;/strong&gt; Any framework that can serve HTTP deploys the same way. The differences show up in observability, state handling, and protocol support; our &lt;a href="https://www.tigera.io/blog/six-ai-agent-sdks-for-enterprise-kubernetes-compared/" rel="noopener noreferrer"&gt;six-SDK comparison&lt;/a&gt; covers them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How do I scale an agent to more replicas?&lt;/strong&gt; Set &lt;code&gt;replicas: 3&lt;/code&gt; and Kubernetes load-balances across them, but only if the agent keeps its conversation state outside the pod (a database or cache), since any replica may serve the next request. Stateless agents scale for free; stateful ones need that refactor first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How is deploying an agent different from deploying a model?&lt;/strong&gt; A model deployment serves inference (weights on GPUs behind an endpoint). An agent deployment runs the loop that calls models and tools to pursue a goal. This guide covers the agent; most teams consume the model as a managed API.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ship the pod, then ask the harder question
&lt;/h2&gt;

&lt;p&gt;Back to that laptop script. The distance from &lt;code&gt;.env&lt;/code&gt; file to the deployment in this article is five manifests and an afternoon, and every step was ordinary Kubernetes, applied with an agent’s failure modes in mind. That is the good news: you do not need new infrastructure to give an agent a safer home than a laptop. You need the infrastructure you already have, used deliberately.&lt;/p&gt;

&lt;p&gt;The harder question arrives with agent number two: when they start acting on each other’s behalf, who is checking identity at the door, and where is the record? Deploying the agent was the easy 101. Trusting it is a course Kubernetes alone does not teach.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lynx is Tigera’s security and governance platform for AI agents on Kubernetes: identity, policy, detection, and audit for every agent in your cluster. Read &lt;a href="https://www.tigera.io/blog/how-lynx-works-a-technical-walkthrough/" rel="noopener noreferrer"&gt;How Lynx Works&lt;/a&gt; or request early access at &lt;a href="https://www.tigera.io/demo/?product=lynx" rel="noopener noreferrer"&gt;tigera.io/demo/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tigera.io/tigera-products/lynx/" rel="noopener noreferrer"&gt;Learn more about Lynx →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/ai-agents-on-kubernetes-101-from-laptop-script-to-production-pod/" rel="noopener noreferrer"&gt;AI Agents on Kubernetes 101: From Laptop Script to Production Pod&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>aiagentsecurity</category>
    </item>
    <item>
      <title>Meet Mylo: An AI-native way to work with Calico</title>
      <dc:creator>Alister Baroi</dc:creator>
      <pubDate>Thu, 03 Sep 2026 18:21:50 +0000</pubDate>
      <link>https://dev.to/tigeraio/meet-mylo-an-ai-native-way-to-work-with-calico-2i53</link>
      <guid>https://dev.to/tigeraio/meet-mylo-an-ai-native-way-to-work-with-calico-2i53</guid>
      <description>&lt;p&gt;&lt;em&gt;A library of Calico tools and skills — delivered through the Calico MCP Server&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What if your hardest network question took ten minutes instead of ten days?
&lt;/h2&gt;

&lt;p&gt;Anyone who has operated Kubernetes networking at scale knows the shape of a bad day. A request that should succeed is quietly failing. The application team swears nothing changed. Somewhere across a stack of tiers, selectors, and policies, some written last week and some inherited from an engineer who left two years ago, a rule is denying the traffic. Finding it means reading YAML, cross-referencing flow logs, and reconstructing the policy evaluation order in your head. For a genuinely knotty case, that work can stretch across days and pull in more than one team before anyone gets to the bottom of it.&lt;/p&gt;

&lt;p&gt;I think that day is about to get a lot shorter. Today we’re introducing Mylo, an expert for Calico that works inside the AI tools your teams already use. Ask Mylo why a pod can’t reach a service, and it traces the path, points to the exact policy and rule doing the blocking, and explains why in plain language, in about the time it took you to read this paragraph. Mylo is the library of tools and skills that makes Tigera’s Calico expertise usable by an agent; the Calico MCP Server is how we deliver it. The rest of this post covers what it is, how we designed it, and why we made the choices we did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Mylo really is: A decade of Calico expertise, as tools and skills
&lt;/h2&gt;

&lt;p&gt;Before getting into how Mylo is delivered, it’s worth being clear about what it actually is, because the delivery mechanism is the least interesting part of the story. Mylo is the Calico and Kubernetes networking knowledge Tigera has accumulated over ten years, turned into something an AI agent can use directly. It comes as two layers, and those two layers, not the plumbing that delivers them, are where the value sits.&lt;/p&gt;

&lt;p&gt;The first is a small set of tools. These aren’t thin wrappers over CLI commands; they’re semantic. The flagship, diagnose_connectivity, doesn’t hand back a raw dump for the model to interpret. It returns an ordered, opinionated read of the network path, down to the specific rule that allows or denies, with a suggested fix. The expertise lives in the tool; the reasoning stays with the agent.&lt;/p&gt;

&lt;p&gt;The second layer, and the one that compounds over time, is skills: higher-level workflows that string those tools into the procedures an expert would actually follow. Troubleshooting a connectivity failure, triaging an incident, reviewing a policy before it ships: each is a multi-step reasoning pattern, and a skill encodes it, so the agent diagnoses, then traces the policy chain, then checks recent denials, then explains the offending rule, in that order. This is the part I’d point to first. A decade of Tigera’s own troubleshooting expertise, the kind that usually lives in the heads of a handful of senior engineers, is captured here as structured guidance an agent can carry out, rather than a static runbook a human has to follow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an MCP server, and why now
&lt;/h2&gt;

&lt;p&gt;Two things are true about the platform and security engineers who run Calico today. The first is that they are already deep in agentic workflows. In nearly every conversation we’ve had over the past few months, teams weren’t debating whether to adopt an AI assistant. They had already standardized on one, whether that’s a coding assistant in the IDE or an agent in the terminal, and connected it to a set of MCP servers for their metrics, logs, tickets, and source control. The Model Context Protocol has quietly become the way infrastructure tools present themselves to agents.&lt;/p&gt;

&lt;p&gt;The second is that Calico holds a lot of the context those engineers need, and it isn’t always easy to reach. The policy model is powerful because it’s expressive, with tiers, global and namespaced policies, selectors, and ordered evaluation. That same expressiveness, however, is what makes a thorny connectivity problem hard to reason about when you’re under pressure. Flow logs hold the answer to “why was this blocked,” but writing the query to surface it is a skill of its own.&lt;/p&gt;

&lt;p&gt;Delivering that expertise over MCP sits naturally between those two facts. Rather than build yet another chat interface and ask teams to approve a new AI product with access to production, we expose Mylo’s tools so any MCP-compatible agent can call them. Your engineers keep the front-end they’ve already vetted, and Calico becomes the intelligence layer underneath it. MCP is the delivery mechanism, not the substance, but it’s the right one, because it puts Calico’s knowledge directly into the reasoning loop of an agent that is already helping your team get work done. This is a new way to work with the Calico Unified Platform. It doesn’t replace the CLI or the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composability: Workflows that weren’t possible before
&lt;/h2&gt;

&lt;p&gt;The reason this approach matters, beyond the convenience of asking questions in plain English, is composability, and it’s worth reviewing, because a lot of teams are still early in adopting MCP. A tool exposed over MCP is a building block an agent can combine with every other capability it can reach. When Mylo runs alongside the MCP servers a team already uses, the agent can move across all of them in a single line of reasoning, and that unlocks workflows nobody shipped as a feature.&lt;/p&gt;

&lt;p&gt;Consider a request like this one: “Find the traffic denied by the policy I shipped this morning, correlate it with the elevated 5xx rate the monitoring tool flagged, and open a ticket with the policy diff to fix it.” Three systems answer that in a single pass. Mylo supplies the Calico half, the expert half, and the team’s existing monitoring and issue-tracking servers supply the rest, with the agent orchestrating the whole thing end to end. The same shape shows up all over an operations workflow. Before a pull request merges, the agent can ask Mylo to simulate the policy change against last week’s flow logs and post the impact summary to the team’s channel. When flow logs show a denied connection from a production service, it can page whoever is on call. None of those are workflows we built, and none of them existed as a product a team could buy.&lt;/p&gt;

&lt;p&gt;What I find encouraging is that we didn’t have to anticipate any of them. A traditional integration or dashboard can only run the paths its authors designed in advance. Because Mylo exposes a small set of well-designed, semantically clear tools, each team fits it into the operational reality they already have, and some of the most valuable workflows will be ones we never designed for.&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%2Fyi7gs2idnbtzj4mq58cu.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%2Fyi7gs2idnbtzj4mq58cu.png" alt="Figure: Composability — Mylo alongside the tools you already run" width="800" height="583"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure: Composability — Mylo alongside the tools you already run&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The design philosophy: Restraint
&lt;/h2&gt;

&lt;p&gt;If one principle shaped Mylo more than any other, it’s restraint. The instinct when you build for an agent is to expose everything, to ship a tool for every API method and every CLI subcommand and let the model sort it out. In our view that instinct is a mistake, and we’ve worked hard to resist it.&lt;/p&gt;

&lt;p&gt;More tools is not better. Every tool you hand an agent is a claim on its attention, another chance for it to pick the wrong one, and another line item in the token budget. A server with a hundred thin wrappers around CLI commands doesn’t make an agent smarter. It makes it slower, more expensive, and more likely to wander off. That’s why Mylo’s tools are deliberately few and semantic rather than mechanical, and why the intelligence sits in the tool itself rather than in the model’s attempt to reconstruct it from unstructured output.&lt;/p&gt;

&lt;p&gt;We wrote down the principles we kept returning to, half in earnest and half tongue-in-cheek. A few are worth calling out, because they’re where the harder decisions actually landed. Read-only by default, because the safe posture should never depend on someone remembering to configure it. State, not verdicts, because a good tool should report what is true and let the agent do the reasoning, rather than pre-baking a conclusion that strips away the context the model needs. Selectors, not switches, because tools should accept rich, expressive inputs instead of sprouting a new boolean flag for every situation. And the one we keep at the very bottom as a reminder to ourselves: thou shalt not ship a tool for every API method.&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%2Fs6thzi20s0bp1pud0agm.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%2Fs6thzi20s0bp1pud0agm.png" alt="Figure: The Ten Commandments of MCP Servers — the design principles behind Mylo" width="800" height="503"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure: The Ten Commandments of MCP Servers — the design principles behind Mylo&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One more piece of architecture turns that discipline into something trustworthy: the router. Agents are eager to be helpful, and an agent that can’t reach a tool will often shell out instead, quietly running a CLI command to answer a question rather than admitting the question is outside its lane. That’s harmless right up until it isn’t, and for a tool that touches production networking, silent fallback is a trust problem. So Mylo can be invoked explicitly, and when a request comes in, the server tells the agent clearly whether it can actually handle it rather than letting it improvise around the edges. That deterministic guidance, with explicit boundaries, is what earns the confidence of a platform team.&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%2Fnk4eeizour7eutwzsgj1.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%2Fnk4eeizour7eutwzsgj1.png" alt="Figure: How Mylo handles a request — from a plain-language ask to an evidence-backed answer" width="799" height="556"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure: How Mylo handles a request — from a plain-language ask to an evidence-backed answer&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Built to grow without slowing down
&lt;/h2&gt;

&lt;p&gt;The natural question about a deliberately focused toolset is whether it can grow in scope without growing unwieldy. I’d argue the architecture is exactly what lets us expand without the usual penalty. Because skills are invoked in context and the router keeps each request scoped to what’s relevant, adding a new capability doesn’t tax the ones already there. A troubleshooting session doesn’t get slower or noisier because we’ve also taught Mylo to help with a migration. Breadth comes from adding well-described skills and the focused tools they lean on, not from piling more surface area onto every interaction. In practice that means the range of what Mylo can do for you keeps growing while the cost of any single interaction stays flat.&lt;/p&gt;

&lt;p&gt;We’re being disciplined about sequencing, and read-only diagnostics and observability come first because that’s where the pull is strongest. The roadmap ahead is broad, though. Policy authoring is a natural next step, generating well-formed Calico policy from a plain description of intent and presenting it for review before anything is applied. We see real appetite for migration assistance, whether that’s moving VMs into Kubernetes, moving from Ingress to the Gateway API, or moving from Istio sidecars to Ambient. Configuration of Calico resources such as load balancers and egress gateways fits the same pattern. And compliance reporting keeps coming up in customer conversations, from summarizing an application’s secured egress destinations to demonstrating that PCI workloads aren’t communicating with non-PCI workloads, the kind of evidence a security team can hand to an auditor. Each of these is a skill and a small set of tools layered onto the same foundation, so we can keep growing what Mylo does for you without disturbing the safe, composable core underneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways to run it: Live cluster or diagnostics bundle
&lt;/h2&gt;

&lt;p&gt;Mylo works against a live cluster, connecting through the same kubeconfig path your engineers already use for kubectl and calicoctl, with no new endpoint exposed. That’s the mode for real-time diagnostics and observability, for asking what is happening in the cluster right now.&lt;/p&gt;

&lt;p&gt;It also works entirely offline, pointed at a Calico diagnostics bundle. This matters more than it first appears. A bundle is portable, shareable, and detached from the live environment, which makes it a good fit for the many settings where a laptop simply cannot reach production: air-gapped estates, tightly controlled prod, or after-the-fact analysis where the state you care about is the one captured at the moment of failure. The same tools and the same skills run against both. An engineer can triage a captured bundle on a plane and run live diagnostics from their desk using the identical workflow. Supporting both was not an afterthought. It’s how we’ve been able to test Mylo so thoroughly, and it’s what lets it meet enterprises where their access model actually sits.&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%2Fnk4eeizour7eutwzsgj1.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%2Fnk4eeizour7eutwzsgj1.png" alt="Figure: How Mylo handles a request — from a plain-language ask to an evidence-backed answer" width="799" height="556"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure: How Mylo handles a request — from a plain-language ask to an evidence-backed answer&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Read-only by design
&lt;/h2&gt;

&lt;p&gt;For the teams evaluating Mylo, the first question is almost always about safety, and our answer is deliberately conservative. Mylo is read-only by design. Its tools diagnose, explain, observe, and where they touch policy, generate proposed YAML. They do not apply, update, or delete anything. This holds even when Mylo is handed a cluster-admin kubeconfig, because the read-only boundary is a property of the tools themselves and not something we’re trusting the model to honor. Security teams have appreciated that they can point their own agent at the server and audit for themselves exactly what it can and cannot do.&lt;/p&gt;

&lt;p&gt;The result is a much narrower profile than the interfaces these teams have already approved. Mylo is a typed, structured API with no browser session, no rendered pages, and no standing state to hijack. Access runs through the calling user’s existing Kubernetes RBAC, so if a user can’t list policies in a namespace, neither can Mylo on their behalf. That makes for a far shorter security conversation than approving a net-new AI product, largely because there is no new AI product to approve. The reasoning happens in a front-end the customer already trusts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the internal testing showed
&lt;/h2&gt;

&lt;p&gt;We didn’t want to announce a promising demo. Before we put Mylo in front of anyone, we ran it against our own library of resolved support cases, real and historically difficult problems where we already knew the answer and how long it had originally taken to reach. It’s a demanding benchmark, because it measures Mylo against outcomes that skilled engineers had already worked hard to produce.&lt;/p&gt;

&lt;p&gt;The results are the reason we’re writing this post. A class of case that historically took on the order of ten days to root-cause, the kind that bounces between teams and keeps escalating, Mylo worked through in roughly ten minutes. Not every case, and never without a person in the loop reading the output and making the call. But the pattern held often enough, across enough cases, that we’re confident this is real and repeatable. Compressing days of investigation into minutes changes what an under-resourced operations team is able to take on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early access, and what we’re seeing
&lt;/h2&gt;

&lt;p&gt;Mylo is in early access now with a small group of design partners. They are large, security-conscious organizations, several of them in regulated industries, and all of them already fluent in agentic workflows. We’re keeping the program deliberately tight so we can learn quickly, and we’re bringing participants on in waves rather than opening the gates all at once.&lt;/p&gt;

&lt;p&gt;The early signal has been better than we expected. Participants aren’t just kicking the tires; some are reaching for Mylo daily. One of the more encouraging patterns is teams using it to scope problems they simply couldn’t get their arms around before, such as surveying years of accumulated policy sprawl to find what’s orphaned or duplicated, work that used to mean writing custom tooling nobody had time to build. That read-only, get-the-data-out-of-Calico use case has been the wedge almost everywhere. The fastest path to value is answering “why is this happening” in plain English, and the appetite for it is real.&lt;/p&gt;

&lt;h2&gt;
  
  
  The road to GA
&lt;/h2&gt;

&lt;p&gt;Early access is showing us what enterprise-ready has to mean, and the requirements have been remarkably consistent from one team to the next. On the way to general availability we’re focused on a few things: an in-cluster deployment option for teams that want Mylo owned and run by the platform rather than launched from a laptop; authentication and RBAC that carry each user’s real cluster permissions through to every tool call; tiered access that builds on the read-only foundation with a staged suggest tier, where policy changes are proposed as reviewable diffs and applied only after a human approves; and audit logging that records every tool invocation for the compliance and security teams who, rightly, want the full trail.&lt;/p&gt;

&lt;p&gt;None of that changes the core posture. Mylo starts safe, stays composable, and earns each new capability rather than assuming it. That’s the philosophy that got us here, and it’s the one we intend to keep.&lt;/p&gt;

&lt;p&gt;If you run Calico and your teams are already working with AI agents, we’d love to have you see this early. Mylo is how Calico shows up in that world, and I think it’s going to change what a hard networking day looks like.&lt;/p&gt;

&lt;p&gt;If you’re not a customer yet and would like to learn more about Mylo, &lt;a href="https://www.tigera.io/contact/" rel="noopener noreferrer"&gt;drop us a line here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.tigera.io/blog/meet-mylo-an-ai-native-way-to-work-with-calico/" rel="noopener noreferrer"&gt;Meet Mylo: An AI-native way to work with Calico&lt;/a&gt; appeared first on &lt;a href="https://www.tigera.io" rel="noopener noreferrer"&gt;Tigera – Creator of Calico&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technicalblog</category>
      <category>calicoai</category>
      <category>products</category>
      <category>announcements</category>
    </item>
  </channel>
</rss>
