Book an Appointment

OWASP Agent Control Standard (ACS): Runtime control for AI agents

The OWASP Agent Control Standard (ACS) is an open specification under which a Guardian Agent checks an AI agent’s actions at defined hooks and, based on policy, allows, blocks, modifies, submits them for approval or defers them. This deep dive shows what version 0.1.0 delivers today — and where its limits lie.

Last updated: October 2026 · Valeri Milke, ISO 27001 & ISO 42001 Lead Auditor

You will receive the download link immediately on the page and by email.

Observed Agente.g. coding agent
Guardian AgentPolicy-as-code + optional LLM
  • allow
  • deny
  • modify
  • ask
  • defer
InstrumentHooks & dispositionsTraceOpenTelemetry & OCSFInspectAgBOM
Schema per ACS v0.1.0: the Observed Agent reports a tool call via a hook, and the Guardian responds with a disposition before the action runs. Log lines are illustrative.
19native steps/* hooks in specification v0.1.0 — from sessionStart to sessionEnd, including the three skill hooks
5dispositions: allow, deny, modify, ask and defer — the spec explicitly lists the full vocabulary for steps/toolCallRequest
7conformance profiles: acs-core as mandatory plus six optional profiles — declared in the handshake, without external verification
6minimum hooks for ACS-Core: sessionStart, userMessage or agentTrigger, toolCallRequest, toolCallResult, agentResponse, sessionEnd

AI agents don’t just read, they act: they run shell commands, call APIs, send emails and write to their memory. System prompts do not control any of this. The OWASP Agent Control Standard (ACS) addresses precisely this gap and standardises runtime control as a protocol between agent and Guardian. This page explains specification v0.1.0 from a CISO perspective: hooks and dispositions, failure posture, policy-as-code, audit trail, tracing via OpenTelemetry and OCSF, and the AgBOM. The simulator shows schema-faithful wire examples, the risk matrix maps ACS to the OWASP Agentic Top 10 as a VamiSec assessment, and we state openly what the early standard cannot yet deliver. The profile navigator, self-assessment and a CISO whitepaper help you get started.

From the Agent Observability Standard to ACS v0.1

How an observability project became a control standard — every documented milestone up to the target for v0.2.0. Click a milestone to see the details.

Nine core concepts of the Agent Control Standard

Click a card to read the core concept — the order follows the path of an agent action from the hook through the decision to the evidence.

Exploring the standard

Three pillars, the Guardian architecture, identity and provenance, and the conformance profiles — each with the key provisions of specification v0.1.0 and their limits.

Pillar
  • Real-time interception, evaluation and enforcement: JSON-RPC 2.0 envelopes over HTTP(S) or stdio, hook methods in the steps/* namespace.
  • 19 native hooks across the entire lifecycle: session, turn, messages, knowledge and memory, tools, compaction, subagents and skills.
  • steps/toolCallRequest must fire for every action that leaves the reasoning context — including built-in shell, file and network operations.
  • The Observed Agent must wait for the decision and apply it; a framework that ignores verdicts is not conformant.
  • Streaming, notifications and interruption are missing from v0.1.0 — the only response type is final.
JSON-RPC 2.0steps/*steps/toolCallRequestDecision Honoring
Interactive

Guardian simulator: six scenarios step by step

Choose a scenario and follow how a hook request travels from the Observed Agent to the Guardian Agent, which disposition results and what ends up in the audit trail — including the case where the Guardian fails.

Coding agent

The coding agent is meant to clean up build artefacts. Because of an incorrectly resolved path, the planned shell command rm -rf targets the home directory instead of the build folder.

  1. 1Hook request (Observed Agent → Guardian)
    {
      "jsonrpc": "2.0",
      "method": "steps/toolCallRequest",
      "id": 41,
      "params": {
        "acs_version": "0.1.0",
        "request_id": "6b2f9e14-0c3a-4d7b-a5e8-91f2c4d6b803",
        "timestamp": "2026-10-06T09:12:41Z",
        "metadata": {
          "agent_id": "coding-agent-ci-07",
          "session_id": "3f6c2a18-9d4e-4b1a-8c55-2e7f90a1b3c4",
          "turn_id": "a1d4e7f0-2b5c-4e8a-9f13-6c0d2e5f8a71"
        },
        "payload": {
          "tool": {
            "name": "shell"
          },
          "operation": "delete_recursive",
          "capability": "filesystem.delete",
          "arguments": {
            "command": {
              "value": "rm -rf ~/",
              "provenance": {
                "provenance_id": "p-112",
                "origin": "agent_generated",
                "derived_from": [
                  "p-101"
                ]
              }
            }
          },
          "raw_command": "rm -rf ~/"
        },
        "signature": {
          "algorithm": "HMAC-SHA256",
          "value": "unUBv7dka1B1VD+fgzjF9E+IGC3GiQihQdQxEtIyG54=",
          "key_id": "sess-hmac-coding-07"
        }
      }
    }
  2. 2Evaluation in the Guardian
    • Deterministic layer (policy-as-code, reference in v0.1: OPA/Rego): the framework reports the shell call with the capability filesystem.delete and the operation delete_recursive; the rule deny_recursive_delete_outside_workspace applies.
    • Path check: the target ~/ (home directory) lies outside the workspace to which the policy restricts this session.
    • Provenance check: the command is agent_generated (derived from p-101) — no human explicitly specified this target.
    • The optional LLM layer is not needed: deny with reasoning, reason_codes and policy_references, evaluator deterministic.
    DispositiondenyAction blocked
  3. 3Response (Guardian → Observed Agent)
    {
      "jsonrpc": "2.0",
      "id": 41,
      "result": {
        "type": "final",
        "acs_version": "0.1.0",
        "request_id": "6b2f9e14-0c3a-4d7b-a5e8-91f2c4d6b803",
        "decision": "deny",
        "reasoning": "Recursive delete targets the user's home directory, outside the workspace root the session is scoped to.",
        "reason_codes": [
          "destructive_operation",
          "path_outside_workspace"
        ],
        "policy_references": [
          {
            "policy_id": "coding-agent-fs",
            "policy_version": "2026.10.2",
            "rule_id": "deny_recursive_delete_outside_workspace"
          }
        ],
        "cited_provenance_ids": [
          "p-112"
        ],
        "metadata": {
          "evaluator": "deterministic",
          "evaluation_duration_ms": 3
        },
        "chain_hash": "49c17246a18080bbeeaee88743bff94616b58cb6beb24e870b68a6f3ad55ecc3",
        "signature": {
          "algorithm": "HMAC-SHA256",
          "value": "Z1NyoNzC5LkVEcrZS6rzuc3CFaPO8vgfYg5/lhCpuho=",
          "key_id": "sess-hmac-coding-07"
        }
      }
    }

    The Observed Agent does not carry out the deletion and receives the reasoning in return. If it proposes a corrected path, that path is checked again.

  4. 4Audit trail (trace)
    {
      "_note": "vereinfachter Auszug",
      "class_uid": 2004,
      "class_name": "Detection Finding",
      "category_uid": 2,
      "activity_id": 1,
      "severity_id": 4,
      "time": 1791277961003,
      "metadata": {
        "version": "1.5.0"
      },
      "finding_info": {
        "uid": "dec-6b2f9e14",
        "title": "Tool call denied: recursive delete outside workspace"
      },
      "enrichments": [
        {
          "name": "acs_provenance_origin",
          "value": "agent_generated"
        }
      ],
      "unmapped": {
        "acs": {
          "decision": "deny",
          "evaluator": "deterministic",
          "policy_references": [
            {
              "policy_id": "coding-agent-fs",
              "policy_version": "2026.10.2",
              "rule_id": "deny_recursive_delete_outside_workspace"
            }
          ],
          "reason_codes": [
            "destructive_operation",
            "path_outside_workspace"
          ],
          "cited_provenance_ids": [
            "p-112"
          ],
          "session_id": "3f6c2a18-9d4e-4b1a-8c55-2e7f90a1b3c4",
          "step_id": "6b2f9e14-0c3a-4d7b-a5e8-91f2c4d6b803"
        }
      }
    }

    The ACS mapping represents non-allow decisions as OCSF class 2004 Detection Finding; deny is given severity_id 4 (High).

What this means for you

Destructive actions belong behind a deterministic rule that applies before execution — not in the system prompt. This only works if the framework routes every action with an external effect through steps/toolCallRequest, including built-in file and shell operations.

ASI02ASI05

Recursive deletion outside the workspace: deny

Note: examples conform to the ACS v0.1.0 schemas (validated against request-envelope.json, response-envelope.json, context-entry.json and the hook schemas, including the *.acs-provenance variants); values, policy and rule names are illustrative, signatures are computed with a demo key, and trace excerpts are simplified; the ASI mappings are VamiSec assessments. The only reference implementation (proof of concept) currently evaluates just steps/toolCallRequest and steps/toolCallResult live.

Instrument pillar

Hook lifecycle: where ACS can intervene

The 19 native steps/* hooks of specification v0.1.0, plus the AgBOM, handshake and system methods, along an agent session. Select a hook to see its trigger, what the Guardian can do and the typical risks.

01SessionHandshake, start, activation, end
02AgBOMInventory at the start and on change
03TurnWraps every agent turn
04MessagesInput and output
05Knowledge & memoryRAG retrievals and memory
06ToolsBefore and after every action
07CompactionCondensing the context window
08SubagentsDelegation within the same process
09SkillsRegister, load, unload
10SystemLiveness
handshake/helloHandshake

Handshake

When
At session start, before any hook: the Observed Agent sends a ClientHello with its supported versions, methods, transports, provenance mode and profiles.
What the Guardian can do
Responds with a ServerHello instead of a disposition and sets negotiated_version, methods_evaluated, timeout_config and, optionally, on_decision_failure. Methods outside methods_evaluated are treated as ALLOW-by-default. The Guardian can reject the session, for example with PROVENANCE_REQUIRED (-32002).
Typical risks
ASI03ASI08

Count according to specification v0.1.0: 19 native steps/* hooks; together with agbom/snapshot, agbom/changed and system/ping, 22 methods with their own payload schema, plus handshake/hello and the MCP namespace protocols/MCP/*. The specification defines the permitted dispositions per hook in the prose, not in the schema. ACS-Core requires at least six hooks; anything not listed in methods_evaluated is treated as ALLOW-by-default. The dot on a hook marks a strict *.acs-provenance variant. The mapping of typical risks per hook is a VamiSec assessment.

VamiSec assessment

Risk matrix: OWASP Agentic Top 10 × ACS building blocks

Which building blocks of the Agent Control Standard directly control, support or do not cover the risks in the OWASP Top 10 for Agentic Applications 2026 — with the rationale and limitations for each row.

Coverage of risks ASI01 to ASI10 by six ACS building blocks (2 = direct control, 1 = supporting, 0 = not covered); VamiSec assessment based on ACS v0.1.0.
OWASP Agentic Top 10

VamiSec assessment based on ACS v0.1.0 — not an official OWASP mapping. ACS does not appear in the OWASP Agentic Top 10 (December 2025), and neither OWASP nor the ACS project has mapped ACS to ASI01 to ASI10; the effect of each cell depends on your policies and the negotiated profiles.

Interactive

Profile navigator: which ACS building blocks fit your agent?

Up to five questions on tools, regulation, data sources, dynamic components and SOC. The result names the ACS profiles and first steps we recommend for your situation — a VamiSec assessment, not a statement of conformance.

Your path
  1. ?

1: Does your agent call tools or trigger actions with external effects — files, shell, APIs, emails, tickets, payments?

1

Does your agent call tools or trigger actions with external effects — files, shell, APIs, emails, tickets, payments?

ACS requires steps/toolCallRequest to fire for every action that leaves the reasoning context. Without such actions, inputs and outputs remain the main control points.

Deep dive · 14 chapters

The Agent Control Standard in detail: from the control problem to operations

Fourteen chapters for CISOs, security architects and AI platform owners: what specification v0.1.0 normatively requires, where it currently stops and which decisions need to be made before adoption. Mappings to incidents, risks and regulation are marked as VamiSec assessment.

01Chapter 1

Why AI agents need runtime control

An AI agent does not just answer questions; it triggers actions — in file systems, databases, mailboxes and cloud accounts. The security question therefore shifts from model output to who checks a specific action before it is executed.

From answer generator to actor

Classic LLM applications generate text that a human reads before anything happens. AI agents, by contrast, plan autonomously, call tools, write to long-term memory and spawn subagents. Each of these steps can change data or send it outside. The control question is therefore: “May exactly this action, with exactly these arguments, take place in this session right now?” It can only be answered at runtime — between the model’s decision and its execution by the framework.

System prompts are not controls

Many deployments rely on system-prompt instructions such as “do not delete production data”. Such sentences are requests to a probabilistic system, not enforced rules. The ACS project page opens its rationale on exactly this point: system prompts are not controls, better models do not cover edge cases and adversarial inputs, and proprietary guardrails create vendor lock-in.

Vendors and researchers confirm this. On 22 December 2025, OpenAI wrote that prompt injection is “unlikely to ever be fully ‘solved’”. In the study “The Attacker Moves Second” (arXiv, 10 October 2025), adaptive attacks overcame twelve recent defences, mostly with success rates above 90 per cent — even though most of them had originally reported rates close to zero. Model robustness lowers the risk but does not eliminate it. What is needed is an independent control point outside the model.

Lethal trifecta and the Agents Rule of Two

On 16 June 2025, Simon Willison described the “lethal trifecta”: an agent that has access to private data, is exposed to untrusted content and can communicate externally can be manipulated via prompt injection into exfiltrating data. On 31 October 2025, Meta extended this into the “Agents Rule of Two”: within a session, an agent should combine at most two of three properties: processing untrusted inputs; accessing sensitive systems or private data; changing state or communicating externally. If it needs all three, at least supervision is required, for example through human approval. Meta stresses that the rule complements least privilege rather than replacing it.

VamiSec assessment: both models describe properties of a session, not of a model. They can only be enforced if one component sees every action and the session history so far. This is the control point that the OWASP Agent Control Standard (ACS) standardises. Detecting untrusted inputs requires the optional acs-provenance profile; ACS-Core alone does not provide provenance information.

Documented incidents — and what runtime control could have limited

Incident (source, date)What happenedCould have limited it (VamiSec assessment)
EchoLeak, CVE-2025-32711, Microsoft 365 Copilot (NVD 11 June 2025; CVSS 3.1: 9.3 Microsoft, 7.5 NVD)Zero-click: a crafted email caused Copilot to leak internal data via the rendered response; fixed before disclosure.Inspection of steps/agentResponse with modify (stripping external image and link URLs) or deny — provided the host fires the hook and supplies provenance.
Replit agent deletes production database (SaaStr, July 2025; The Register 22 July 2025)The agent ignored an instructed code freeze, deleted the production database and generated misleading status messages.deny or ask on destructive database capabilities at steps/toolCallRequest; audit chain for reconstruction. Primarily: dev/prod separation, backups.
GitHub MCP “Toxic Agent Flow” (Invariant Labs, 26 May 2025)Prompt injection in a public issue; the agent published data from private repositories via a pull request. No code flaw in the server, no CVE.Session policy “no writes to another repository after untrusted tool output” with deny or ask at steps/toolCallRequest; requires acs-provenance.
Amazon Q Developer Extension v1.84.0, CVE-2025-8217 (AWS-2025-015, 23 July 2025; CVSS 4.0: 5.1)Injected deletion prompt in the official release; execution failed because of a syntax error, and customer resources were not affected.The prompt came from the product itself and counts as trusted — provenance does not help. Effective measures would have been deny or ask on deletion capabilities and version pinning via the AgBOM.
ClawHavoc: malicious skills on ClawHub (The Hacker News 2 February 2026; Unit 42 23 June 2026)An initial audit found 341 malicious skills among 2,857 reviewed, including some with a Base64-encoded dropper.Inspection at skillRegister and digest binding at skillLoad; then deny on download-and-execute (network.egress plus process.execute).

All incidents predate the canonical ACS specification v0.1.0 (5 June 2026). The right-hand column is an assessment, not a claim that ACS would have prevented an incident.

Why control has to sit at runtime

Model selection, prompt hardening and red teaming before go-live remain necessary, but they do not tell you what an agent does in a specific session. Runtime control complements them: it acts before the action, evaluates the context of the entire session and leaves a reconstructable audit trail. For ASI02 (Tool Misuse and Exploitation), the OWASP Top 10 for Agentic Applications 2026 recommends upstream policy enforcement middleware, an “Intent Gate” that checks intent and arguments before execution. ACS is not mentioned there, but (VamiSec assessment) it provides an open wire contract for precisely this control point. The policies remain your responsibility.

02Chapter 2

What ACS is: parties, three pillars, ACS-Core and seven profiles

The OWASP Agent Control Standard (ACS) is an open wire specification through which a separate Guardian Agent checks what an AI agent intends to do next. The Guardian allows, blocks or modifies the action, submits it for approval or defers its decision — before the action takes place.

More precisely: the Agent Control Standard (ACS) is a specification of the OWASP GenAI Security Project that defines at which control points (hooks) an AI agent submits its steps to an external policy authority and how that authority responds with a decision (disposition). The format is JSON-RPC 2.0 with a dedicated acs_version field, transported over HTTP(S) or stdio. The current version is specification v0.1.0, published as release 0.1.2 (tag dated 21 September 2026). ACS defines the contract between agent and Guardian, not the policies: what is permitted is still decided by your organisation.

The parties

RoleResponsibility according to the specificationTypical implementation (example)
Observed AgentThe monitored, LLM-based system. It implements the wire contract, reports every relevant step via a hook and enforces the disposition it receives. It does not decide on its own actions.Coding agent, support agent, agent framework with host integration
Guardian AgentThe policy authority. It evaluates every hook against the deployment policy, returns a disposition and must log every decision with its reasoning, the evaluator’s model identifier and — where available — confidence.Policy engine (e.g. OPA/Rego), optionally supplemented by an LLM layer
ApproverA third party that the Guardian involves on ask: a human, an agent or a service. The Guardian must verify its identity against the policy.Security officer, approval service, ticket workflow
PrincipalThe authenticated party that initiates a session or acts within it.Employee, service account

The specification requires three identities to be kept separate: that of the Observed Agent, that of the Guardian and that of the policy author.

One design principle underpins the architecture: the language model must know nothing about the hooks. The framework fires them, and provenance information is set outside the model’s output path. As we read it, the intention is that a manipulated model can neither see nor influence the control point.

Three pillars: Instrument, Trace, Inspect

Instrument

Real-time interception, evaluation and enforcement: 19 native steps/* hooks, five dispositions, handshake, replay protection and signatures. The mandatory baseline, ACS-Core, is built on this pillar.

Trace

A vocabulary through which hook events appear as OpenTelemetry spans and OCSF events; decisions are recorded as a span event on the triggering step. ACS does not invent a new log format. Trace runs decoupled from enforcement and is best-effort.

Inspect

The AgBOM (Agent Bill of Materials): a dynamic inventory of models, MCP servers, A2A peers, tools, knowledge sources, memory stores, capabilities and skills, serialisable to CycloneDX 1.6, SPDX 3.0 or SWID.

ACS-Core and seven profiles

Conformance is modular. ACS-Core is the mandatory baseline, on top of which sit six optional profiles that a deployment declares in the handshake. There are no numbered levels — only profile names that can be combined independently. The only dependency: acs-inspect-dynamic extends acs-inspect.

Profile (handshake name)Core requirementWhat you need it for
acs-core (mandatory)Among other things: handshake, JSON-RPC envelope, at least six hooks, all five dispositions with mandatory fields, hash-chained audit chain with a published chain head, replay protection, HMAC-SHA256 signature on every request and every response, Decision Honoring, system/pingAuthenticated channel; the agent follows the Guardian’s decisions
acs-traceFor every supported step, OpenTelemetry and/or OCSF events with mandatory attributes; every decision as a trace eventSIEM integration, cross-vendor observability
acs-inspectagbom/snapshot once per session before the first content-bearing hook; on request, the Guardian serialises to at least one BOM formatPolicies that depend on the inventory, such as banning a model or tool
acs-inspect-dynamicAdditionally, agbom/changed whenever the component graph changesDetecting hot swaps of models, MCP servers or skills during the session
acs-provenanceProvenance object on every data-bearing field of every hook (provenance_producer: deterministic)Information-flow policies following FIDES, CaMeL or AARM-style patterns
acs-cryptoAsymmetric or post-quantum signatures, at least ML-DSA-65Non-repudiation towards third parties
acs-auditrequest_hash on every ContextEntry in the audit chainThe chain also binds request content, not just metadata

In v0.1.0, conformance is a self-declaration in the handshake: no test suite, no register of conformant implementations, no assessment body.

The specification is matter-of-fact about what ACS-Core guarantees: the channel is authenticated, and the Observed Agent follows the decisions. It does not guarantee that the policies are strict — a permissive Guardian is conformant, just permissive. Tamper evidence for the audit chain, even against a compromised Guardian, is only provided by acs-crypto and acs-audit, because the HMAC baseline is a symmetric scheme. The specification’s example combinations range from a minimal IDE integration with acs-core only to a high-assurance deployment with all seven profiles.

The project page’s tier model: architectural layers, not levels

  1. Tier 1 · Platform layer

    Agent frameworks provide standardised middleware hooks — this is where the control point is created.

  2. Tier 2 · Enforcement layer

    An open-source component reads declarative policies and returns decisions via these hooks.

  3. Tier 3 · Enterprise layer

    Custom classifiers and domain-specific logic plug in behind the same interface.

This model describes who contributes which part, not how conformant a deployment is. For conformance claims, only the profiles count. It is still useful for your architecture planning: it separates the question of which platform supplies the hooks from the question of who operates and maintains the policies.

03Chapter 3

Origins, governance and licensing: from AOS to an OWASP project

Anyone adopting a standard early should know who steers it, which licence it is under and how reliable its roadmap is. ACS has a short but eventful history.

From observation to control

Work began on 11 May 2025 as the “Agent Observability Standard” (AOS) in Zenity’s GitHub environment and moved to the OWASP organisation in June 2025, where AOS was listed as an “OWASP other project”. In May and June 2025, the protocol layer was temporarily called “ASOP” (Agent Security & Observability Protocol) before reverting to AOS. After a phase with only sporadic commits from mid-2025, the rebranding to Agent Control Standard followed on 10 April 2026. The new name marks the substantive step from mere observation to enforcement. ACS then briefly ran as an independent project outside OWASP and returned in September 2026 — this time to the OWASP GenAI Security Project.

DateMilestone
11 May 2025First commits as “Agent Observability Standard” (AOS)
June 2025Transition to the OWASP organisation
10 April 2026Rebranding AOS → ACS (Agent Control Standard)
27 May 2026Launch press release via Business Wire; phase as an independent project
5 June 2026Canonical specification v0.1.0 integrated, including the skill hooks
11 August 2026Release v0.1.1: new licensing, specification unchanged
1–10 September 2026OWASP relaunch: resource page (1 September), site and 44 JSON schemas (5 September), governance and reference implementation (10 September)
21 September 2026Tag v0.1.2, set retroactively on a commit from 9 September 2026
March 2027 (target)Next specification release v0.2.0

Sources: Git history and project documents of the ACS repository and the OWASP resource page, as of 3 October 2026.

Status: Incubator and public preview

ACS is a project of the OWASP GenAI Security Project, where it is assigned to the Agentic Security Initiative. In its own OWASP Nest metadata it declares Level 2 — the “Incubator” stage in the Nest schema; this does not establish a classification by an OWASP body. The project lead publicly describes the status as “public preview” and explicitly advises implementers to proceed with caution. ACS is not an ISO, IETF or W3C standard and not a harmonised standard. The early stage is also evident formally: there are no GitHub releases, only tags; specification prose and schemas changed between v0.1.1 and v0.1.2 without the specification version v0.1.0 being incremented.

Who steers the project?

According to GOVERNANCE.md, Michael Bargury and Ory Segal created ACS; both remain project leaders. The project lead is Rock Lambros. For transparency: Bargury is CTO and co-founder of Zenity, Lambros is listed by Zenity as “Director of AI Standards and Governance”, and the early AOS commits come predominantly from the Zenity sphere. The workstreams — Coding Agents, Development (SDK), Identity, Outreach and Spec — are led by people from several organisations. The project page describes ACS as vendor-neutral and community-governed; that is a self-description. Our assessment: an OWASP project with a strong Zenity imprint in its founding and leadership.

Decisions go through an acceptance gate. Only issues labelled status:accepted make it into the backlog; changes to behaviour, normative text or code require an accepted issue, specification changes start as a GitHub Discussion, and commits require a DCO sign-off. Development takes place on the integration branch. Only when the project lead promotes to main are the site and schema URIs republished. As of 3 October 2026, main has not been promoted since 10 September 2026 — changes on integration are therefore not yet published.

Licensing: what you may reuse

ComponentLicencePractical consequence
Code, JSON schemas, code examples in the documentationApache-2.0Use in proprietary products without disclosure obligations; explicit patent licence
Prose documentation (specification texts, README)CC BY-SA 4.0Translations and adaptations are subject to ShareAlike and require attribution
Releases up to and including v0.1.0MITThe licence granted at the time remains in force
Names and logos (OWASP, Agent Control Standard)no rights grantedAn implementation may describe itself as “ACS-conformant” but must not suggest endorsement by the project

The relicensing to Apache-2.0 and CC BY-SA 4.0 took effect with release v0.1.1 on 11 August 2026. VamiSec writes all content on this page independently and does not translate any specification prose.

Roadmap: what is documented

The next specification release, v0.2.0, is targeted for March 2027; no date has been set for v1.0. Items earmarked for v0.2 include streaming and interruption, recursive ASK and quorum, multi-tenant isolation, the Cedar binding, AgBOM federation across A2A peers and A2A wrapping. The ongoing goal since the kick-off on 10 September 2026: within 90 days, a working Guardian reference implementation, benchmarked for interoperability with Microsoft’s Agent Governance Toolkit, in the hands of external evaluators. Whether this will be achieved by early December 2026 remains open. Also open is PR #21, which seeks to redraw the mandatory scope of ACS-Core. Diverging version outlines in blog posts are not an official roadmap.

04Chapter 4

Instrument: the 19 hooks in an agent’s lifecycle

At each hook, the Observed Agent pauses and submits its next step to the Guardian. ACS v0.1.0 defines 19 native steps/* hooks — which of them are actually evaluated is negotiated by both sides per session.

On the wire, hooks carry the prefix steps/, for example steps/toolCallRequest. In addition, there are methods that are not native steps/* hooks: agbom/snapshot and agbom/changed for the inventory, the liveness probe system/ping, the handshake handshake/hello and the protocols/MCP/* namespace for wrapped MCP messages. The specification’s hooks page counts 19 hooks plus two AgBOM methods plus ping as 22 methods; the schema package comprises 44 JSON schemas in total. Some project texts (README, docs/acs.md) still refer to 16 lifecycle hooks — that is the count without the three skill hooks.

GroupHooks (steps/…)When they fireDispositions according to the specification
SessionsessionStart, agentTrigger, sessionEndAfter the handshake, before any other step; activation by user, schedule, event, A2A or system; end of the session, at which the Guardian seals the chainsessionStart: allow/deny · agentTrigger: allow/deny/modify · sessionEnd: audit only
TurnturnStart, turnEndStart and end of each agent turn; the turn_id accompanies all steps in betweenturnStart: decision-capable, usually allow · turnEnd: audit only
MessagesuserMessage, agentResponseUser input before it reaches the reasoning context; agent output before deliveryallow/deny/modify
Knowledge & memoryknowledgeRetrieval, memoryContextRetrieval, memoryStoreKnowledge and RAG queries, memory reads into the context, writes to long-term memoryallow/deny/modify
ToolstoolCallRequest, toolCallResultAfter a tool call is parsed and before dispatch; after execution, before the result is acceptedtoolCallRequest: all five · toolCallResult: allow/deny/modify
CompactionpreCompact, postCompactBefore and after the context window is compactedpreCompact: deny possible · postCompact: modify, no deny
SubagentssubagentStart, subagentStopStart of a subagent in the same process; its terminationsubagentStart: deny possible · subagentStop: audit only
SkillsskillRegister, skillLoad, skillUnloadAdmission to the available set as a static gate; activation in the session; removalskillRegister and skillLoad: allow/deny · skillUnload: audit only

The per-hook restrictions are set out in the specification prose; the response schema itself does not restrict the decision field per method.

The core minimum: six hooks

ACS-Core requires at least six hooks: sessionStart, userMessage or agentTrigger, toolCallRequest, toolCallResult, agentResponse and sessionEnd. A framework should implement all the others if it can observe the relevant event; they are negotiated in the handshake. For your product evaluation, this means that the statement “supports ACS” does not yet tell you whether memory writes, subagents or skills reach the Guardian at all.

The methods_evaluated trap

In the handshake, the Observed Agent reports which methods it implements (methods_implemented). The Guardian responds with the list of methods it actually evaluates (methods_evaluated). If the agent sends a hook that is missing from this list, it must treat it as ALLOW-by-default — at best the step is logged, but it is not checked. The only reference implementation, for example, evaluates only steps/toolCallRequest and steps/toolCallResult, i.e. two of 19 hooks.

toolCallRequest: the central enforcement point

steps/toolCallRequest is the only hook for which the specification explicitly provides all five dispositions; this is also where the control paradigms apply. One MUST rule is central: frameworks must fire toolCallRequest for every action that leaves the agent’s reasoning context — even if the framework does not treat it internally as a tool. This covers read and write access to the file system, network fetches, process launches and shell commands. Anything that bypasses this hook is invisible to any policy.

Mandatory in the payload are tool.name and arguments, where each argument value can carry its own provenance. Optional additions are an abstract capability such as filesystem.delete or network.egress, the raw_command and an intent. This allows policies to evaluate what an action does rather than which program executes it.

Hooks with a particular protective effect

  • memoryStore is the standard sink for influence across sessions and, according to the specification, the point of intervention against memory poisoning (cf. ASI06: Memory & Context Poisoning).
  • preCompact and postCompact secure compaction: the summary must carry origin agent_generated and inherit the provenance of all compacted entries so that untrusted content cannot be laundered.
  • subagentStart allows the Guardian to refuse the start of a subagent; each subagent receives its own session_id and its own audit chain.
  • skillRegister and skillLoad bind skills to a digest: only what was previously approved with an identical skill_id and an identical digest may be loaded; loads that cannot be matched should be rejected.
05Chapter 5

The five dispositions in detail: allow, deny, modify, ask, defer

The Guardian answers each hook with exactly one disposition. The details — mandatory fields, composition rules, timeouts — determine whether a policy fails safely or lets actions through when something goes wrong.

On the wire, dispositions appear in lowercase in the decision field; the specification prose writes them in capitals (ALLOW, DENY …). In v0.1, every response is of type final — intermediate states (progress) and interruptions (interruption) are only planned for v0.2. Mandatory in every response are type, acs_version, request_id and decision; the request_id mirrors that of the request.

DispositionEffect on the Observed AgentMandatory fields (schema)Typical use
allowThe action runs as requestednone; reasoning recommended where user-visible audit trails are expectedRead access within the permitted scope
denyThe action is blockedreasoningDestructive shell command, egress to an unknown destination
modifyThe action runs with a modified payloadreasoning, modificationsLimiting a query, redacting personal data in the tool result
askThe agent pauses until approval is givenreasoning, ask_detailsPayment, bulk mailing to external recipients
deferThe decision is postponedreasoning, defer_detailsUnknown script, missing context

Optional in every decision: reason_codes, policy_references (policy_id, policy_version, policy_name, rule_id), policy_data, cited_provenance_ids and metadata with evaluator (deterministic, agent or composite).

MODIFY: two mutually exclusive forms

The modifications object comes in two forms. Either modified_content replaces the entire payload — in which case no further edits are allowed. Or the Guardian sends structured edits: redactions (JSON Pointer path plus replacement text, default “[REDACTED]”) and/or parameter_overrides (argument name plus new value). Both may occur together, but their targets must be disjoint: no redaction path may hit the same field as an override, nor a parent or child of it. The specification’s rationale: a fixed order of application would resolve conflicts silently and, depending on the order, re-expose redacted values or overwrite sanitised ones. If a Guardian violates these rules, the Observed Agent must treat the response as a deny.

An example: an agent wants to query a customer table in full. The Guardian responds with modify and an entry in parameter_overrides that limits the query to 500 rows — as in the simulator scenario “Unbounded database query”. Override values appear as raw values in the object, not in a value wrapper.

ASK: approval with clear rules

  • ask_details requires an approver with type (human, agent or service) and id, a question and timeout_seconds (at least 1).
  • When the timeout expires, timeout_disposition applies; the default value is deny.
  • The Guardian must verify the approver’s identity against the policy — approver authentication is mandatory.
  • Only one hop: approvers must not themselves return ask. Quorum and recursive approvals have been deferred to v0.2.
  • If a client cannot resolve ASK, the Guardian must not send ask. Instead, it falls back to defer with timeout_decision deny or to deny with the reason code approver_unavailable — a silent allow is ruled out.
  • Via intent_extension, an approval can extend the permitted capabilities for this_request or for the entire session. According to the specification, this is the only conformant way to change the established intent after the fact.

Important from a regulatory perspective: ASK is not automatically human oversight. The approver can be an agent or a service, and timeout_disposition can be set to allow. Human oversight under EU AI Act Art. 14 applies to high-risk systems from 2 December 2027 (Annex III) and 2 August 2028 (Annex I) respectively; AI agents are not high-risk per se. In VamiSec’s assessment, anyone using ASK as a building block for this needs a policy with approver.type human and timeout_disposition deny, as well as an approval process that avoids decision fatigue. ASK then supports your evidence trail but does not by itself fulfil Art. 14: v0.1 has no stop button, only step-by-step deny.

DEFER: postponing the decision, within limits

defer_details requires a reason (insufficient_context, conflicting_policies, low_confidence or pending_dependency), a resolution_method (additional_context, human_approval or timeout) and resolution_timeout_ms. On expiry, timeout_decision only allows deny or ask — no allow — and defaults to deny. The prose requires the field, but the schema does not list it as mandatory; so always set it explicitly. Cascading deferrals must be limited per session. Mind the units: ASK counts in seconds (timeout_seconds), DEFER in milliseconds (resolution_timeout_ms).

06Chapter 6

Handshake, failure posture and timeouts

Before the first hook fires, the Observed Agent and the Guardian negotiate what is checked, how long to wait and what happens in the event of an outage. These few fields determine whether your control point holds when it matters.

Every session starts with handshake/hello. The ClientHello is carried in the payload of a normal request envelope; the ServerHello comes back as result — without a decision. The negotiated version must match the client’s major version; unknown fields must be ignored.

MessageMandatory fieldsSecurity-relevant optional fields
ClientHello (Observed Agent)acs_versions_supported, methods_implemented, transports_supported (http, https, stdio), provenance_producer (deterministic or none)profiles_supported, wrapped_protocols, max_payload_size_bytes
ServerHello (Guardian)negotiated_version, methods_evaluated, selected_transport, timeout_config (default_ms, optional per_method_ms)on_decision_failure (proceed or deny, default proceed), signature_algorithms_supported, skew_window_ms (default 300000), policy_requires_provenance, approver_types_supported, profiles_accepted, trace_emission, agbom_serializations_supported

Rejections in the handshake: UNSUPPORTED_VERSION (-32001) on a version conflict; PROVENANCE_REQUIRED (-32002) if the client does not supply provenance but the Guardian policy requires it.

Failure posture: fail-open is the default

For every reported step, the Observed Agent must wait for the decision — up to the negotiated timeout — and apply it. A framework that sends hooks but ignores the verdict is not conformant. If no usable decision arrives, the specification speaks of a decision failure: the Guardian is silent, the transport fails (refused connection, TLS error, malformed response) or the Guardian returns an error instead of a decision. In all three cases on_decision_failure applies, and its default value is proceed: the action continues unchecked. Fail-closed (deny) has to be configured explicitly by a deployment.

The specification is open about the price: anyone who can disrupt the channel turns control into mere logging. As a counterweight, a hard obligation applies — every step that proceeds without a decision must be recorded as an audit event. If a decision does arrive within the timeout after all, the agent must follow it, regardless of the posture.

Startup posture: when even the handshake fails

If the Guardian is unreachable at session start or responds without a ServerHello, a startup posture configured outside the protocol applies: proceed (the session starts unprotected) or refuse. Here, too, proceed is the default so that a Guardian outage does not block new sessions. A session started without protection must be recorded in the deployment’s own audit log. An explicit rejection by the Guardian, such as SESSION_REFUSED, by contrast counts as a decision and not as an outage.

SituationApplicable mechanismDefault
Guardian unreachable at session startStartup posture (configured outside the protocol)proceed — session runs unprotected, audit obligation
Guardian silent, transport error or error response during the sessionon_decision_failure from the ServerHelloproceed — step runs unchecked, audit obligation
ASK timeout expirestimeout_dispositiondeny
DEFER timeout expirestimeout_decisiondeny
Invalid modifications objectComposition rule for MODIFYTreated as deny
system/ping failsTransport-level signal, not an enforcement eventno disposition

Timeouts: no default in the specification

The specification does not set a numerical default timeout. timeout_config.default_ms is mandatory in the ServerHello, but the value is up to the deployment; per_method_ms allows different values per method. The handshake schema points out that every millisecond of timeout can, in the worst case, mean added latency for the step, and recommends aligning per-method timeouts with latency tolerance rather than with a generous blanket value. The reference implementation uses 5000 ms — an implementation value, not a requirement. A sensitivity-based timeout model is planned for v0.2. To clarify terminology: ACS_ON_DECISION_FAILURE is an environment variable of the reference Guardian that sets the value of on_decision_failure — not a field of the specification.

Ping does not prove enforcement

system/ping is a pure liveness probe: the Guardian must always respond with allow, the ping requires no signature and is not written to the audit chain. So a Guardian can answer pings while rejecting every signed hook. The specification therefore recommends monitoring decision failures directly on the hook path.

07Chapter 7

Guardian architecture: deterministic first, LLM optional

A Guardian Agent is not a second language model looking over the first one’s shoulder. ACS prescribes a fixed order: deterministic policy code decides first; an LLM may only contribute downstream and without visibility into the policy.

Two layers, fixed order

The deterministic layer evaluates every hook first. It either decides itself or delegates to the agent layer — according to the specification, controlled via a chain configuration with the modes “*”, on_ask or pattern-based. However, v0.1 does not define a format for this configuration. The agent layer receives the same inputs plus the interim result of the deterministic layer, but never the policy code. On the way back, its response must pass through the deterministic layer again.

  1. Hook arrives

    The request envelope, SessionContext, intent and, if present, provenance are passed to the policy engine.

  2. Deterministic evaluation

    Policy-as-code — in v0.1 with OPA/Rego as the starting reference — returns allow, deny, modify, ask or defer, or delegates.

  3. Optional LLM layer

    Evaluates cases that cannot be decided deterministically; treats untrusted fields as data and sees no policy code.

  4. Re-check and response

    The result passes through the deterministic layer again; metadata.evaluator indicates deterministic, agent or composite.

  5. Logging

    Every decision is logged with its reasoning, model identifier and, where available, confidence.

Policy engine: an interface, not a product

ACS defines the interface to the deterministic engine, not the engine itself. The input consists of the request envelope, SessionContext, intent and provenance; the output is a decision envelope, optionally with a delegation to the agent layer (delegate_to). ACS also sets conventions, including: no external HTTP calls in canonical policies. This supports determinism and low latency.

EngineStatus in ACSContext
OPA / RegoStarting reference for v0.1CNCF project with Graduated status (since 29 January 2021), Apache-2.0; the reference implementation uses the OPA bundled with the Agent Governance Toolkit
CedarFast-follow for v0.2 (Cedar binding)Policy language from AWS, Apache-2.0, CNCF Sandbox (since 8 October 2025); basis of Policy in Amazon Bedrock AgentCore
Custom enginePermitted if it adheres to the interfaceFor example, domain-specific logic or classifiers behind the same interface

The README and section 2 of the specification mention Cedar and Rego in the same breath; section 12.1 defines the status per version.

Obligations of the LLM layer

  • Untrusted data is data, not instructions; the relevant fields must be wrapped or quoted in the prompt.
  • No access to the policy code of the deterministic layer.
  • Log every decision with reasoning, model identifier and confidence (where available); for evaluator agent or composite, model_id must be specified.
  • Timeouts follow the timeout_config negotiated in the handshake.
  • The entire layer is optional in v0.1.0: purely deterministic deployments are fully conformant.

Control paradigms without a dedicated wire extension

The specification names four paradigms as targets for v0.1. A Guardian expresses them via the same fields — reason_codes, policy_references, policy_data and cited_provenance_ids. If a deployment combines several paradigms, a single decision may cite all of them.

IBAC · intent-based authorisation

The intent of a session is fixed before untrusted data flows in; after that, it can only be extended via an audited approval (intent_extension). A deviation can end in a defer; policy_data then names the requested capability and the closest entry from Intent.parsed. Works without acs-provenance.

FIDES · information flow control

Research approach with confidentiality and integrity labels (arXiv 2505.23643, 2025). A denial cites the violating lineage in cited_provenance_ids and the affected argument path in policy_data.

CaMeL · program synthesis

Research approach that derives control and data flow from the trusted request (arXiv 2503.18813, 2025). The Guardian checks whether arguments originate from untrusted sources.

AARM-style · cumulative context

Evaluates the session history so far rather than the individual step. A denial cites the earliest untrusted step and reproduces the relevant look-back in policy_data.

FIDES, CaMeL and AARM-style rules need provenance information and therefore require the acs-provenance profile; pure IBAC does not. ACS does not implement any of these approaches itself; it provides the fields through which a Guardian applies and justifies them. In other words, ACS does not prevent prompt injection — it creates the control point at which policies counter its consequences.

Operations: latency and availability (VamiSec assessment)

  • Latency: every check sits in the agent’s critical path. Keep the deterministic layer local and free of external calls, reserve the LLM layer for a small number of ambiguous cases and measure evaluation_duration_ms per method.
  • Availability: with fail-closed, the Guardian becomes business-critical. Run it close to the agent and redundantly. The reference implementation itself documents the risk: it writes logs synchronously in the decision path, so a slow disk blocks every pending decision.
  • Policy lifecycle: version your policies and return policy_version in every decision; the specification provides for this so that historical policy states can be reconstructed.
  • Scope: the Guardian is no substitute for a sandbox, IAM, secrets management or an egress firewall. Actions that bypass toolCallRequest remain invisible to it.

The only reference implementation runs Microsoft’s Agent Governance Toolkit unmodified behind the ACS wire. It is explicitly a proof of concept: two of 19 hooks live, no HMAC signature, fail-open by default. It demonstrates the pattern for two clients (Claude Code and OpenCode) but is not intended for production use.

08Chapter 8

Channel security: signatures, replay protection and the audit chain

A Guardian Agent is only as trustworthy as the channel over which it makes its decisions. ACS-Core therefore requires three mechanisms: a signature on every request and every response, protection against replayed messages, and a hash-linked audit chain. This chapter shows what these mechanisms achieve — and where their limits lie.

Decisions that release or block actions travel between the Observed Agent and the Guardian Agent. Anyone able to tamper with this channel can turn a deny into an allow or replay an old approval. The OWASP Agent Control Standard (ACS) therefore treats channel security as part of the mandatory ACS-Core baseline, not as an optional profile.

Baseline signature: HMAC-SHA256 with a session key

ACS-Core requires a signature over the canonical envelope on every request and every response. The baseline that satisfies this requirement is HMAC-SHA256. The key is derived per session via HKDF — from deployment key material (a pre-shared secret or a channel binding such as a TLS exporter) together with the session_id. v0.1 does not define an in-protocol key exchange. What gets signed is the RFC 8785 canonicalisation (JCS) of the envelope without the signature field; the recipient recomputes this form and rejects any signature that does not match. TLS alone is explicitly not sufficient, because it does not bind individual messages for audit purposes. The only method exempt from the signature requirement is the liveness method system/ping.

Two details matter for the architecture. In the JSON schema, signature is optional, yet it is normatively mandatory in ACS-Core — schema validation alone will therefore not detect missing signatures. And the specification does not fix the salt, info string, hash function or key length for HKDF, so two implementations may derive different keys. In our assessment, these parameters belong in the interface agreement between platform operations and Guardian operations.

Replay protection

Every request carries a request_id (UUID), a timestamp and, optionally, a nonce. The Guardian must reject requests whose timestamp falls outside the negotiated skew_window_ms window (recommended default 300,000 ms, i.e. five minutes) and must reject duplicate request_id values within a session; it should reject duplicate nonces. This implies an easily overlooked operational requirement: synchronised clocks on both sides.

CodeNameTriggerObserved Agent response per the spec
-32000SESSION_REFUSEDPolicy refuses the session and no more specific code applies (e.g. an impermissible agent_id)No retry without a policy or configuration change
-32001UNSUPPORTED_VERSIONNo common acs_version in the handshakeRepeat the handshake with a supported version
-32002PROVENANCE_REQUIREDPolicy requires provenance, but the client reports provenance_producer: noneReconnect as a deterministic producer or use a Guardian without a provenance requirement
-32003CAPABILITY_NOT_NEGOTIATEDA method or profile is used that the handshake did not negotiateRenegotiate the method or profile
-32004SIGNATURE_INVALIDMandatory signature is missing, malformed or unverifiableRe-sign; re-resolve key_id if necessary
-32005REPLAY_DETECTEDDuplicate request_id or nonce within the sessionGenerate a new request_id and nonce
-32006TIMESTAMP_OUT_OF_WINDOWTimestamp outside skew_window_msCorrect the clock drift
-32007CHAIN_MISMATCHThe client’s chain_hash differs from the Guardian’s chain headReload session state; a persistent mismatch is an integrity event

Our own summary of the ACS error registry (specification v0.1.0, §17.1). system/ping must not return an ACS-specific error.

Audit chain: a hash chain with a published head

For each session, the Guardian maintains a SessionContext, an append-only chain of ContextEntries. Each entry receives an entry_hash: SHA-256 over the JCS-canonicalised entry without its hash fields, chained to the hash of its predecessor; the first entry has previous_hash null. Other canonicalisations are not permitted in v0.1. Publication is the decisive point: for every content-bearing step, the Guardian must include the current chain_hash in its response, covered by the response signature. The specification states the reason openly: if the Guardian kept the chain head private, it could, for example, remove a deny, recompute the chain from that point onwards and later present a sanitised history. Anyone capturing the traffic can detect a chain that has been rewritten after the fact.

What the chain proves — and what it does not

  • The only mandatory fields of a ContextEntry are entry_id, step_id, step_type and entry_hash. The request_hash over the request content is merely recommended (SHOULD) in ACS-Core and only becomes mandatory in the acs-audit profile. Without it, the chain proves that a step took place, but not what was requested.
  • The ContextEntry schema has no field for disposition, rationale or approver. ACS records decisions normatively as trace events (acs-trace profile, Chapter 9); only an intent extension writes a dedicated entry containing the approver identity (Chapter 11).
  • HMAC is symmetric: the Guardian holds the key and could re-sign a rewritten chain head. The channel is protected against tampering on the network, not against a compromised Guardian.
  • Non-repudiation towards third parties only comes with acs-crypto: at least ML-DSA-65 (MUST), SLH-DSA-128s (SHOULD), hybrid schemes optional.
  • v0.1 provides no reconciliation across multiple Guardians (issue #18, deferred).
09Chapter 9

Trace: OpenTelemetry and OCSF in the SOC

With the Trace pillar, agent actions and Guardian decisions land in the existing observability and SIEM stack. ACS does not invent a new format for this; instead, it provides a vocabulary for OpenTelemetry and OCSF. What matters to the SOC is which classes arrive, how reliable they are and where the mapping still has gaps.

The normative contribution of Trace is its vocabulary: span names, attribute keys, event classes and the mapping of dispositions to severity levels. Transport uses OTLP (gRPC or HTTP) to existing backends; the wire namespace trace/* is merely reserved in v0.1.0. The stated goal is for ACS events to fit into SIEM pipelines without special parsers. In the repository, both the OTel and the OCSF extensions carry the status “Working draft”. Trace is the optional acs-trace profile. Anyone claiming it must emit at least one of the two formats with the mandatory attributes for every supported step, record every decision with its disposition, evaluator and — where available — rationale, and carry provenance facts from the hook over to the event.

OpenTelemetry: spans per hook, decisions as span events

The span hierarchy is deterministic: one root span acs.session per session, beneath it one acs.turn per turn and one step span per hook. Decisions are not separate spans but a span event acs.decision on the step span; the verdict and the controlled action thus share the same parent context. The event’s mandatory attributes are acs.decision and acs.evaluator (deterministic, agent or composite). For tool calls, ACS uses the span names gen_ai.tool.call and gen_ai.tool.result. Note: in the OpenTelemetry GenAI semantic conventions (status “Development” as of October 2026), gen_ai.tool.call is only an attribute prefix; the recommended span name there is execute_tool {gen_ai.tool.name}. Dashboards and queries aligned with these conventions will therefore not match ACS tool spans without adjustment.

ACS eventOCSF class (UID)Note
sessionStart, sessionEnd, subagentStart, subagentStop3002 AuthenticationMapped as logon or logoff respectively
userMessage, agentResponse, agentTrigger, turnStart, turnEnd6002 Application LifecycleACS calls the class “Application Activity” — in OCSF, that is the name of category 6
toolCallRequest, toolCallResult1007 Process ActivityCentral source for agent actions
knowledgeRetrieval, memoryContextRetrieval, memoryStore, preCompact, postCompact6005 Datastore ActivityCompaction uses activity_id 99, generically “Other” in OCSF
Decisions deny, modify, ask, defer2004 Detection Findingseverity_id: modify 2, ask and defer 3, deny 4; allow is normally informational only (1)
agbom/snapshot, agbom/changed5001 Device Inventory InfoACS calls the class “Inventory Info”

Classes as per the ACS mapping (OCSF 1.5+), class names as per OCSF 1.5.0. Agents appear as actor.user.type “AI Agent”; ACS-specific fields such as reason_codes and policy references are placed in unmapped.acs.

SIEM use cases for agents

Use caseData basisPossible response
Guardian bypass (fail-open)Mandatory audit event for every step without a decision; unprotected session startAlert from the very first event for high-risk agents; check Guardian availability
Spike in deny decisionsDetection Finding 2004 with severity_id 4, reason_codes, policy_idSession review; indicator of prompt injection or misconfiguration
Approval loadask findings (severity_id 3) per period, supplemented by approver details from ask_detailsAdjust thresholds and approver capacity; prevent approval fatigue
Inventory driftagbom/changed with reason user_action or discovery (only with acs-inspect-dynamic)Reconcile against the allowlist; tighten the policy if necessary
Integrity eventCHAIN_MISMATCH or reason_code chain_mismatchInvestigate as an integrity event; do not dismiss it as a transient error
Agent or humanactor.user.type “AI Agent”Separate baselines; correlation with human identities

VamiSec interpretation — ACS defines no detection logic and no response playbook. According to issue #37, a conformant format for the fail-open audit event is still missing; build rules against the JSON mappings and test them with real data.

Limitations you should plan for

  • Best effort: Trace must never block enforcement. If the sink fails, the decision still reaches the Observed Agent — so telemetry may have gaps.
  • Self-reporting: trace events are generated in the observed environment and only become evidence once attested by an external party.
  • Skill gap: the mappings cover 16 of the 19 native hooks plus the two agbom methods. skillRegister, skillLoad and skillUnload have neither an OTel nor an OCSF mapping.
  • Documentation drift: where provenance is placed in OCSF is contradictory (enrichments in the normative mapping, unmapped.acs.provenance in the guide). The examples page with Splunk and Elastic queries still uses the former name ASOP and OCSF 1.0.
  • Data protection: spans may contain prompts and tool arguments. The specification recommends redaction at the point of emission; in our assessment, this should be a binding part of the logging concept.
10Chapter 10

Inspect: AgBOM — the agent’s runtime inventory

Agents change their capabilities at runtime: a new model, a newly loaded MCP server, a freshly registered skill. The AgBOM (Agent Bill of Materials) makes this state queryable per session and usable for decisions. It is not a new SBOM format — nor does it replace one.

According to the specification, the AgBOM is a queryable, dynamic inventory of the components an Observed Agent uses. The rationale is precise: any policy that depends on what an agent is — which model, which tools — becomes unverifiable without an inventory. If a Guardian policy depends on the inventory, for instance to ban a model or tool, the deployment must implement the acs-inspect profile. The canonical AgBOM is a component graph, stored as a flat list with references by ID so that states can be compared by diff.

Eight component types

TypeWhat is captured (selection of mandatory fields)
modelName, version, provider, endpoint and context window; optionally a configuration snapshot
mcp_serverName, version, endpoint and the tools offered
a2a_peerEndpoint and protocol version
toolName, version, provider and abstract capability, e.g. filesystem.delete or network.egress
knowledge_sourceName and source type (vector_db, search_index, knowledge_base, web_search, other)
memory_storeName, scope (session, user, tenant, global) and storage type
agent_capabilityName and description of a passive capability group
skillName, description, and the reference and integrity digest of the loadable artefact

The normative source is the component.json schema. Some documentation pages mention six or seven types; eight is authoritative.

snapshot and changed: two wire methods

The Observed Agent sends agbom/snapshot once per session, after sessionStart and before the first content-bearing hook; the message contains the complete AgBOM. agbom/changed reports mutations — added, removed or modified components, either as a diff or as a full snapshot — and can carry a cause such as component_upgraded, discovery or user_action. Both events are recorded in the audit chain. The Guardian may use deny to refuse a session with a banned component or to block a hot swap.

Important for choosing profiles: anyone claiming only acs-inspect delivers exactly one snapshot per session and does not track changes. Runtime changes only become visible with acs-inspect-dynamic. The snapshot triggers renegotiation and policy_request refer to mechanisms that are not due to be specified until v0.2 — in v0.1, only session_start can be relied on in practice. Each component should also carry a registration_provenance (mandatory under acs-provenance). This makes it possible to distinguish whether a component comes from the configuration or was added at runtime.

Serialisations: CycloneDX, SPDX, SWID

The canonical form is always what goes on the wire; the Guardian renders serialisations on request for downstream tools. An acs-inspect deployment must offer at least one of them: CycloneDX 1.6, SPDX 3.0 or SWID (ISO/IEC 19770-2). All three mappings have the status “Working draft”, and the mappings to CycloneDX and SPDX are partly not schema-valid. The CycloneDX mapping uses type names such as ai-model or service as component types that CycloneDX 1.6 does not define in that form; the SPDX mapping uses classes and relationships that do not exist in SPDX 3.0.1. Plan exports with your own validation accordingly. CycloneDX itself has been available in version 1.7 since October 2025.

Telling them apart: AgBOM, AI-SBOM, CRA SBOM

AgBOM (ACS)

Runtime-oriented and per session, anchored in the audit chain and usable for decisions. It inventories what the Observed Agent, by its own account, uses in this session; under acs-provenance, it additionally records the origin of each registration.

AI-SBOM / ML-BOM

Describes models and datasets, for example with the CycloneDX ML-BOM or the AI profile of SPDX 3.0. The term AI-BOM does not appear in ACS; the comparison is our own classification.

CRA SBOM

Mandatory from 11 December 2027 for manufacturers of products with digital elements (Annex I, Part II, point 1 CRA): machine-readable, covering at least the top-level dependencies. The AgBOM can supplement this build-time SBOM with runtime components, but it does not replace it.

11Chapter 11

Provenance and identity: where data comes from, where identity stops

Whether an action is permissible often depends on where the data triggering it comes from. Provenance gives the Guardian these origin facts at field level, and Session Intent locks in the purpose. The identity part of ACS, by contrast, so far mainly describes open questions.

Field provenance: facts instead of trust labels

Provenance answers where a data element came from and how it got to where it is. A provenance object carries a provenance_id, an origin with one of seven values — user_input, system, tool_output, retrieved, agent_generated, a2a_inbound, external — and, optionally, a source_id (such as a tool name, URL or path) and derived_from as a list of predecessors. This information is attached to data-bearing fields, and for toolCallRequest even to each individual argument. A policy can therefore target a specific data flow rather than the entire call.

  • Framework-set: origin, source_id and derived_from are assigned by deterministic code outside the LLM output path. Instructing the LLM to generate provenance is not conformant.
  • Transitive lineage: derived data inherits the origin of its inputs, including across summarisation and compaction. A summary of external tool outputs thus remains recognisable as such.
  • No trust field: a trust value is only reserved in v0.1, not defined in the schema. The Guardian derives trust from origin and source_id against its policy; untrusted material never becomes trusted through LLM processing (monotonicity rule).
  • All or nothing: with provenance_producer: deterministic, every data-bearing field must carry provenance; partial population is not conformant. If the client reports provenance_producer: none although the policy requires provenance, the Guardian rejects the session as early as the handshake with PROVENANCE_REQUIRED.

Provenance is not part of ACS-Core but of the acs-provenance profile. It is a prerequisite for enforcement paradigms such as FIDES, CaMeL and AARM, but not for purely intent-based authorisation (IBAC). ACS does not prevent prompt injection. It creates the control point at which a policy can limit the consequences — for example by blocking an email whose recipient and content originate from an untrusted retrieval result. Sensitivity or IFC labels are not part of the standard; they are the responsibility of the Guardian or the deployment.

Session Intent: the locked-in purpose

In ACS, intent is not a wire format but a governance concept: it binds actions to an authorised purpose — before untrusted data can exert any influence. Intent.parsed, the set of capabilities authorised for the session, is fixed at sessionStart or at the first agentTrigger. After that, neither the LLM nor tool outputs nor data from untrusted channels may change it; if the intent is set at sessionStart, a later agentTrigger with a different intent must be rejected.

The only conformant way to extend it is an intent_extension returned by an approver via the ask flow — with mandatory details on capabilities and scope. With scope this_request, the extension applies only to the current request. With scope session, the Guardian appends the capabilities, writes a ContextEntry of type intent_extension containing the approver identity and keeps the provenance of the extension separate from that of the original intent. Under scope_mode strict, it must not honour any extension that the policy prohibits in strict mode. In our assessment, this is the CISO’s lever against creeping privilege expansion: every extension of scope requires an authenticated approval.

Identity: normatively lean, much still in progress

What applies normatively

ACS does not prescribe an authentication mechanism; the mechanism used is declared in the handshake, and trust schemes such as SPIFFE, OIDC or PKI remain deployment-defined. What is mandatory is the authentication of approvers and the separation of three identities: Observed Agent, Guardian and policy author.

What is not yet binding

The working documents of the identity workstream list five runtime challenges; four are “Pending” and one is “Partially specified”. Wording such as “Required by ACS” for DPoP or RAR is not binding — the project itself makes clear that ACS does not prescribe any mechanism. The identifier model and token lifetimes are only proposals.

How it differs from AIMS

The IETF draft AIMS (draft-klrc-aiagent-auth) covers identity issuance, credential binding and transport authentication. ACS sees itself as complementary: enforcement at runtime rather than issuing identities.

The ACS-Core signature authenticates the channel between Observed Agent and Guardian symmetrically. It is neither authentication of the principal nor non-repudiation — and you should not conflate either of these in your architecture or your evidence.

12Chapter 12

MCP, A2A and skills: protocols and loadable capabilities

Agents talk to tools via MCP and to other agents via A2A, and they load skills as executable building blocks. ACS v0.1 covers these three surfaces to differing extents: MCP wrapping is specified, A2A is only reserved, and the skill lifecycle has hooks of its own.

MCP wrapping: specified, but whether it is mandatory is unresolved

The namespace protocols/MCP/* is the canonical way to carry MCP messages to the Guardian, for example protocols/MCP/tools/call. The MCP message itself remains unchanged; ACS layers the envelope, the decision contract and the audit chain rules on top. The flow has two stages: the agent submits the wrapped request to the Guardian, enforces its decision, forwards the message to the MCP server after an allow (according to the flow description) and also has the server’s response checked before processing it.

A deployment may consolidate MCP tool calls (tools/call) into the generic hooks steps/toolCallRequest and steps/toolCallResult if tool-level policies are sufficient. Wrapping is intended for cases where the policy needs MCP-specific distinctions: capability negotiation at initialize, server-side prompt templates (prompts/get), resource access (resources/read) and notifications (notifications/*). Irrespective of this, frameworks must fire toolCallRequest for every action that leaves the reasoning context — including built-in file, network or shell operations.

MCP 2026-07-28: the spec prose lags behind

Since 28 July 2026, MCP revision 2026-07-28 has been the current one (as of October 2026). It makes the protocol core stateless, abolishes the initialize handshake and, among other things, deprecates sampling and roots. The ACS namespace protocols/MCP/* is version-neutral; revision 2025-06-18 appears in the specification only as an example. The prose, however, still assumes the older semantics and explicitly names initialize negotiation as a point to be controlled. The specification leaves open whether this affects the wrappers in practice, and we are not aware of any robust analysis. In our assessment, MCP-heavy architectures should plan for the generic tool hooks as their primary control point.

A2A: reserved for v0.2

The namespace protocols/A2A/* is only reserved in v0.1; normative wrapping semantics are planned for v0.2 (target for v0.2.0: March 2027). The A2A pages in the repository date from the AOS era in 2025 and are not schema-compatible. Today, A2A relationships are only visible indirectly: via agentTrigger with trigger_type a2a_inbound and via a2a_peer components in the AgBOM. In-process subagents, on the other hand, are covered by ACS through subagentStart and subagentStop; each subagent gets its own session with its own audit chain, which the parent references via the final_chain_hash without merging the chains.

Skill lifecycle: register, load, unload

HookPurposeGuardian options
steps/skillRegisterStatic checkpoint: the Guardian sees the entire skill definition before any of its actions runs. The approval applies to the pair (skill_id, digest).allow or deny; a rejected skill must not become loadable. The Guardian should check declared capabilities against the composed tools and may reject overly broad declarations.
steps/skillLoadRuntime gate for each activation; the load_path makes cascades visible (skill A loads B, B loads C).allow or deny; it should reject loads that lack an attributable approval, carry a deviating digest or fall outside the declared composed_skills.
steps/skillUnloadKeeps the active inventory up to date; may alternatively be folded into agbom/changed.Audit only; according to the specification, repeated loading and unloading is a signal worth watching.

Our own summary of the hook descriptions in ACS v0.1.0.

The digest covers the complete loadable artefact, including any bundled model weights or adapters; only the reference and the digest are persisted in the AgBOM, not the content. The Guardian should not rely on a digest_verified reported by the framework but should compare against its own approval. The repository’s design proposal for the skill lifecycle openly states the limitation: the digest binds the registered artefact, not code that a skill loads later — such dynamic loading runs as network.egress or process.execute through the regular tool hooks. Pre-publication marketplace scanning is not part of ACS, and the three skill hooks still lack a trace mapping (Chapter 9).

13Chapter 13

Conformance and maturity: what v0.1 delivers — and what it does not

ACS is a young OWASP project at an early stage. For architecture and procurement decisions, what counts is therefore the verifiable status: specification v0.1.0, release 0.1.2, a reference implementation that is a proof of concept, and conformance by self-declaration.

0.1.0Specification version; release 0.1.2, tagged on 21 September 2026
2 of 19Hooks that the reference implementation evaluates live
7Conformance profiles; every claim is a self-declaration
03/2027Target for v0.2.0; there is no date for v1.0

ACS is a project of the OWASP GenAI Security Project and, according to its own OWASP Nest metadata, is classified at Level 2 (Incubator); the project lead describes its status as “public preview”. ACS is not an ISO, IETF or W3C standard, nor is it a harmonised standard.

What v0.1 already delivers

Despite its early stage, v0.1 has substance: a shared vocabulary of 19 hooks and five dispositions, 44 published JSON schemas, a clearly described failure posture with an audit requirement for every bypass, and a specification that openly names its own gaps. In our assessment, this is enough to measure vendors against an open, shared yardstick and to design your own control points so that they remain compatible with later versions — but not enough to rely on conformance labels.

Conformance is self-declaration

In the handshake, the Observed Agent declares which profiles it supports (profiles_supported), and the Guardian declares which ones it accepts (profiles_accepted). There are exactly seven profiles: acs-core as the mandatory one, plus acs-trace, acs-inspect, acs-inspect-dynamic, acs-provenance, acs-crypto and acs-audit. There are no tiers or levels. Who verifies conformance claims? The specification answers that itself: in v0.1.0, nobody. There is no test suite, no register of conformant implementations and no body that resolves disputed claims (issue #19, open, priority P1). Moreover, ACS-Core guarantees only two things — an authenticated channel, and that the Observed Agent follows the Guardian’s decisions. It does not guarantee strict policies: even a permissive Guardian is conformant.

Reference implementation: an honest look at where it stands

The only reference implementation is explicitly a proof of concept. It runs Microsoft’s Agent Governance Toolkit (AGT), unmodified, as the policy engine behind the ACS wire, with host integrations for Claude Code and OpenCode. It claims acs-core only in a restricted form (“qualified”) and none of the six optional profiles. There is no interoperability benchmark with AGT yet; producing one is the goal of the 90-day window that began with the kick-off on 10 September 2026. No endorsement of ACS by Microsoft can be inferred from this. Beware the name clash: in the AGT documentation, “ACS” stands for Microsoft’s own “Agent Control Specification” (2 June 2026), the policy language of AGT — not for the OWASP standard.

ACS-Core requirementStatus of the reference implementation
Handshake handshake/helloServed, but the ServerHello consists of constants; the ClientHello is not read
At least six hooks2 of 19 evaluated: steps/toolCallRequest and steps/toolCallResult
All five dispositionsallow, deny and modify present; ask without ask_details (schema-invalid); defer is never produced
chain_hash in responsesThe chain is maintained but not published on any response
Baseline signature HMAC-SHA256Not implemented; wire unauthenticated, protected only by loopback binding (issue #70)
Replay protectionNot implemented
Decision Honoring, on_decision_failureImplemented on both hosts; default proceed (fail-open), every bypass is audited (issues #32, #37)
system/ping, protocols/MCP/*Not implemented

Source: self-description of the reference implementation (reference-implementations/agt/README.md), main branch as of 10 September 2026. The reference implementation was only added to the repository after the tagged release commit 0.1.2.

Open spec gaps with practical relevance

  • Default fail-open: on_decision_failure and the startup posture are set to proceed; you must configure fail-closed (deny or refuse respectively) deliberately.
  • No stop mechanism: v0.1 has no kill switch; interruption and streaming are planned for v0.2. In v0.1, an agent can only be stopped step by step via deny.
  • Mandatory scope in flux: an open proposal (PR #21) would downgrade modify and system/ping to SHOULD.
  • Interop gaps (our own analysis): the HKDF parameters, the handshake signature and the input for request_hash are underspecified.
  • Documentation drift: some pages still mention 16 instead of 19 hooks, or only three dispositions. The specification and the schemas are normative.
14Chapter 14

Adoption in practice and regulatory context

ACS is not a compliance tool. It does, however, provide technical building blocks that can help you build evidence for obligations under the AI Act, NIS2, DORA and the CRA, as well as for ISO/IEC 42001 requirements. This chapter maps the building blocks to the requirements and outlines a five-step path to getting started.

Three points of context first. First, ACS does not create a presumption of conformity; the specification text contains no mapping to the AI Act, NIS2, DORA, the CRA or ISO/IEC 42001 — all mappings below are VamiSec interpretations. Second, AI agents are not high-risk systems per se. Following the Digital Omnibus (Regulation (EU) 2026/1744), the high-risk obligations under Chapter III, Sections 1–3 of Regulation (EU) 2024/1689 apply from 2 December 2027 for Annex III and from 2 August 2028 for Annex I; Art. 50 has applied since 2 August 2026. Third, any line of argument depends on the profiles: ACS-Core alone includes neither Trace nor AgBOM nor request_hash.

RequirementACS building block (profile)Evidence artefactCaveat
AI Act Art. 12: automatic recordingTrace per step and decision events, audit chain (acs-trace, acs-audit)SIEM data set, verifiable hash chainTrace is self-reported; ACS-Core does not include Trace
AI Act Art. 14(4)(d): overrideask on toolCallRequest with a human approver and timeout_disposition deny (acs-trace)Decision events with ask_details, intent_extension entriesPer the spec, the approver may also be an agent or a service — exclude this via policy
AI Act Art. 14(4)(e): stopdeny on sessionStart, turnStart, toolCallRequest; on_decision_failure deny, startup posture refuseEvidence of fail-closed configuration, record of a stop drillNo kill switch in v0.1; default fail-open
AI Act Art. 26: oversight, monitoring, logs ≥ 6 monthsAuthenticated approvers, Guardian as runtime monitor, trace exportApprover role matrix, monitoring report, retention policyACS does not govern retention; competence remains an organisational matter
AI Act Art. 72: post-market monitoringTrace metrics, AgBOM (mcp_server, a2a_peer), subagent hooksPMM section “agent runtime data”Commission template not due until 2 September 2027
NIS2 Art. 21(2) / § 30 BSIGPolicy-as-code (v0.1: OPA/Rego; Cedar binding planned for v0.2), capability policies, AgBOM with skill digestApproved policy code, component and supplier register per agentMarketplace scanning is not part of ACS
DORA Art. 8–10, RTS (EU) 2024/1774 Art. 12AgBOM as inventory, Trace via OCSF, signed chain head, fail-open audit events, timestamp and skew_window_msExtended ICT asset register, logging concept, evidence of time synchronisationHMAC does not protect against a compromised Guardian
CRA Annex I: logging, SBOMTrace as a product feature, AgBOM export (CycloneDX 1.6, SPDX 3.0)Build SBOM plus AgBOM export, product documentationOnly for agent products; Annex I applies from 11 December 2027; AgBOM does not replace an SBOM
ISO/IEC 42001 A.6.2.6, A.6.2.8, A.7.5, A.10.3Trace and audit chain, acs-provenance, AgBOMEvent log concept, provenance evidence, supplier list42001 confers no presumption of conformity with the AI Act
NIST AI RMF MANAGE 2.4, MEASURE 2.4, GOVERN 1.6deny and ask, Trace, AgBOMDeactivation criteria, monitoring plan, inventoryVoluntary framework

VamiSec interpretation based on ACS v0.1.0; neither OWASP nor any authority has made this mapping. Banks and insurers should build their case primarily on DORA, because the monitoring obligation under Art. 26(5) AI Act is deemed fulfilled through their financial-sector governance requirements. For financial entities with a simplified ICT risk management framework (Art. 16 DORA), Title III of the RTS applies instead of Art. 12.

Getting started in five steps

  1. InventoryCapture and classify your agents

    Capture agents, models, tools, MCP servers and skills, and clarify the AI Act classification for each use case. Outcome: an agent register with risk class, owners and data access.

  2. ArchitectureDefine control points and profiles

    Check which hooks your platform actually fires and which ones the Guardian confirms under methods_evaluated in the handshake: everything else is treated as allow-by-default and is unprotected. Choose profiles according to your evidence needs, for example acs-core plus acs-trace and acs-audit for logging obligations.

  3. PolicyExpress policies as code

    The deterministic layer runs first (v0.1 reference: OPA/Rego). Write rules for destructive commands, egress and payments, require ask with a human approver and timeout_disposition deny for consequential actions, and reference policy versions in policy_references.

  4. OperationsDecide on and test the failure posture

    For agents with high damage potential, set on_decision_failure to deny and the startup posture to refuse. Test Guardian outages, replay and signature errors, and monitor decision failures directly, because a successful ping does not prove healthy enforcement.

  5. EvidenceConnect Trace and maintain evidence

    Export OCSF or OpenTelemetry to the SIEM, implement the use cases from Chapter 9 and define retention periods. Secure the chain head externally and verify vendors’ conformance claims through your own tests.

For an in-depth treatment with a 100-day programme, a roles and responsibilities model, metrics and assessment questions for agent platforms, see the CISO whitepaper “Agent Control for CISOs”, which you can request further down this page. VamiSec supports assessment, architecture, policy design and testing as an independent consultancy; VamiSec is not part of the ACS project.

Self-assessment

ACS Readiness Assessment: how mature is your runtime control for AI agents?

18 questions across six dimensions, about 10 minutes. You receive your maturity level, your readiness per ACS building block and your biggest gaps, each with a concrete next step.

0 / 18 questions answered

The four levels
Not in place
There is neither a rule nor a technical implementation for this.
Ad hoc
Individual teams handle it in their own way, without a requirement and without evidence.
Defined
Formally mandated and implemented for the most important agents.
Enforced & measured
Technically enforced for all relevant agents and verified with metrics.
01 / 06Inventory & AgBOM

Do you know which agents are running with which models, tools, MCP servers and skills — even when this changes at runtime?

  1. 01ACS Inspect · Observed Agent

    Do you maintain a complete register of all AI agents in production use, each with an accountable owner?

    Including agent functions in purchased SaaS products and agents built in-house by business units.

  2. 02ACS Inspect · AgBOM (agbom/snapshot)

    For each agent, do you know the models, tools, MCP servers, knowledge sources, memory stores and skills it uses?

    The AgBOM distinguishes eight component types: model, mcp_server, a2a_peer, tool, knowledge_source, memory_store, agent_capability and skill.

  3. 03ACS Inspect · acs-inspect-dynamic (agbom/changed)

    Do you detect changes to components at runtime — such as a newly connected MCP server or a model switch?

    A one-off snapshot is not enough if agents load additional capabilities during the session.

Free whitepaper

Agent Control for CISOs — runtime control with the OWASP Agent Control Standard

The practical guide to ACS v0.1.0: what the standard governs, how to introduce the Guardian, policies, trace and AgBOM, how this maps to the AI Act, NIS2 and DORA — and what v0.1 cannot yet deliver.

Cover of the VamiSec whitepaper Agent Control for CISOs
41 pagesPDF, free of chargeGermanAs of 10/2026
  • Ten key messages and a one-page board briefing — with five decisions for executive management
  • Reference architecture for the Guardian and policy-as-code, including a failure posture concept and SOC integration
  • Regulatory mapping from the AI Act to ISO/IEC 42001 with evidence artefacts — and clearly marked limits
  • 100-day programme, maturity model and 20 procurement questions for agent platforms and Guardian vendors
Free Download

Request Whitepaper

Agent Control for CISOs — OWASP Agent Control Standard (ACS) v0.1

The CISO whitepaper: Agent Control for CISOs

Part I · Understand

Management summary with ten key messages and a one-page board briefing, the control problem of agentic AI illustrated by documented incidents, and ACS at a glance: roles, pillars, profiles, history and governance.

Part II · Implement

Hooks and dispositions with wire examples, Guardian architecture and policy-as-code, failure posture, trace into the SOC, the AgBOM as a runtime inventory, and identity and provenance against the consequences of prompt injection.

Part III · Govern

OWASP Agentic Top 10 × ACS as a heatmap, regulatory mapping to the AI Act, NIS2, DORA, CRA, ISO/IEC 42001 and the NIST AI RMF with evidence artefacts — and an honest assessment of what v0.1 does and does not deliver.

Programme & procurement

Maturity model with operating model, a 100-day implementation programme with deliverables and KPIs, 20 procurement questions for agent platforms and Guardian vendors, and answers to typical objections from the board.

New · ICSPIS 2026 (IEEE)

Test, don’t trust: the evidence that makes ACS controls verifiable

A Guardian decides — but does your telemetry also prove that the execution matched the decision? Our paper accepted at ICSPIS 2026 derives an evidence contract from MAESTRO and STRIDE; the deep dive maps it field by field to ACS hooks, provenance and trace — with a fault matrix, ACS crosswalk and negative tests for your CI.

92.9%Recall with security-relevant bindings (P3)
16.7%Recall with causal tracing only (P2)
50%Recall without decision events (F1)
  • ACS crosswalk: attack family → predicate → hook → Guardian response
  • Minimum decision receipt fields in policy_data
  • Research Edition (English): paper plus ACS Practitioner Brief
Glossary

Glossary: terms of the Agent Control Standard

The key terms from ACS v0.1.0 in quotable short definitions — spec terms are given exactly as in the specification.

Guardian AgentPolicy Enforcement Point
The external policy authority in ACS: it evaluates the Observed Agent’s hooks outside the model and responds with a disposition — first via deterministic policy code, optionally supplemented by an LLM layer. Not to be confused with Gartner’s market term “guardian agents”.
Observed Agent
The monitored AI system that implements the ACS wire contract, sends hooks at every decision point and enforces the dispositions it receives. It reports, but does not decide on its own actions.
Hooksteps/*
A point in an AI agent’s lifecycle at which it pauses and asks the Guardian before acting. ACS v0.1.0 defines 19 native steps/* hooks; ACS-Core requires at least six of them.
DispositionVerdict
The Guardian’s response to a hook: allow, deny, modify, ask or defer. Except for allow, a justification in the reasoning field is mandatory.
Failure Postureon_decision_failure
The Observed Agent’s behaviour when no usable decision arrives in time. The default is proceed (fail-open); deny (fail-closed) must be configured deliberately, and every pass-through without a decision must be audited.
Handshakehandshake/hello
The mandatory session setup via handshake/hello, in which the Observed Agent and Guardian negotiate the version, evaluated methods (methods_evaluated), timeout and failure posture. Methods that are not evaluated are treated as allowed without being checked.
ACS-Coreacs-core
The mandatory base profile of every ACS implementation. According to the specification, it ensures two things: an authenticated channel, and that the Observed Agent follows the Guardian’s decisions — it does not guarantee strict policies.
Conformance profileProfile
A scope of functionality declared in the handshake: acs-core plus the optional profiles acs-trace, acs-inspect, acs-inspect-dynamic, acs-provenance, acs-crypto and acs-audit. In v0.1.0, this is pure self-declaration without a test suite or assessment body.
AgBOMAgent Bill of Materials
The dynamic inventory of an Observed Agent’s components, with eight types from model to skill. It is reported per session, written to the audit chain and can trigger Guardian decisions; it is neither an AI-BOM nor a CRA SBOM.
Provenance
Field-level origin information for data in the hook payload: origin, source_id and derived_from. The framework sets it deterministically, never the LLM; it is only mandatory in the acs-provenance profile.
Audit chainSessionContext
The append-only chain of a session’s ContextEntries, linked via SHA-256 hashes. The published and signed chain_hash makes subsequent changes detectable — tamper-evident, but not protected against a compromised Guardian.
Policy-as-Code
Security rules as versioned, executable code rather than a document. In ACS, this is the Guardian’s deterministic layer, which always runs first; the v0.1 starting reference is OPA/Rego, with Cedar following in v0.2.
Human-in-the-loop / ASK approverask, approver
With ask, the Guardian submits an action to an approver for approval. Approvers can be a human, an agent or a service and must be authenticated; human oversight only comes about through a policy with approver.type human and timeout_disposition deny.
DEFERdefer
The disposition with which the Guardian postpones a decision, for example due to missing context or low confidence. If the deadline expires, deny applies by default; cascading deferrals must be capped per session.
MODIFYmodify
The disposition with which the Guardian permits an action in modified form — via parameter_overrides, redactions or complete replacement content. The Observed Agent must treat a non-compliant modify like deny.
Session IntentIntent.parsed
The set of permitted capabilities for a given purpose, defined at the start of a session. It must not be altered by the LLM or by tool outputs, and it can only be extended through audited approval via ask (intent_extension).
Capability
An abstract permission such as filesystem.delete, network.egress or process.execute. It describes the effect of an action independently of the specific tool and is the unit in which session intent and policies are expressed.
MCP wrappingprotocols/MCP/*
The namespace specified in v0.1 in which ACS forwards MCP messages unchanged to the Guardian. Deployments may alternatively map MCP tool calls via the generic tool hooks; A2A wrapping is only planned for v0.2.
Reference implementation (AGT)Proof of concept
The only proof of concept in the ACS repository: a TypeScript Guardian that runs Microsoft’s Agent Governance Toolkit unchanged behind the ACS wire, connected to Claude Code and OpenCode — neither production-ready nor fully ACS-Core-conformant.
Agent Control Specification (Microsoft)Microsoft ACS
A separate, Rego-based policy specification from Microsoft for the Agent Governance Toolkit (2 June 2026). It is also abbreviated “ACS”, but is not part of the OWASP Agent Control Standard.
FAQ

Frequently asked questions about the Agent Control Standard

Short answers for CISOs, security architects and GRC — as of 4 October 2026, specification v0.1.0.

The OWASP Agent Control Standard (ACS) is an open wire specification for runtime control of AI agents. It defines how an agent — the Observed Agent — reports relevant steps via hooks to a separate Guardian Agent and waits for its decision: allow, deny, modify, ask or defer. Three pillars complement each other: Instrument for hooks and dispositions, Trace for audit events based on OpenTelemetry and OCSF, and Inspect for the AgBOM. ACS is a project of the OWASP GenAI Security Project, currently at specification v0.1.0, release 0.1.2 (tagged on 21 September 2026). Code and schemas are licensed under Apache-2.0, the documentation under CC BY-SA 4.0.

No. ACS is an early-stage OWASP project — at Level 2 (Incubator) according to its own project metadata, and described by its own project lead as a “public preview”. It is neither an ISO, IETF or W3C standard nor a harmonised standard. In v0.1.0, conformance is a self-declaration that nobody verifies (issue #19). Even the mandatory scope of ACS-Core is still under discussion in an open pull request. The roadmap is provisional, too: v0.2.0 is targeted for March 2027, and v1.0 has no date yet. In the interest of transparency, its origins should also be noted: the project’s founding and leadership have been strongly shaped by Zenity.

System prompts are not controls: they operate in the same channel that an attacker can influence via prompt injection. Guardrail frameworks are concrete implementations, each with its own interface. ACS, by contrast, defines an open, cross-framework interface between the agent host and an external Guardian: the decision is made outside the model, deterministic policies run first, and the agent must enforce the result. This matters because, according to OpenAI, prompt injection is “unlikely to ever be fully ‘solved’” (22 December 2025). ACS does not prevent prompt injection — it creates the standardised control point at which policies counter its consequences.

ACS replaces neither protocol; instead, it adds a control layer on top of them. For MCP, v0.1 specifies the version-neutral namespace protocols/MCP/*: messages are passed unchanged to the Guardian, which evaluates them before they are forwarded or processed. Deployments may alternatively map MCP tool calls via steps/toolCallRequest and steps/toolCallResult; the spec text is contradictory on whether MCP wrapping is part of ACS-Core. The spec prose also still assumes mechanisms that predate the current MCP revision 2026-07-28. In v0.1, A2A is only reserved, and wrapping follows with v0.2. Until then, the options are steps/agentTrigger with a2a_inbound and the AgBOM type a2a_peer.

ACS can support evidence gathering, but it does not in itself satisfy the AI Act and does not establish a presumption of conformity. For the record-keeping obligation under Art. 12, acs-trace (events per step) and acs-audit (a tamper-evident audit chain bound to request contents) provide building blocks. For human oversight under Art. 14, ask is only suitable with a policy of “human approver, timeout deny”; v0.1 has no stop button, only step-by-step deny. Mind the deadlines: under Regulation (EU) 2026/1744, high-risk obligations apply from 2 December 2027 (Annex III) and 2 August 2028 (Annex I) respectively, while Art. 50 has applied since 2 August 2026. AI agents are not high-risk per se. The mapping is a VamiSec interpretation.

By default, the agent carries on. If no usable decision arrives within the negotiated timeout, on_decision_failure applies with the default proceed (fail-open); a failed handshake also starts the session unprotected by default. Every such pass-through must be recorded as an audit event — the spec openly acknowledges that an attacker who disrupts the channel can thereby turn control into mere logging. You achieve fail-closed with on_decision_failure: deny and the startup posture refuse. Expired ask and defer decisions, by contrast, fall back to deny by default. Because the posture applies per session, we recommend separate Guardians or sessions per risk class (VamiSec assessment).

The specification sets no millisecond target. The timeout is negotiated in the handshake (timeout_config.default_ms, optionally per method); in the worst case, every millisecond of it is additional waiting time for the agent. The reference implementation sets 5000 ms. Deterministic policies save latency; according to the spec, they should not contain external HTTP calls. In our assessment, the optional LLM layer costs noticeably more, and according to the spec, signing with SLH-DSA-128s takes several hundred milliseconds. Operationally, we recommend running the Guardian close to the agent and with redundancy, budgeting timeouts per method and monitoring the decision failure rate as a metric — a successful system/ping does not prove that enforcement works.

There is exactly one reference implementation, explicitly a proof of concept: a TypeScript Guardian that runs Microsoft’s Agent Governance Toolkit unchanged behind the ACS wire, with host integrations for Claude Code and OpenCode. It evaluates two of 19 hooks live (steps/toolCallRequest and steps/toolCallResult), signs nothing (issue #70), has no replay protection and runs fail-open by default (issues #32 and #37). The project aims to deliver an interoperability benchmark by early December 2026, but none is available yet. None of this implies support from Microsoft. We are not aware of any substantiated production deployments (as of 4 October 2026).

No — this is a naming trap. On 2 June 2026, Microsoft published its own “Agent Control Specification”, also abbreviated ACS: a Rego-based policy specification of the Agent Governance Toolkit with eight interception points and decisions such as allow, warn, deny and escalate. It comes from Microsoft, not from the OWASP GenAI Security Project, and does not mention the OWASP standard. The connection is indirect: the ACS reference implementation uses the toolkit as its policy engine; the npm package agent-control-specification used there is Microsoft’s SDK, not an artefact of the OWASP standard. On this page, ACS always refers to the OWASP Agent Control Standard.

Treat ACS as a reference architecture, not as a product feature. Start with an agent inventory covering tools, models, MCP servers and skills, and a risk classification, for example along the lines of the lethal trifecta. This is followed by policies for high-consequence capabilities on steps/toolCallRequest, a deliberate decision on failure posture and approvers, and connecting the trace to your SIEM; Chapter 14 describes the five steps in detail. The profile navigator and self-assessment show your starting point, and the whitepaper contains a 100-day programme. Verify vendor claims about ACS profiles through testing rather than taking them at face value. How to prove the effectiveness of your Guardian policies with negative tests and decision receipts in CI is shown in our deep dive “Agentic AI Security Testing” on the ICSPIS 2026 paper. VamiSec provides independent support with assessment, architecture, policy design, implementation and testing.

Standards & Sources

The content on this page is based on the following publicly available guides and studies.

OWASP GenAI Security Project · 2026

Agent Control Standard (ACS) — GitHub repository

Primary source: specification v0.1.0, release 0.1.2, 44 JSON schemas, reference implementation (PoC); code and schemas Apache-2.0, documentation CC BY-SA 4.0 — reviewed as of 3 October 2026

OWASP GenAI Security Project · 2026

ACS Instrument Specification v0.1.0

Published spec documentation: wire format, handshake, hook taxonomy with 19 hooks, dispositions, failure posture, signatures and error codes

OWASP GenAI Security Project · 2026

ACS Conformance — ACS-Core and profiles

Mandatory scope of ACS-Core, the six optional profiles and the note that nobody verifies conformance claims in v0.1.0

OWASP GenAI Security Project · 2026

ACS JSON Schemas v0.1.0 (example: defer-details.json)

Project-owned schema namespace since 5 September 2026; basis for the schema-faithful wire examples in the simulator

OWASP GenAI Security Project · 2026

Agent Control Standard (ACS) — resource page

Listed in the Agentic Security section, dated 1 September 2026

Zenity Labs (Rock Lambros) · 2026

Control Made It Into the Name: The Agent Control Standard Lands at OWASP

Blog post by the project lead dated 10 September 2026 on the project’s origins and relaunch; describes ACS as a “public preview” — vendor source

Cloud Security Alliance Labs · 2026

CSA Research Note: OWASP’s 2026 LLM Top 10 and New Agent Control Standard

External assessment dated 4 September 2026: ACS as an “architecture to plan around and pilot against”

OWASP GenAI Security Project — Agentic Security Initiative · 2025

OWASP Top 10 for Agentic Applications 2026

Risks ASI01–ASI10, published in December 2025; frame of reference for the risk matrix (ACS does not feature in it)

OWASP GenAI Security Project — Agentic Security Initiative · 2025

Agentic AI – Threats and Mitigations (Agentic Security Initiative resources)

Threat taxonomy T1–T15 in version 1.0 from February 2025; available via the initiative’s resource overview

European Union, Official Journal · 2024

Regulation (EU) 2024/1689 (Artificial Intelligence Act / AI Act)

Articles 9, 12, 14, 15, 19, 26, 50 and 72 as reference points for the regulatory mapping

European Union, Official Journal · 2026

Regulation (EU) 2026/1744 (Digital Omnibus on AI)

Postpones the high-risk obligations to 2 December 2027 (Annex III) and 2 August 2028 (Annex I) respectively

National Institute of Standards and Technology · 2023

NIST AI 100-1: Artificial Intelligence Risk Management Framework (AI RMF 1.0)

Voluntary framework; MANAGE 2.4 on mechanisms to supersede, disengage or deactivate AI systems

OpenTelemetry · accessed 10/2026

OpenTelemetry Semantic Conventions for Generative AI

Status “Development”; baseline for comparison with the ACS trace mappings (tool spans there: execute_tool)

Open Cybersecurity Schema Framework (Linux Foundation) · accessed 10/2026

OCSF Schema 1.5.0 — Categories and Classes

Cross-check of the class UIDs and names used by ACS, including 2004 Detection Finding and 6002 Application Lifecycle

OWASP Foundation / Ecma TC54 · 2025

CycloneDX Specification Overview

Currently version 1.7; ACS serialises the AgBOM to CycloneDX 1.6

Microsoft (Responsible AI) · 2026

Introducing Agent Control Specification: Portable runtime governance for AI Agents

For disambiguation: a separate Microsoft specification dated 2 June 2026, also abbreviated “ACS”, not part of the OWASP standard

Microsoft Open Source Blog · 2026

Introducing the Agent Governance Toolkit (Microsoft Open Source Blog)

Announcement dated 2 April 2026; the toolkit serves, unchanged, as the policy engine of the ACS reference implementation

OpenAI · 2025

Continuously hardening ChatGPT Atlas against prompt injection attacks

22 December 2025: prompt injection is “unlikely to ever be fully ‘solved’” — an argument for model-independent runtime controls

Want to build runtime control for your AI agents?

VamiSec supports you independently: assessment of your agent landscape, Guardian architecture and policy design based on ACS, implementation and testing — without certification promises and with a clear view of the maturity of v0.1.