Skip to content

Sanctioned and Shadow agents

Requires @openlatch/client 0.11.11 or later

Every agent on a host running the client reads Sanctioned or Shadow. The status tells you whether the agent works on a subscription your company pays for and has allowed for its owner, so you can see at a glance which agents run on an account you did not choose.

OpenLatch classifies the agents on hosts running the client. Agents on machines without the client are not discovered or classified: discovery of shadow AI across machines without the client is not available.

Each agent reports the subscription its model calls run under: an organization, a workspace, a team, a cloud project or account, or a model gateway. Read a session’s subscription, model and effort lists every kind and where the client reads it. An administrator declares the company’s official subscriptions in Settings › General › Agent Subscriptions, each with the org units it is allowed in; see Declare your agent subscriptions.

OpenLatch compares the two. The comparison uses the subscription identifier alone: no email address and no identity signal takes part, so the status works the same whether identity signal collection is on or off.

The agent is Sanctioned when the subscription it reported last is declared and allowed for its owner’s org unit. Otherwise it is Shadow, with exactly one reason:

ReasonWhenAlerts
Subscription not officialThe agent reports a subscription that no declaration namesYes
Org unit not allowedThe subscription is declared, but only for org units that do not hold the agent’s ownerYes
Subscription can’t be determinedThe agent reports no subscription, for example when it uses a raw API keyNo
User can’t be placedThe subscription is declared for some org units only, and the agent’s owner sits in none, for example because the owner could not be resolvedNo

A declaration allowed for the whole organization makes every agent on that subscription Sanctioned, wherever its owner sits. A declaration limited to org units covers those units and every unit below them.

The agent’s org unit is its owner’s unit, as the Identity tab shows it. For an agent that acts for a service, it is the unit of the person accountable for the service, else the unit the service is assigned to. A change to an owner, to a person’s unit or to the org tree changes the status on the next read.

On a machine shared by several people, the client counts one agent per OS user: each OS user’s agent is a separate agent, read from its own owner. People who share one OS account share one agent.

The status is derived from the subscription identifier the client reports. OpenLatch does not check that identifier against the provider and does not prove which account an agent uses. Sanctioned means the agent reports an official subscription, never that its account is verified. The status classifies an agent: it never changes a verdict, and it never blocks or pauses an agent.

The status covers a misbehaving agent, not a malicious one: a machine that reports a wrong identifier, by misconfiguration or otherwise, reads as that identifier.

What reads “Subscription can’t be determined”

Section titled “What reads “Subscription can’t be determined””
SituationWhy
The agent uses a raw API keyA key reveals no organization without calling the provider, which OpenLatch never does
OpenCode or DevinThe client reads no subscription for them
A machine on a client older than 0.11.11Older clients report no subscription
A Cursor agent behind a company gatewayThe client reads no gateway setting for Cursor, so it reads its Cursor team, or nothing

A Gateway declaration covers only Claude Code, Codex CLI and Cline agents, the agents for which the client reads a gateway. A gateway hostname shared by many companies, such as a public gateway service, identifies no company: declaring one makes every agent that uses that service Sanctioned.

The status is computed each time you read it. A new declaration, a deleted one or an edited list of org units shows on the next read of every affected agent, with no wait. An agent that switches to another subscription reads the new one: the newest observation wins, and the agent’s header shows when it was observed. Past sessions keep the subscription they recorded.

OpenLatch sends the Shadow agent detected notification when an agent becomes Shadow for an alerting reason: Subscription not official or Org unit not allowed. It is in-app for every member, and it reaches each notification channel subscribed to it; see Set up notification channels.

RuleWhat it means
No alert before your first declarationWhile your organization has declared nothing, nothing is alerted. Your first declaration checks every agent and sends one notification counting the Shadow agents, such as “12 shadow agents discovered”
Only on entering an alerting reasonAn agent alerts when it enters Subscription not official or Org unit not allowed, never again while it stays there, and never for Subscription can’t be determined, User can’t be placed or a move to Sanctioned
At most once a day per agentAn agent alerts at most once in 24 hours, whatever the reason
One notification for many agentsA change in Agent Subscriptions, or a check that turns several agents Shadow at once, sends one notification counting them
A wait for new agentsA newly enrolled agent that has not reported a subscription yet is not judged until it reports one, or for 24 hours after it was discovered, whichever comes first

The notification names the agent’s product and the reason, never the person, the machine or the subscription identifier. A notification about one agent opens that agent; one counting several opens the Agents page. Most changes alert within moments; a change OpenLatch could not check at once is caught by an hourly check. The status you read is never delayed.

A declaration can carry a default monthly budget for each Sanctioned agent on it. An agent uses its own budget first, then the default of the official subscription it is Sanctioned on, then your organization’s default. A Shadow agent never takes a subscription default. See Track an agent’s spend.