ACS separa dos roles. El Observed Agent es el sistema de IA supervisado: notifica cada paso relevante mediante un hook y aplica la respuesta, pero no decide sobre sus propias acciones. El Guardian Agent es la instancia de políticas: evalúa cada hook frente a la política del despliegue y responde con una disposition. Con ask interviene además un aprobador: una persona, un agente o un servicio cuya identidad debe verificar el Guardian. Lo decisivo para la arquitectura: el propio modelo no debe saber nada de los hooks; el control reside fuera de su ruta de salida.
OWASP Agent Control Standard (ACS): control de agentes de IA en tiempo de ejecución
El OWASP Agent Control Standard (ACS) es una especificación abierta según la cual un Guardian Agent examina las acciones de un agente de IA en hooks definidos y, mediante políticas, las permite, las bloquea, las modifica, las somete a aprobación o las aplaza. Este análisis en profundidad muestra lo que la versión 0.1.0 ofrece hoy y dónde están sus límites.
Actualizado: octubre de 2026 · Valeri Milke, Lead Auditor ISO 27001 e ISO 42001
Recibirá el enlace de descarga al instante en la página y por correo electrónico.
JSON-RPC 2.0 · HTTP(S) o stdio
Observed Agentp. ej., agente de programación
steps/toolCallRequestallowdenymodifyaskdefer
Guardian AgentPolicy as Code + LLM opcional
- allow
- deny
- modify
- ask
- defer
deny · destructive_shell_command_blocked · agt_stockmodify · parameter_overrides · LIMIT 500ask · approver=human · timeout_disposition=deny
InstrumentHooks y dispositionsTraceOpenTelemetry y OCSFInspectAgBOM
19hooks nativos steps/* en la especificación v0.1.0, de sessionStart a sessionEnd, incluidos los tres hooks de skills
5dispositions: allow, deny, modify, ask y defer; la especificación asigna expresamente el vocabulario completo a steps/toolCallRequest
7perfiles de conformidad: acs-core como obligatorio más seis perfiles opcionales, declarados en el handshake, sin verificación externa
6hooks mínimos para ACS-Core: sessionStart, userMessage o agentTrigger, toolCallRequest, toolCallResult, agentResponse, sessionEnd
Los agentes de IA no solo leen, también actúan: ejecutan comandos de shell, llaman a API, envían correos electrónicos y escriben en su memoria. Los prompts de sistema no controlan nada de eso. El OWASP Agent Control Standard (ACS) interviene precisamente aquí y estandariza el control en tiempo de ejecución como un protocolo entre el agente y el Guardian. Esta página explica la especificación v0.1.0 desde la perspectiva del CISO: hooks y dispositions, failure posture, Policy as Code, pista de auditoría (audit trail), trazas según OpenTelemetry y OCSF, y la AgBOM. El simulador muestra ejemplos de mensajes wire fieles al esquema, la matriz de riesgos relaciona ACS con el OWASP Agentic Top 10 (valoración de VamiSec) y señalamos con franqueza lo que este estándar incipiente todavía no ofrece. El navegador de perfiles, la autoevaluación y un whitepaper para CISOs le ayudan a dar los primeros pasos.
Del Agent Observability Standard a ACS v0.1
Cómo un proyecto de observabilidad se convirtió en un estándar de control: todos los hitos documentados hasta el objetivo de v0.2.0. Haga clic en un hito para ver los detalles.
11 de mayo de 2025
Inicio como Agent Observability Standard (AOS)
Michael Bargury realiza los primeros commits en el repositorio zenitysec/AOS. Ya AOS se estructura en Instrument, Trace e Inspect, los tres pilares que siguen definiendo ACS hoy. Entre mediados de mayo y el 5 de junio de 2025, la especificación del protocolo se llama temporalmente ASOP (Agent Security & Observability Protocol).
junio de 2025
AOS se convierte en proyecto de OWASP
Tras una etapa intermedia, el repositorio pasa a la organización de OWASP; desde mediados de junio de 2025, las contribuciones se canalizan a través de OWASP. AOS figura como «OWASP other project» y su responsable es Michael Bargury. A finales de diciembre de 2025, el trabajo se detiene.
10 de abril de 2026
Cambio de nombre a Agent Control Standard (ACS)
Rock Lambros renombra el proyecto: «Agent Observability» pasa a ser «Agent Control». ACS funciona temporalmente de forma independiente, bajo licencia MIT, en su propia organización de GitHub.
27 de mayo de 2026
Nota de prensa de lanzamiento
A través de Business Wire, ACS se presenta como marco abierto para la gobernanza en tiempo de ejecución de agentes de IA; según el comunicado, con licencia MIT y sin control comercial por parte de una sola empresa.
5 de junio de 2026
Especificación canónica v0.1.0
La importación de la v0.1.0 canónica aporta las secciones normativas centrales actuales: handshake, failure posture, cadena de auditoría, firmas, códigos de error, hooks de skills, perfiles de conformidad y los esquemas JSON. Tres días antes, Microsoft había publicado su propia «Agent Control Specification», un proyecto distinto con las mismas siglas.
11 de agosto de 2026
Release v0.1.1 y nuevo modelo de licencias
Desde entonces, el código y los esquemas están bajo Apache-2.0 y la documentación bajo CC BY-SA 4.0; las releases hasta v0.1.0 mantienen la licencia MIT. La versión de release y la de la especificación se desacoplan: la especificación sigue siendo v0.1.0. El repositorio se traslada a la organización GenAI-Security-Project.
septiembre de 2026
Relanzamiento en el OWASP GenAI Security Project
Página de recursos en genai.owasp.org (1 de septiembre), sitio de la especificación y los 44 esquemas JSON bajo URI propias del proyecto (5 de septiembre), tabla de taxonomía de hooks de la especificación corregida a 19 hooks (7 de septiembre), gobernanza e implementación de referencia PoC basada en el Agent Governance Toolkit de Microsoft (10 de septiembre).
21 de septiembre de 2026
Tag v0.1.2
El tag se asigna a posteriori a un commit del 9 de septiembre: el envelope de respuesta ya puede incluir un ServerHello. Además, desde v0.1.1 han cambiado las URI de los esquemas y el texto de la especificación; aun así, la versión de la especificación sigue siendo v0.1.0.
marzo de 2027 (objetivo)
v0.2.0 prevista
Según el proyecto, es el objetivo para la próxima especificación: entre otras cosas, streaming e interrupción, ASK recursivo y quórum, wrapping de A2A, binding de Cedar, aislamiento multi-tenant y federación de la AgBOM. Para v1.0 no hay fecha.
Nueve conceptos clave del Agent Control Standard
Haga clic en una tarjeta para leer el concepto clave; el orden sigue el recorrido de una acción del agente desde el hook, pasando por la decisión, hasta la evidencia.
Los hooks son los puntos de control de ACS. La especificación v0.1.0 define 19 hooks nativos steps/*: desde sessionStart, pasando por userMessage, knowledgeRetrieval, memoryStore y toolCallRequest, hasta los tres hooks de skills y sessionEnd. A ellos se suman agbom/snapshot, agbom/changed, system/ping y handshake/hello. Los frameworks deben disparar steps/toolCallRequest para cada acción que salga del contexto de razonamiento, también para shell, sistema de archivos y red. ACS-Core exige al menos seis hooks; lo que el Guardian no incluya en methods_evaluated se considera permitido sin evaluación.
El Guardian responde con una de cinco dispositions: allow deja que la acción se ejecute, deny la bloquea, modify reescribe parámetros o enmascara contenidos, ask la somete a un aprobador y defer aplaza la decisión, por ejemplo cuando falta contexto. Todas salvo allow exigen una justificación en el campo reasoning. La especificación asigna expresamente el vocabulario completo a steps/toolCallRequest; otros hooks admiten conjuntos más reducidos, y los hooks puramente de auditoría, como sessionEnd, no llevan ninguna decisión. Dentro de las dispositions, los valores por defecto son estrictos: las decisiones ask y defer vencidas pasan a deny, y el agente trata un modify contrario a las reglas como un deny.
Cada sesión comienza con handshake/hello. El Observed Agent indica versiones, métodos implementados, transportes y perfiles; el Guardian establece en el ServerHello qué métodos evalúa realmente (methods_evaluated), cuánto tiempo espera el agente una decisión (timeout_config) y qué se aplica en caso de fallo (on_decision_failure). Así, el handshake determina la cobertura real: lo que no se negocia se ejecuta sin evaluación. Para el caso de fallo existen dos valores predeterminados —uno para el inicio de la sesión y otro para cada paso individual— y ambos están por defecto en proceed, es decir, fail-open. Las FAQ y el capítulo 6 explican qué significa esto para la operación.
El Guardian trabaja en dos capas. La capa determinista evalúa primero cada hook, como Policy as Code; en v0.1, con OPA/Rego como referencia inicial; para v0.2 está previsto un binding de Cedar. Solo si su configuración delega entra en juego una capa LLM opcional. Esta no ve el código de las políticas, debe tratar los datos no fiables como datos y registrar sus decisiones con la justificación, el identificador del modelo y, si existe, la confianza; su resultado vuelve a pasar después por la capa determinista. Un Guardian puramente determinista es plenamente conforme. La especificación solo define la interfaz con el motor de políticas, no el motor en sí, ni tampoco el contenido de las políticas. Por tanto, la eficacia depende por completo de sus reglas.
El Guardian mantiene por sesión una cadena append-only de ContextEntries, enlazadas mediante hashes SHA-256 basados en la canonicalización JCS según RFC 8785. Para los pasos que transportan contenido, debe publicar el chain_hash actual en su respuesta. ACS-Core exige además una firma HMAC-SHA256 sobre cada solicitud y cada respuesta con una clave de sesión derivada mediante HKDF, así como protección contra replay mediante request_id y una ventana temporal. Esto dota a la pista de auditoría de evidencia de manipulación frente a ataques en la red, pero no frente a un Guardian comprometido. El no repudio solo lo aporta acs-crypto con ML-DSA-65, y la vinculación con el contenido de las solicitudes, solo acs-audit mediante request_hash.
ACS no inventa un nuevo formato de log. El pilar Trace aporta un vocabulario normativo para OpenTelemetry y OCSF: nombres de span y atributos por hook, las decisiones como evento de span acs.decision y las decisiones distintas de allow como OCSF Detection Finding (2004), con una severidad que va de 2 para modify a 4 para deny. El objetivo son los pipelines de SIEM existentes, sin parsers especiales. Trace es best-effort: un fallo del receptor no bloquea nada, y los eventos de traza son autodeclaraciones del entorno observado. Los mapeos tienen el estado «Working draft», no cubren los tres hooks de skills y difieren de OCSF y OpenTelemetry en algunos nombres de clases y de spans.
Usar la telemetría de ACS en las pruebas de seguridad →La AgBOM es el inventario dinámico de un Observed Agent: ocho tipos de componentes, desde model, mcp_server y a2a_peer, pasando por tool, knowledge_source y memory_store, hasta agent_capability y skill. agbom/snapshot lo notifica una vez por sesión, antes del primer hook que transporta contenido; agbom/changed notifica los cambios en tiempo de ejecución, aunque solo en el perfil acs-inspect-dynamic. Con deny, el Guardian puede rechazar sesiones con componentes vetados o bloquear un hot-swap. Las serializaciones según CycloneDX 1.6, SPDX 3.0 o SWID son «Working draft». La AgBOM es una autodeclaración del agente y no sustituye ni a una AI-BOM ni a la SBOM exigida por el Cyber Resilience Act.
ACS-Core es obligatorio; a él se suman seis perfiles opcionales: acs-trace, acs-inspect, acs-inspect-dynamic, acs-provenance, acs-crypto y acs-audit. Ambas partes los declaran en el handshake, y en v0.1.0 nadie lo verifica: no hay suite de pruebas, ni registro, ni organismo de evaluación. Incluso un Guardian permisivo es conforme. La única implementación de referencia es una prueba de concepto que evalúa en vivo dos de los 19 hooks y no implementa ni HMAC ni protección contra replay. El objetivo para la próxima especificación, v0.2.0, es marzo de 2027; para v1.0 no hay fecha. Planifique ACS como objetivo de arquitectura, no como certificado.
Probar uno mismo la eficacia: pruebas negativas a partir del modelo de amenazas →Explorador del estándar
Tres pilares, la arquitectura del Guardian, identidad y provenance, y los perfiles de conformidad, cada uno con las afirmaciones clave de la especificación v0.1.0 y sus límites.
Pilar19 hooks · 5 dispositions
- Interceptación, evaluación y aplicación en tiempo real: envelopes JSON-RPC 2.0 sobre HTTP(S) o stdio, métodos de hook en el espacio de nombres steps/*.
- 19 hooks nativos a lo largo de todo el ciclo de vida: sesión, turno, mensajes, conocimiento y memoria, herramientas, compactación, subagentes y skills.
- steps/toolCallRequest debe dispararse para cada acción que salga del contexto de razonamiento, también para las operaciones integradas de shell, archivos y red.
- El Observed Agent debe esperar la decisión y aplicarla; un framework que ignore los veredictos no es conforme.
- Streaming, notificaciones e interrupción no existen en v0.1.0: una respuesta solo puede ser de tipo final.
JSON-RPC 2.0steps/*steps/toolCallRequestDecision Honoring
Perfil acs-traceOpenTelemetry + OCSF
- Vocabulario normativo en lugar de un transporte propio: nombres de span, atributos, clases OCSF y mapeo de severidad por hook.
- Jerarquía de spans acs.session → acs.turn → span del step; las decisiones se adjuntan como evento acs.decision al step que autorizan o bloquean.
- Clases OCSF por UID: 3002 Authentication, 1007 Process Activity, 6005 Datastore Activity, 2004 Detection Finding para deny, modify, ask y defer.
- Quien declare acs-trace debe emitir cada decisión como evento de traza con disposition, evaluador y la justificación disponible.
- Límites: best-effort y autoinformado, hooks de skills sin mapeo; el span de herramienta de ACS gen_ai.tool.call es en OpenTelemetry solo un prefijo de atributo (allí: execute_tool), y la clase 6002 se llama en OCSF «Application Lifecycle».
OpenTelemetryOCSF 1.5+Detection Finding 2004acs.decision
Perfil acs-inspect8 tipos de componentes
- La AgBOM como inventario dinámico y consultable: model, mcp_server, a2a_peer, tool, knowledge_source, memory_store, agent_capability y skill.
- agbom/snapshot una vez por sesión, antes del primer hook que transporta contenido; el Guardian lo escribe en la cadena de auditoría.
- agbom/changed con cada cambio del grafo de componentes, pero solo bajo acs-inspect-dynamic; sin este perfil, el agente no notifica los hot-swaps durante la sesión.
- Las políticas del Guardian pueden detener con deny modelos, herramientas o servidores MCP vetados; si una política depende del inventario, acs-inspect es obligatorio.
- Serialización según CycloneDX 1.6, SPDX 3.0 o SWID (al menos uno): mapeos en estado «Working draft», en parte no válidos según el esquema.
agbom/snapshotagbom/changedCycloneDX 1.6SPDX 3.0SWID
ArquitecturaPrimero lo determinista
- La capa determinista se ejecuta siempre primero: Policy as Code con OPA/Rego como referencia inicial de v0.1; para v0.2 está previsto un binding de Cedar.
- Una capa LLM opcional solo interviene por delegación, sin acceso al código de las políticas y registrando la justificación, el identificador del modelo y, si existe, la confianza.
- Los Guardians puramente deterministas son plenamente conformes; metadata.evaluator indica si la decisión fue deterministic, agent o composite.
- La especificación solo define la interfaz con el motor; las políticas canónicas no deberían contener llamadas HTTP externas.
- Paradigmas sin ampliar el wire: IBAC, FIDES, CaMeL y reglas al estilo de AARM sobre el contexto acumulado.
Policy as CodeOPA/RegoCedar (v0.2)IBAC · FIDES · CaMeL · AARM
Perfil acs-provenance7 valores de origin
- ACS no prescribe ningún mecanismo de autenticación; los esquemas de confianza como SPIFFE, OIDC o una PKI corporativa quedan en manos del despliegue.
- Las identidades del Observed Agent, del Guardian y del autor de las políticas no deben mezclarse; los aprobadores deben estar autenticados.
- Session Intent: Intent.parsed se fija antes del primer paso que transporta contenido y solo se amplía mediante una aprobación autenticada con ask.
- La provenance registra hechos por cada campo de datos: provenance_id, origin (siete valores, de user_input a external), source_id y derived_from.
- La provenance la establece el framework de forma determinista, nunca el LLM; bajo acs-provenance, esto se aplica a todos los campos con datos de la sesión.
- No hay campo trust en el esquema v0.1: el Guardian deduce la confianza a partir del origen; el procesamiento por un LLM no convierte datos no fiables en fiables.
originderived_fromprovenance_producerIntent.parsed
Autodeclaración1 perfil obligatorio + 6 adicionales
- acs-core es obligatorio e incluye, entre otros, handshake, envelopes, seis hooks mínimos, las cinco dispositions, cadena de auditoría con chain head publicado, protección contra replay, firma HMAC-SHA256 y system/ping.
- ACS-Core no exige eventos de traza, AgBOM, provenance a nivel de campo, firmas asimétricas ni request_hash: eso lo aportan los perfiles opcionales.
- Los perfiles son una autodeclaración en el handshake: sin suite de pruebas, sin registro, sin organismo de evaluación (issue #19, prioridad P1, abierto).
- Un Guardian permisivo es conforme: la conformidad no dice nada sobre la rigurosidad de sus políticas.
- El alcance obligatorio está en evolución: el PR #21, abierto, rebajaría, entre otros, modify y system/ping a SHOULD.
- Combinaciones de ejemplo de la especificación: una integración mínima en un IDE solo con acs-core y un despliegue de alta garantía con los siete perfiles.
acs-coreacs-traceacs-inspectacs-cryptoacs-audit
Interactivo
Simulador del Guardian: seis escenarios paso a paso
Elija un escenario y siga cómo una solicitud de hook pasa del Observed Agent al Guardian Agent, qué disposition se genera y qué queda en la pista de auditoría, incluido el caso de que el Guardian falle.
Agente de programación
El agente de programación debe limpiar los artefactos de compilación. Por una ruta mal resuelta, el comando de shell previsto, rm -rf, apunta al directorio personal en lugar de a la carpeta de compilación.
- 1Solicitud de hook (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" } } } - 2Evaluación en el Guardian
- Capa determinista (Policy as Code; referencia en v0.1: OPA/Rego): el framework notifica la llamada al shell con la capability filesystem.delete y la operación delete_recursive; se aplica la regla deny_recursive_delete_outside_workspace.
- Comprobación de la ruta: el destino ~/ (directorio personal) queda fuera del espacio de trabajo al que la política restringe esta sesión.
- Comprobación de provenance: el comando es agent_generated (derivado de p-101); ninguna persona ha indicado expresamente este destino.
- No se necesita la capa LLM opcional: deny con reasoning, reason_codes y policy_references, evaluador deterministic.
DispositiondenyAcción bloqueada - 3Respuesta (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" } } }El Observed Agent no ejecuta el borrado y recibe la justificación. Si propone una ruta corregida, esta se vuelve a comprobar.
- 4Pista de auditoría (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" } } }El mapeo de ACS representa las decisiones distintas de allow como clase OCSF 2004 Detection Finding; deny recibe severity_id 4 (High).
Qué significa para usted
Las acciones destructivas deben quedar detrás de una regla determinista que actúe antes de la ejecución, no en el prompt de sistema. Esto solo es eficaz si el framework canaliza a través de steps/toolCallRequest toda acción con efecto externo, incluidas las operaciones integradas de archivos y de shell.
ASI02ASI05
Agente de analítica
El agente de analítica quiere ejecutar SELECT * sobre la tabla de clientes para un informe, sin límite de filas y con todas las columnas.
- 1Solicitud de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/toolCallRequest", "id": 17, "params": { "acs_version": "0.1.0", "request_id": "d4a7c0e3-5f8b-4c1e-9a6d-2b5e8f1c4a73", "timestamp": "2026-10-06T09:24:18Z", "metadata": { "agent_id": "analytics-agent-02", "session_id": "8e1b4c7a-2f5d-4a90-b6c3-d4e5f6a7b8c9", "turn_id": "c2e5f8a1-3b6d-4f9c-8a2e-7d0f1c4e6b92" }, "payload": { "tool": { "name": "database_query" }, "capability": "database.read", "arguments": { "query": { "value": "SELECT * FROM customers", "provenance": { "provenance_id": "p-205", "origin": "agent_generated", "derived_from": [ "p-201" ] } } } }, "signature": { "algorithm": "HMAC-SHA256", "value": "O3OXC3lacLzJOEbWjqw/o0TzL6sXBF+xkW16O8RIrHw=", "key_id": "sess-hmac-analytics-02" } } } - 2Evaluación en el Guardian
- Capa determinista: la regla cap_unbounded_select de la política db-row-limit detecta una consulta sin LIMIT sobre una tabla clasificada como sensible.
- La política permite la finalidad (informe), pero solo con las columnas autorizadas y un máximo de 500 filas (valor límite ilustrativo).
- En lugar de bloquear, el Guardian solo reescribe el argumento query mediante parameter_overrides. No puede combinarlo con una sustitución del payload completo (modified_content).
- Respuesta: modify con reasoning y modifications; el Observed Agent debe ejecutar la consulta modificada.
DispositionmodifyParámetros reescritos - 3Respuesta (Guardian → Observed Agent)
{ "jsonrpc": "2.0", "id": 17, "result": { "type": "final", "acs_version": "0.1.0", "request_id": "d4a7c0e3-5f8b-4c1e-9a6d-2b5e8f1c4a73", "decision": "modify", "reasoning": "Unbounded SELECT on customers exceeds the row-limit policy; query capped at 500 rows and reduced to approved columns.", "reason_codes": [ "row_limit_exceeded" ], "modifications": { "parameter_overrides": { "query": "SELECT id, segment, country FROM customers LIMIT 500" } }, "policy_references": [ { "policy_id": "db-row-limit", "policy_version": "2026.10.1", "rule_id": "cap_unbounded_select" } ], "metadata": { "evaluator": "deterministic", "evaluation_duration_ms": 4 }, "chain_hash": "6edfb8f26fe425f6891d7fccad3991a14e818d1199c29b9677724794cb725521", "signature": { "algorithm": "HMAC-SHA256", "value": "JmDUSrtQvFUL5/cFPeiP0nNUi0lN9L4ZkIw8+oNHn48=", "key_id": "sess-hmac-analytics-02" } } }La consulta se ejecuta con LIMIT 500 y menos columnas. El agente obtiene un resultado útil y el volumen de datos recuperados sigue acotado.
- 4Pista de auditoría (trace)
{ "entry_id": "ce-0002", "step_id": "d4a7c0e3-5f8b-4c1e-9a6d-2b5e8f1c4a73", "step_type": "steps/toolCallRequest", "request_hash": "1ab512a11f6ed1d456e6a43b39e879772a0d2dd1045e4ce8887ce2ff449e7657", "timestamp": "2026-10-06T09:24:18Z", "previous_hash": "daceae6d78730c33d4805a0daca7bbd1929f323ada77cab0374a6cbfdcf8e570", "entry_hash": "6edfb8f26fe425f6891d7fccad3991a14e818d1199c29b9677724794cb725521" }Aquí ve el ContextEntry de la cadena de auditoría: entry_hash encadena el paso con previous_hash y coincide con el chain_hash de la respuesta del Guardian. request_hash vincula el contenido de la solicitud: recomendado en ACS-Core, obligatorio solo con acs-audit.
Qué significa para usted
modify es la herramienta para el «sí, pero de forma segura»: impone técnicamente la minimización de datos sin bloquear el caso de uso. Un modify mal formado debe tratarlo el Observed Agent como deny; aquí la especificación exige fail-closed.
ASI02ASI03
Agente financiero
El agente financiero quiere pagar una factura de proveedor de 48.500 EUR. Los datos bancarios del beneficiario proceden de un correo electrónico, no de los datos maestros de proveedores.
- 1Solicitud de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/toolCallRequest", "id": 9, "params": { "acs_version": "0.1.0", "request_id": "f1b4e7a0-6c9d-4f2a-b8e3-5d7a0c3f6e91", "timestamp": "2026-10-06T10:05:33Z", "metadata": { "agent_id": "finance-agent-ap-01", "session_id": "b7c0d3e6-4a9f-4e2b-8d15-3f6a9c2e5b18", "turn_id": "e3f6a9c2-5d8b-4b1e-9c47-0a3d6f9b2e54" }, "payload": { "tool": { "name": "payments_api" }, "operation": "create_transfer", "capability": "payment.initiate", "arguments": { "amount": { "value": "48500.00 EUR", "provenance": { "provenance_id": "p-311", "origin": "tool_output", "source_id": "invoice_parser" } }, "beneficiary": { "value": "vendor V-2291, bank account changed via e-mail", "provenance": { "provenance_id": "p-312", "origin": "tool_output", "source_id": "mail_inbox" } } } }, "signature": { "algorithm": "HMAC-SHA256", "value": "BNOgarNt++1Z6umtLvb3ocuYI3VXSDu/0UyMwiUys38=", "key_id": "sess-hmac-finance-01" } } } - 2Evaluación en el Guardian
- Capa determinista: el importe supera el límite para pagos automáticos; se aplica la regla ask_above_limit_or_changed_beneficiary (ilustrativa).
- Comprobación de provenance: el argumento beneficiary lleva origin tool_output con source_id mail_inbox y, según el mapeo por defecto, se considera no fiable.
- El Guardian solicita una aprobación: approver.type human, timeout_seconds 900, timeout_disposition deny; la ampliación del intent (intent_extension) solo se aplica a esta solicitud (scope this_request).
- El aprobador debe autenticarse y el Guardian comprueba su identidad frente a la política; un aprobador no puede devolver a su vez un ask.
DispositionaskAprobación solicitada - 3Respuesta (Guardian → Observed Agent)
{ "jsonrpc": "2.0", "id": 9, "result": { "type": "final", "acs_version": "0.1.0", "request_id": "f1b4e7a0-6c9d-4f2a-b8e3-5d7a0c3f6e91", "decision": "ask", "reasoning": "Amount exceeds the auto-approval limit and the beneficiary's bank details were taken from an e-mail, not from vendor master data.", "reason_codes": [ "approval_threshold_exceeded", "beneficiary_changed" ], "ask_details": { "approver": { "type": "human", "id": "treasury-approver@example.com" }, "question": "Approve transfer of 48,500.00 EUR to vendor V-2291 with changed bank details?", "options": [ "approve", "reject" ], "timeout_seconds": 900, "timeout_disposition": "deny", "intent_extension": { "capabilities": [ { "tool": "payments_api", "operation": "create_transfer", "resource": "vendor:V-2291" } ], "scope": "this_request" } }, "policy_references": [ { "policy_id": "ap-payments", "policy_version": "2026.10.1", "rule_id": "ask_above_limit_or_changed_beneficiary" } ], "cited_provenance_ids": [ "p-311", "p-312" ], "metadata": { "evaluator": "deterministic", "evaluation_duration_ms": 5 }, "chain_hash": "01918aa3a3c9b7ec4b99826d21a9d843b5f071655c3dc155c50b2c2fe93db2b8", "signature": { "algorithm": "HMAC-SHA256", "value": "I7WChoFe42FDc/PXgS+nKkaQrZFRhoDuqUMLdj8qflA=", "key_id": "sess-hmac-finance-01" } } }El pago queda a la espera de la aprobación de tesorería. Si nadie responde en 15 minutos, se aplica deny: la transferencia no se ejecuta.
- 4Pista de auditoría (trace)
{ "_note": "vereinfachter Auszug", "class_uid": 2004, "class_name": "Detection Finding", "category_uid": 2, "activity_id": 1, "severity_id": 3, "time": 1791281133005, "metadata": { "version": "1.5.0" }, "finding_info": { "uid": "dec-f1b4e7a0", "title": "Approval required: payment above limit, changed beneficiary" }, "enrichments": [ { "name": "acs_provenance_origin", "value": "tool_output" }, { "name": "acs_provenance_source_id", "value": "mail_inbox" } ], "unmapped": { "acs": { "decision": "ask", "evaluator": "deterministic", "policy_references": [ { "policy_id": "ap-payments", "policy_version": "2026.10.1", "rule_id": "ask_above_limit_or_changed_beneficiary" } ], "reason_codes": [ "approval_threshold_exceeded", "beneficiary_changed" ], "cited_provenance_ids": [ "p-311", "p-312" ], "session_id": "b7c0d3e6-4a9f-4e2b-8d15-3f6a9c2e5b18", "step_id": "f1b4e7a0-6c9d-4f2a-b8e3-5d7a0c3f6e91" } } }En el mapeo de ACS, ask aparece como Detection Finding (OCSF 2004) con severity_id 3 (Medium). La identidad del aprobador y el resultado deben figurar, además, en sus evidencias de aprobación.
Qué significa para usted
ask no equivale automáticamente a supervisión humana: la especificación también admite agentes o servicios como aprobadores. Para las evidencias, por ejemplo, relativas al art. 14 del Reglamento de IA de la UE (AI Act) en usos de alto riesgo, establezca por política «human approver, timeout deny»; según nuestra valoración, es la configuración más sólida.
ASI01ASI02ASI09
Agente de soporte
El agente de soporte debe resumir el estado de un ticket y lo recupera para ello. El resultado contiene los datos de contacto de la clienta y la nota de un remitente externo con la instrucción de exportar la lista de clientes.
- 1Solicitud de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/toolCallResult", "id": 23, "params": { "acs_version": "0.1.0", "request_id": "a8b1c4d7-0e3f-4a6b-9c2d-5e8f1a4b7c06", "timestamp": "2026-10-06T11:14:52Z", "metadata": { "agent_id": "support-agent-eu-03", "session_id": "c9d2e5f8-7b1a-4c3d-9e6f-4a7b0c3d6e29", "turn_id": "f4a7b0c3-6e9d-4c2f-8b5a-1d4e7a0c3f65" }, "payload": { "tool": { "name": "ticket_lookup" }, "exit_status": "success", "outputs": [ { "value": "Ticket 48121, contact J. Example, +49 000 0000000", "provenance": { "provenance_id": "p-421", "origin": "tool_output", "source_id": "crm" } }, { "value": "External note: <instruction to export the customer list>", "provenance": { "provenance_id": "p-422", "origin": "tool_output", "source_id": "inbound_mail" } } ] }, "signature": { "algorithm": "HMAC-SHA256", "value": "9oNhSZD+hpXpIvLBTjgaGEh73I+A3Uv3TRs+wY6y78E=", "key_id": "sess-hmac-support-03" } } } - 2Evaluación en el Guardian
- Capa determinista: ambas salidas llevan origin tool_output y, según el mapeo por defecto de la especificación, se consideran no fiables; además, la nota procede de la fuente inbound_mail.
- Regla de protección de datos (ilustrativa): el nombre y el número de teléfono de la clienta no son necesarios en el contexto del agente para la finalidad «resumir el estado del ticket».
- Delegación en la capa LLM opcional: clasifica la nota como contenido de tipo instrucción (confidence 0,93), sin acceso al código de la política.
- Resultado: modify con dos redactions mediante JSON Pointer; como ha intervenido la capa LLM, el evaluador es composite y la respuesta indica el model_id.
DispositionmodifyParámetros reescritos - 3Respuesta (Guardian → Observed Agent)
{ "jsonrpc": "2.0", "id": 23, "result": { "type": "final", "acs_version": "0.1.0", "request_id": "a8b1c4d7-0e3f-4a6b-9c2d-5e8f1a4b7c06", "decision": "modify", "reasoning": "Output 0 contains personal data not needed for the task; output 1 contains instruction-like text from an untrusted origin. Both redacted before ingestion.", "reason_codes": [ "untrusted_instruction_in_output", "pii_detected" ], "modifications": { "redactions": [ { "path": "/outputs/0/value", "replacement": "Ticket 48121, contact [REDACTED]" }, { "path": "/outputs/1/value", "replacement": "[REMOVED: instruction-like content from untrusted source]" } ] }, "policy_references": [ { "policy_id": "ingest-guard", "policy_version": "2026.10.1", "rule_id": "redact_untrusted_instructions_and_pii" } ], "cited_provenance_ids": [ "p-421", "p-422" ], "metadata": { "evaluator": "composite", "model_id": "guardian-classifier-demo", "confidence": 0.93, "evaluation_duration_ms": 180 }, "chain_hash": "ac94f144bfb94f6afc0e2eaa2b1e4494fb1fb70e20b7f3ce480703d602980c02", "signature": { "algorithm": "HMAC-SHA256", "value": "+fzpemnPIXE38pFATTnuxGutl+z5ik8rM4Bf7PbVvzM=", "key_id": "sess-hmac-support-03" } } }El agente recibe el resultado depurado: datos de contacto enmascarados y nota eliminada. La instrucción inyectada no llega a su contexto.
- 4Pista de auditoría (trace)
{ "_note": "vereinfachter Auszug", "class_uid": 2004, "class_name": "Detection Finding", "category_uid": 2, "activity_id": 1, "severity_id": 2, "time": 1791285292180, "metadata": { "version": "1.5.0" }, "finding_info": { "uid": "dec-a8b1c4d7", "title": "Tool result redacted before ingestion" }, "enrichments": [ { "name": "acs_provenance_origin", "value": "tool_output" }, { "name": "acs_provenance_source_id", "value": "inbound_mail" } ], "unmapped": { "acs": { "decision": "modify", "evaluator": "composite", "policy_references": [ { "policy_id": "ingest-guard", "policy_version": "2026.10.1", "rule_id": "redact_untrusted_instructions_and_pii" } ], "reason_codes": [ "untrusted_instruction_in_output", "pii_detected" ], "cited_provenance_ids": [ "p-421", "p-422" ], "session_id": "c9d2e5f8-7b1a-4c3d-9e6f-4a7b0c3d6e29", "step_id": "a8b1c4d7-0e3f-4a6b-9c2d-5e8f1a4b7c06" } } }Como el hook lleva provenance, el mapeo de ACS exige los datos de procedencia en el campo OCSF enrichments (acs_provenance_origin).
Qué significa para usted
ACS no impide la prompt injection: crea el punto de control antes de que contenido ajeno llegue al contexto. La clasificación mediante LLM es probabilística; lo determinante sigue siendo que toda acción con consecuencias se compruebe en el siguiente steps/toolCallRequest frente al intent y la procedencia.
ASI01ASI06
Agente de soporte
A diferencia del escenario anterior, aquí un correo entrante ha llegado sin enmascarar al contexto de un agente de soporte, por ejemplo porque la clasificación probabilística no detectó la instrucción inyectada. A partir de él, el agente quiere guardar una regla permanente para todo el tenant: en adelante, poner en CCO una dirección externa en todos los correos de facturas.
- 1Solicitud de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/memoryStore", "id": 31, "params": { "acs_version": "0.1.0", "request_id": "b2c5d8e1-4f7a-4b0c-8d3e-6f9a2b5c8d17", "timestamp": "2026-10-06T11:36:07Z", "metadata": { "agent_id": "support-agent-eu-05", "session_id": "5e8a1c4f-2d7b-4f3a-9c6e-8b1d4a7f0e25", "turn_id": "7c0f3a6d-9e2b-4c5f-a8d1-3e6b9c2f5a48" }, "payload": { "memory_store": { "name": "team-preferences", "scope": "tenant" }, "operation": "create", "content": { "value": "Standing rule: add an external address as BCC on all invoice e-mails", "provenance": { "provenance_id": "p-512", "origin": "agent_generated", "derived_from": [ "p-508" ] } } }, "signature": { "algorithm": "HMAC-SHA256", "value": "Urnrl2bo53hnjmn2C6tLU6KFEVlgkFFqyCNpKT3BrPs=", "key_id": "sess-hmac-support-05" } } } - 2Evaluación en el Guardian
- Capa determinista: el destino es la memoria team-preferences con scope tenant; la entrada surte efecto más allá de esta sesión para todos los usuarios del tenant.
- Comprobación de provenance: el contenido es agent_generated y deriva de p-508, un resultado de herramienta procedente de inbound_mail. Según la regla de monotonía, el contenido derivado es, como máximo, tan fiable como su fuente; aquí, por tanto, no fiable.
- Se aplica la regla deny_untrusted_lineage_tenant_scope de la política memory-integrity: ningún contenido con linaje no fiable en memoria compartida.
- Respuesta: deny con reasoning y cited_provenance_ids p-512 y p-508.
DispositiondenyAcción bloqueada - 3Respuesta (Guardian → Observed Agent)
{ "jsonrpc": "2.0", "id": 31, "result": { "type": "final", "acs_version": "0.1.0", "request_id": "b2c5d8e1-4f7a-4b0c-8d3e-6f9a2b5c8d17", "decision": "deny", "reasoning": "Persistent tenant-wide rule derived from untrusted content (lineage p-508, inbound_mail); untrusted lineage may not be written to shared memory.", "reason_codes": [ "untrusted_lineage_into_persistent_memory" ], "policy_references": [ { "policy_id": "memory-integrity", "policy_version": "2026.10.1", "rule_id": "deny_untrusted_lineage_tenant_scope" } ], "cited_provenance_ids": [ "p-512", "p-508" ], "metadata": { "evaluator": "deterministic", "evaluation_duration_ms": 2 }, "chain_hash": "ef90a699a55c8decd1afd054b8d3012ef00cae50140b942324212c9b0d5a3206", "signature": { "algorithm": "HMAC-SHA256", "value": "01xC/pBRTJUwAC6Yw/XHBYvyk+O+y7cbdkBogkltj7g=", "key_id": "sess-hmac-support-05" } } }La regla no se guarda. Las sesiones posteriores se inician sin la instrucción envenenada.
- 4Pista de auditoría (trace)
{ "_note": "vereinfachter Auszug", "class_uid": 2004, "class_name": "Detection Finding", "category_uid": 2, "activity_id": 1, "severity_id": 4, "time": 1791286567002, "metadata": { "version": "1.5.0" }, "finding_info": { "uid": "dec-b2c5d8e1", "title": "Memory write denied: untrusted lineage" }, "enrichments": [ { "name": "acs_provenance_origin", "value": "agent_generated" } ], "unmapped": { "acs": { "decision": "deny", "evaluator": "deterministic", "policy_references": [ { "policy_id": "memory-integrity", "policy_version": "2026.10.1", "rule_id": "deny_untrusted_lineage_tenant_scope" } ], "reason_codes": [ "untrusted_lineage_into_persistent_memory" ], "cited_provenance_ids": [ "p-512", "p-508" ], "session_id": "5e8a1c4f-2d7b-4f3a-9c6e-8b1d4a7f0e25", "step_id": "b2c5d8e1-4f7a-4b0c-8d3e-6f9a2b5c8d17" } } }El finding indica los provenance IDs que han llevado a la decisión; así, en el SOC se puede reconstruir la cadena desde el resultado de la herramienta hasta el intento de escritura.
Qué significa para usted
La memoria es una vía de persistencia para los ataques: lo que se inyecta hoy actúa mañana en otras sesiones. Por eso, memoryStore es un segundo punto de control si falta la comprobación en el resultado de la herramienta. Este control presupone datos de provenance (perfil acs-provenance): sin campos de linaje, el Guardian no puede verificar la procedencia.
ASI06ASI01
Agente de releases
El agente de releases quiere iniciar un despliegue en el entorno de producción. En ese momento, el Guardian no está accesible: falla el establecimiento de la conexión.
Failure posture
- 1Solicitud de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/toolCallRequest", "id": 12, "params": { "acs_version": "0.1.0", "request_id": "e6f9a2b5-1d4c-4e7f-a0b3-8c1d4e7f0a96", "timestamp": "2026-10-06T13:02:44Z", "metadata": { "agent_id": "release-agent-01", "session_id": "d0e3f6a9-8c2b-4d5e-9f1a-7b0c3d6e9f42", "turn_id": "a5b8c1d4-7e0f-4a3b-8c6d-9e2f5a8b1c37" }, "payload": { "tool": { "name": "deploy" }, "capability": "process.execute", "arguments": { "environment": { "value": "production", "provenance": { "provenance_id": "p-601", "origin": "user_input", "source_id": "chat" } } } }, "signature": { "algorithm": "HMAC-SHA256", "value": "ijZXZIKuaSuMU4u12zPLHINkFdTqcn1T27zuvAqmCw0=", "key_id": "sess-hmac-release-01" } } } - 2Evaluación en el Guardian
- El Observed Agent envía steps/toolCallRequest y la conexión se rechaza (connection refused). Ante un error tan inequívoco, puede reaccionar de inmediato en lugar de esperar al timeout negociado (timeout_config).
- Se produce así un decision failure: dentro del timeout no llega ninguna decisión utilizable.
- Ahora se aplica on_decision_failure: proceed (por defecto, fail-open) o deny (fail-closed), según lo negociado en el handshake.
DispositionproceedLa acción se ejecuta sin comprobación - 3Sin respuesta
El Guardian no responde. En el wire no hay ninguna disposition: el Observed Agent aplica la failure posture negociada.
Fail-open: el despliegue continúa sin comprobación. La especificación exige que cada uno de estos pasos se registre como evento de auditoría: el control se reduce a registro.
- 4Pista de auditoría (trace)
{ "_note": "vereinfachter Auszug", "seq": 14, "recorded_at": "2026-10-06T13:02:44.018Z", "session_id": "d0e3f6a9-8c2b-4d5e-9f1a-7b0c3d6e9f42", "method": "steps/toolCallRequest", "rpc_id": 12, "outcome": "proceeded", "posture": "proceed", "posture_source": "negotiated", "failure": { "kind": "transport", "message": "ConnectionRefused: Guardian endpoint not reachable" } }ACS no prescribe el formato de este evento de auditoría; el extracto sigue los nombres de campo del registro de auditoría del host de la implementación de referencia.
Qué significa para usted
El valor por defecto de ACS es fail-open. Quien quiera fail-closed para las acciones con consecuencias debe configurar expresamente on_decision_failure: deny y generar alertas en el SOC para los pasos sin decisión: un system/ping correcto no demuestra que la aplicación de las políticas funcione.
ASI02ASI08
Borrado recursivo fuera del espacio de trabajo: deny
Nota: ejemplos fieles al esquema de ACS v0.1.0 (validados frente a request-envelope.json, response-envelope.json, context-entry.json y los esquemas de los hooks, incluidas las variantes *.acs-provenance); los valores y los nombres de políticas y reglas son ilustrativos, las firmas se han calculado con una clave de demostración y los extractos de trace están simplificados; las asignaciones ASI son valoraciones de VamiSec. La única implementación de referencia (prueba de concepto) solo evalúa en vivo, por ahora, steps/toolCallRequest y steps/toolCallResult.
Pilar Instrument
Ciclo de vida de los hooks: dónde puede intervenir ACS
Los 19 hooks nativos steps/* de la especificación v0.1.0, así como los métodos de AgBOM, de handshake y de sistema, a lo largo de una sesión de agente. Seleccione un hook para ver el desencadenante, el margen de actuación del Guardian y los riesgos típicos.
01SesiónHandshake, inicio, activación, fin
02AgBOMInventario al inicio y en cada cambio
03TurnoEnvuelve cada turno del agente
04MensajesEntrada y salida
05Conocimiento y memoriaRecuperaciones RAG y memoria
06HerramientasAntes y después de cada acción
07CompactaciónCondensar la ventana de contexto
08SubagentesDelegación en el mismo proceso
09SkillsRegistrar, cargar, descargar
10SistemaLiveness
handshake/helloHandshakeHandshake
- Cuándo
- Al inicio de la sesión, antes de cualquier hook: el Observed Agent envía un ClientHello con las versiones, los métodos, los transportes, el modo de provenance y los perfiles que admite.
- Qué puede hacer el Guardian
- Responde con un ServerHello en lugar de con una disposition y fija negotiated_version, methods_evaluated, timeout_config y, opcionalmente, on_decision_failure. Los métodos fuera de methods_evaluated se consideran ALLOW-by-default. El Guardian puede rechazar la sesión, por ejemplo con PROVENANCE_REQUIRED (-32002).
- Riesgos típicos
- ASI03ASI08
steps/sessionStartMínimo CoreInicio de sesión
- Cuándo
- Una vez por sesión, tras el handshake y antes de todos los demás hooks steps/*; raíz de la cadena de auditoría.
- Qué puede hacer el Guardian
- allow o deny: una sesión puede rechazarse por identidad, policy_mode o plataforma antes de que llegue contenido. Un intent fijado aquí se convierte en el intent canónico de la sesión.
- Riesgos típicos
- ASI03ASI10
steps/agentTriggerMínimo Core: o userMessageActivación del agente
- Cuándo
- Cuando un evento, una programación, una llamada A2A, un usuario o el sistema activa el agente (trigger_type).
- Qué puede hacer el Guardian
- allow, deny o modify; por ejemplo, depurar los datos personales del payload del trigger antes de la activación. La delegación A2A se realiza mediante trigger_type a2a_inbound; el wrapping de A2A no está previsto hasta v0.2.
- Riesgos típicos
- ASI01ASI07
steps/sessionEndMínimo Core · solo auditoríaFin de sesión
- Cuándo
- Al finalizar la sesión (reason: completed, cancelled, error, timeout o abandoned); el Guardian sella la cadena.
- Qué puede hacer el Guardian
- Solo auditoría, sin decisión. Aporta el cierre con final_chain_hash para el análisis forense y las evidencias.
- Riesgos típicos
- ASI08
agbom/snapshotAgBOM · acs-inspectSnapshot de la AgBOM
- Cuándo
- Una vez por sesión, tras sessionStart y antes del primer hook con contenido: el inventario completo de componentes en forma canónica.
- Qué puede hacer el Guardian
- Normalmente allow; deny para rechazar una sesión con un modelo, una herramienta o un peer vetados. Obligatorio con acs-inspect; el snapshot se escribe en la cadena de auditoría.
- Riesgos típicos
- ASI04
agbom/changedAgBOM · acs-inspect-dynamicCambio en la AgBOM
- Cuándo
- Cuando, en mitad de la sesión, se añade o desaparece un componente o cambia su versión (diff o full_snapshot).
- Qué puede hacer el Guardian
- allow o deny; por ejemplo, bloquear un cambio de modelo en tiempo de ejecución o una herramienta instalada por el usuario. Obligatorio solo con acs-inspect-dynamic.
- Riesgos típicos
- ASI04
steps/turnStartInicio de turno
- Cuándo
- Al inicio de cada turno del agente; fija el turn_id para todos los pasos siguientes hasta el turnEnd correspondiente.
- Qué puede hacer el Guardian
- Con capacidad de decisión: deny impide el turno. En la práctica, la mayoría de los despliegues responde con allow y usa el hook para cambios de estado en la política.
- Riesgos típicos
- ASI01ASI10
steps/turnEndSolo auditoríaFin de turno
- Cuándo
- Al final de un turno (outcome: completed, deferred, error, interrupted o denied_at_start).
- Qué puede hacer el Guardian
- Solo auditoría: el turno ya se ha ejecutado; deny y modify quedan excluidos.
- Riesgos típicos
- ASI08
steps/userMessageVariante acs-provenanceMínimo Core: o agentTriggerEntrada del usuario
- Cuándo
- Cuando llega una entrada del usuario, antes de que alcance el contexto de razonamiento del agente.
- Qué puede hacer el Guardian
- allow, deny o modify; por ejemplo, enmascarar contenido antes de que el agente lo procese.
- Riesgos típicos
- ASI01ASI09
steps/agentResponseVariante acs-provenanceMínimo CoreRespuesta del agente
- Cuándo
- Antes de que una salida se envíe al usuario, a un peer A2A, al agente superior o a un destino externo.
- Qué puede hacer el Guardian
- allow, deny o modify; por ejemplo, eliminar contenido confidencial antes de que la salida llegue al destinatario.
- Riesgos típicos
- ASI09ASI01
steps/knowledgeRetrievalVariante acs-provenanceRecuperación de conocimiento (RAG)
- Cuándo
- En las consultas a bases de datos vectoriales, índices de búsqueda o bases de conocimiento, antes de que los resultados lleguen al contexto.
- Qué puede hacer el Guardian
- allow, deny o modify; por ejemplo, enmascarar resultados procedentes de fuentes no autorizadas.
- Riesgos típicos
- ASI06ASI01
steps/memoryContextRetrievalVariante acs-provenanceLectura de memoria
- Cuándo
- Cuando se cargan en el contexto entradas de la memoria (scope session, user, tenant o global).
- Qué puede hacer el Guardian
- allow, deny o modify; por ejemplo, filtrar las entradas de procedencia no fiable.
- Riesgos típicos
- ASI06
steps/memoryStoreVariante acs-provenanceEscritura en memoria
- Cuándo
- Antes de que el agente escriba en la memoria persistente (create, update o delete).
- Qué puede hacer el Guardian
- allow, deny o modify: el punto central contra el memory poisoning, por ejemplo cuando se pretende escribir en una memoria compartida contenido con linaje no fiable.
- Riesgos típicos
- ASI06
steps/toolCallRequestVariante acs-provenanceMínimo Core · las 5 dispositionsLlamada a herramienta
- Cuándo
- Tras analizar una llamada a herramienta y antes de su ejecución. Los frameworks deben disparar el hook para toda acción con efecto externo, también para el sistema de archivos, la red, los procesos y el shell.
- Qué puede hacer el Guardian
- Vocabulario completo: allow, deny, modify, ask y defer. Aquí intervienen la comprobación del intent (IBAC) y las políticas basadas en la procedencia (FIDES, CaMeL, AARM).
- Riesgos típicos
- ASI02ASI05ASI03
steps/toolCallResultVariante acs-provenanceMínimo CoreResultado de herramienta
- Cuándo
- Tras la ejecución de una herramienta, antes de que el resultado llegue al contexto del agente.
- Qué puede hacer el Guardian
- allow, deny o modify; por ejemplo, redactions mediante JSON Pointer para datos personales o instrucciones inyectadas.
- Riesgos típicos
- ASI01ASI06ASI02
steps/preCompactAntes de la compactación
- Cuándo
- Antes de condensar la ventana de contexto (por umbral de tamaño, de forma manual o a iniciativa del agente o del framework).
- Qué puede hacer el Guardian
- Con capacidad de decisión: deny bloquea la compactación, por ejemplo mientras haya datos no fiables en el contexto y no se haya producido un reanclaje fiable.
- Riesgos típicos
- ASI06
steps/postCompactTras la compactación
- Cuándo
- Después de condensar el contexto; incluye el nuevo resumen y los chain hashes anterior y posterior.
- Qué puede hacer el Guardian
- Sin decisión en sentido estricto: modify está permitido (reescribir el resumen) y deny, expresamente excluido. El resumen debe llevar origin agent_generated con el linaje completo.
- Riesgos típicos
- ASI06
steps/subagentStartInicio de subagente
- Cuándo
- Cuando se inicia un subagente en el mismo proceso (sin frontera A2A); recibe su propio session_id y su propia cadena de auditoría.
- Qué puede hacer el Guardian
- Con capacidad de decisión: deny si la intent_derivation concediera permisos que el intent del agente superior no cubre.
- Riesgos típicos
- ASI03ASI08ASI10
steps/subagentStopSolo auditoríaFin de subagente
- Cuándo
- Cuando el subagente finaliza; se registra en la cadena del agente superior con final_chain_hash, sin fusionar las cadenas.
- Qué puede hacer el Guardian
- Solo auditoría, sin decisión.
- Riesgos típicos
- ASI08
steps/skillRegisterRegistro de skill
- Cuándo
- Cuando un skill se incorpora al conjunto disponible, antes de que pueda cargarse: una puerta de control estática con digest y declared_capabilities.
- Qué puede hacer el Guardian
- allow o deny; un skill rechazado no debe poder cargarse. El Guardian puede rechazar declaraciones de capabilities demasiado amplias.
- Riesgos típicos
- ASI04
steps/skillLoadCarga de skill
- Cuándo
- Cuando un skill registrado se activa en la sesión, antes de que se ejecuten sus acciones.
- Qué puede hacer el Guardian
- allow o deny. El Guardian debería rechazarlo si no existe un skillRegister aprobado para el skill_id y el digest, si el digest no coincide o si el load_path muestra que un skill carga otro fuera de sus composed_skills declarados; no debería fiarse de la indicación digest_verified.
- Riesgos típicos
- ASI04ASI05
steps/skillUnloadSolo auditoríaDescarga de skill
- Cuándo
- Cuando un skill abandona el conjunto activo (fin de sesión, de forma explícita, por sustitución o por error); como alternativa, los despliegues pueden reflejarlo mediante agbom/changed.
- Qué puede hacer el Guardian
- Solo auditoría; mantiene actualizado el inventario activo.
- Riesgos típicos
- ASI04
system/pingSistemaSonda de disponibilidad (liveness)
- Cuándo
- Para comprobar si el Guardian está accesible; sin obligación de firma y fuera de la cadena de auditoría.
- Qué puede hacer el Guardian
- Siempre responde con allow. Un ping correcto no demuestra que la aplicación de las políticas funcione: supervise directamente los decision failures en la ruta de los hooks.
- Riesgos típicos
- ASI08
Recuento según la especificación v0.1.0: 19 hooks nativos steps/*; con agbom/snapshot, agbom/changed y system/ping, 22 métodos con esquema de payload propio, además de handshake/hello y el namespace MCP protocols/MCP/*. Las dispositions permitidas en cada hook las fija la especificación en la prosa, no en el esquema. ACS-Core exige al menos seis hooks; lo que no figura en methods_evaluated se considera ALLOW-by-default. El punto junto al hook señala una variante estricta *.acs-provenance. La asignación de riesgos típicos a cada hook es una valoración de VamiSec.
Valoración de VamiSec
Matriz de riesgos: OWASP Agentic Top 10 × componentes de ACS
Qué componentes del Agent Control Standard controlan directamente, apoyan o no cubren los riesgos del OWASP Top 10 for Agentic Applications 2026, con la justificación y los límites de cada fila.
control directode apoyosin cobertura
| OWASP Agentic Top 10 | ||||||
|---|---|---|---|---|---|---|
Los hooks de ingesta permiten enmascarar antes de que contenido ajeno llegue al contexto; en toolCallRequest pueden comprobarse las acciones frente al intent fijado de antemano, y la provenance hace visible para las políticas la procedencia no fiable. Límite: ACS no detecta por sí mismo una prompt injection; el efecto depende por completo de las políticas y de una clasificación opcional en el Guardian. steps/userMessagesteps/knowledgeRetrievalsteps/toolCallResultsteps/toolCallRequest | ||||||
toolCallRequest es el punto central de aplicación, con las cinco dispositions, y ask cubre acciones individuales con consecuencias. Los frameworks deben canalizar a través de este hook toda acción con efecto externo. Límite: las acciones que eluden el hook son invisibles para la política; los métodos fuera de methods_evaluated se consideran ALLOW-by-default. steps/toolCallRequeststeps/toolCallResultprotocols/MCP/tools/call | ||||||
sessionStart vincula la identidad y el modo de política, subagentStart puede rechazar una escalada de privilegios en subagentes y los aprobadores deben estar autenticados. Límite: ACS no prescribe ningún mecanismo de autenticación ni emite identidades; el modelo de identidad aún no está desarrollado de forma normativa en v0.1. steps/sessionStartsteps/subagentStartsteps/toolCallRequest | ||||||
La AgBOM inventaría por sesión modelos, servidores MCP, herramientas, skills y otros componentes; el Guardian puede detener mediante deny componentes vetados o una sustitución en tiempo de ejecución, y los skills quedan vinculados a su registro mediante el digest. Límite: la AgBOM es una autodeclaración del Observed Agent y solo acs-inspect-dynamic ve los cambios en tiempo de ejecución; el escaneo de marketplaces y el cotejo de vulnerabilidades no forman parte de ACS. agbom/snapshotagbom/changedsteps/skillRegistersteps/skillLoad | ||||||
La ejecución de procesos y de shell debe pasar por toolCallRequest y allí puede controlarse mediante deny o ask; skillLoad vincula el contenido ejecutable de los skills a digests verificados. Límite: el sandboxing y el aislamiento no forman parte de ACS, y el código que ya se ejecuta en el host puede eludir los controles del agente. steps/toolCallRequeststeps/skillLoad | ||||||
memoryStore y memoryContextRetrieval controlan las rutas de escritura y lectura de la memoria; preCompact y postCompact vinculan la procedencia al resumen durante la compactación (unión del linaje de todas las entradas condensadas). El linaje de provenance es clave para ello. Límite: sin acs-provenance falta la información de procedencia, y ACS no detecta por sí mismo las entradas envenenadas ya existentes. steps/memoryStoresteps/memoryContextRetrievalsteps/knowledgeRetrievalsteps/preCompactsteps/postCompact | ||||||
agentTrigger con trigger_type a2a_inbound, los hooks de subagente y el tipo de AgBOM a2a_peer hacen visibles las relaciones entre agentes y permiten controlarlas de forma limitada. Límite: el wrapping de A2A (protocols/A2A/*) solo está reservado en v0.1 y no está previsto hasta v0.2, al igual que la federación de la AgBOM entre peers. steps/agentTriggersteps/subagentStartagbom/snapshot | ||||||
La cadena de auditoría por sesión y subagente (final_chain_hash) y la correlación de trazas ayudan a reconstruir una propagación; deny en los hooks de herramientas la detiene paso a paso, y las decisiones defer en cascada deben estar limitadas por sesión. Límite: v0.1 no tiene kill switch ni interrupción, y el valor por defecto fail-open puede contribuir por sí mismo a la cascada si falla el Guardian. steps/subagentStopsteps/sessionEndsteps/toolCallRequest | ||||||
agentResponse permite deny o modify antes de la entrega; ask proporciona a los aprobadores la pregunta, el contexto y la justificación para que no confirmen a ciegas. Límite: muchas aprobaciones generan fatiga de aprobaciones; contra ello solo ayuda un diseño de políticas que limite ask a las acciones realmente con consecuencias. steps/agentResponsesteps/toolCallRequest | ||||||
deny en cada hook con capacidad de decisión detiene paso a paso a un agente anómalo, sessionStart puede rechazar Agent IDs conocidos y trace aporta la base para la detección de anomalías en el SOC. Límite: v0.1 no dispone de un kill switch dedicado, y ACS no detecta por sí mismo un comportamiento anómalo: de eso se encargan las políticas y la monitorización. steps/sessionStartsteps/turnStartsteps/toolCallRequest | ||||||
Valoración de VamiSec basada en ACS v0.1.0, no una asignación oficial de OWASP. ACS no aparece en el OWASP Agentic Top 10 (diciembre de 2025), y ni OWASP ni el proyecto ACS han mapeado ACS a los riesgos ASI01 a ASI10; el efecto de cada celda depende de sus políticas y de los perfiles negociados.
Interactivo
Navegador de perfiles: ¿qué componentes de ACS encajan con su agente?
Hasta cinco preguntas sobre herramientas, regulación, fuentes de datos, dinámica y SOC. El resultado indica los perfiles de ACS y los primeros pasos que recomendamos para su situación: una valoración de VamiSec, no una declaración de conformidad.
Su recorrido
- 1?
1: ¿Su agente llama a herramientas o desencadena acciones con efectos externos: archivos, shell, API, correos electrónicos, tickets, pagos?
1
¿Su agente llama a herramientas o desencadena acciones con efectos externos: archivos, shell, API, correos electrónicos, tickets, pagos?
ACS exige que steps/toolCallRequest se dispare para cada acción que salga del contexto de razonamiento. Sin acciones de este tipo, los puntos de control son sobre todo las entradas y las salidas.
Asistente sin herramientas: ACS-Core como base, con foco en entradas y salidas
Sin llamadas a herramientas, el alcance de ACS es limitado: no hay ninguna acción que un Guardian tenga que detener antes de su ejecución. Siguen siendo relevantes los hooks para las entradas del usuario y las respuestas. Aun así, diseñe la arquitectura de modo que un Guardian pueda acoplarse en cuanto se añadan herramientas (valoración de VamiSec).
- Recoger agentes, modelos y fuentes de datos en un registro, como paso previo a una AgBOM.
- Usar steps/userMessage y steps/agentResponse para enmascarar con modify, por ejemplo, datos personales o secretos.
- Comprobar la obligación de transparencia del art. 50 del AI Act (aplicable desde el 2 de agosto de 2026) si el asistente interactúa con personas.
- Volver a recorrer el navegador ante cada integración de herramientas prevista.
acs-coresteps/userMessagesteps/agentResponsemodify
Agente con herramientas: ACS-Core con políticas en steps/toolCallRequest
Para agentes con efectos externos, steps/toolCallRequest es el punto de control central. Empiece con ACS-Core y una política determinista que bloquee, reescriba o someta a aprobación de forma selectiva las capabilities de alto impacto. Compruebe en el handshake qué métodos evalúa realmente el Guardian: todo lo demás se ejecuta sin evaluación.
- Clasificar las capabilities (p. ej., filesystem.delete, network.egress, process.execute) y definir allow, deny, modify o ask para cada clase.
- Para sesiones con capabilities de alto impacto, establecer on_decision_failure en deny y la startup posture en refuse; la posture se aplica por sesión, no por acción.
- Contrastar methods_evaluated del ServerHello con la lista de métodos implementados.
- Usar ask solo con un aprobador autenticado y timeout_disposition deny.
- Versionar las políticas y ejecutarlas contra casos de prueba antes de cada despliegue.
acs-coresteps/toolCallRequeston_decision_failureOPA/Rego
Contenidos no fiables y memoria: hacer obligatoria la provenance
En cuanto contenidos web, correos electrónicos o resultados de RAG entran en el contexto, no basta con evaluar llamadas a herramientas aisladas. Con acs-provenance, cada campo con datos lleva su origen; el Guardian puede bloquear acciones cuyos argumentos procedan de fuentes no fiables. ACS no impide la prompt injection: crea el punto de control en el que las políticas actúan contra sus consecuencias. Con subagentes o skills se añade acs-inspect-dynamic; con un SOC, acs-trace.
- Implementar provenance_producer: deterministic en el framework y activar policy_requires_provenance en el Guardian.
- Evaluar steps/toolCallResult y steps/knowledgeRetrieval a la entrada y steps/memoryStore antes de escribir en la memoria; steps/preCompact para que no se difumine el origen.
- Regla de sesión inspirada en la Agents Rule of Two de Meta: si una sesión ha procesado contenidos no fiables y tiene acceso a datos sensibles, las acciones con efectos externos solo se ejecutan mediante ask (interpretación de VamiSec).
- Elegir el paradigma de políticas: FIDES, CaMeL y AARM requieren provenance; IBAC puro, no.
- Comprobar la eficacia con red teaming adaptativo en lugar de con prompts de prueba estáticos.
acs-provenancesteps/memoryStorederived_fromFIDES · CaMeL · AARM
Multiagente, skills y componentes dinámicos: mantener el inventario al día de forma continua
Cuando surgen subagentes, se cargan skills a posteriori o se integran servidores MCP en tiempo de ejecución, el Guardian necesita una imagen actualizada de lo que el agente es en cada momento. acs-inspect aporta el snapshot de la AgBOM por sesión; solo acs-inspect-dynamic hace visibles los cambios durante la sesión. v0.1 todavía no aplica wrapping a la comunicación de agente a agente mediante A2A.
- Activar agbom/snapshot y agbom/changed; detener con deny los hot-swaps y las versiones no verificadas.
- Usar steps/skillRegister como punto de control estático y steps/skillLoad con vinculación a skill_id y digest.
- Evaluar steps/subagentStart: el Guardian puede rechazar spawns cuyas capabilities derivadas no estén autorizadas por el intent del agente padre.
- Mantener listas de aprobación para modelos, servidores MCP y skills, utilizables a la vez como registro de proveedores.
- Registrar por ahora los peers A2A mediante steps/agentTrigger (a2a_inbound) y la AgBOM; el wrapping de A2A llegará, como pronto, con v0.2.
acs-inspectacs-inspect-dynamicsteps/skillLoadAgBOM
Con SOC: llevar las trazas al SIEM y supervisar al propio Guardian
Con acs-trace, los hooks y las decisiones se convierten en spans de OpenTelemetry y eventos OCSF; las decisiones distintas de allow, en Detection Finding con severidad. Construya parsers y casos de uso a partir de los mapeos JSON y pruébelos con datos reales, porque algunos nombres de clases y de campos difieren de OCSF. Trace es autodeclarativo y best-effort, así que por sí solo no constituye una prueba.
- Caso de uso «bypass del Guardian»: generar una alerta por cada paso en fail-open y por cada sesión iniciada sin protección.
- Medir directamente la tasa de fallos de decisión en la ruta del hook: un system/ping correcto no demuestra que la aplicación de las decisiones funcione.
- Analizar las acumulaciones de deny por agente, política y rule_id como señal de anomalía.
- Separar en OCSF las identidades de los agentes de las de los usuarios humanos mediante actor.user.type «AI Agent».
- Aplicar el enmascaramiento ya al emitir: los spans pueden contener prompts y argumentos de herramientas.
acs-traceOCSF 2004OpenTelemetrySIEM
Uso regulado: combinar perfiles que aporten evidencias y operar en fail-closed
Quien argumente con el AI Act, DORA o NIS2 necesita más que ACS-Core: Core no incluye ni Trace ni la vinculación de la cadena de auditoría con el contenido de las solicitudes. ACS ayuda a aportar evidencias, pero no fundamenta ninguna presunción de conformidad. Según la arquitectura, se añaden acs-provenance y acs-inspect-dynamic. La correspondencia con normas jurídicas es una interpretación de VamiSec y no sustituye un análisis jurídico.
- Exigir acs-trace y acs-audit (request_hash); para el no repudio, además acs-crypto con ML-DSA-65.
- Configurar on_decision_failure: deny y la startup posture refuse, y demostrarlo con pruebas.
- Para el art. 14 del AI Act: ask en steps/toolCallRequest solo con approver.type human y timeout_disposition deny; v0.1 no contempla un botón de parada, solo deny paso a paso.
- Regular la conservación en el SIEM o el archivo: ACS no fija plazos; los arts. 19 y 26 del AI Act exigen para los logs de alto riesgo al menos seis meses, sin perjuicio de otras normas aplicables.
- En el sector financiero, argumentar con DORA y el Reglamento Delegado (UE) 2024/1774, art. 12.
acs-traceacs-auditacs-cryptoArt. 14 del AI ActDORA
- ¿Su agente llama a herramientas o desencadena acciones con efectos externos: archivos, shell, API, correos electrónicos, tickets, pagos?
- ¿Utiliza el agente en un marco regulado con obligaciones de evidencia, por ejemplo como sistema de alto riesgo según el Reglamento de IA de la UE (AI Act), en el sector financiero bajo DORA o como entidad sujeta a NIS2?
- ¿Procesa el agente contenidos no fiables —páginas web, correos electrónicos, tickets, resultados de RAG— o escribe en una memoria a largo plazo?
- ¿Inicia el agente subagentes, carga skills o integra servidores MCP y modelos en tiempo de ejecución?
- ¿Opera un SOC o un SIEM que deba analizar eventos de agentes y generar alertas?
Análisis en profundidad · 14 capítulos
El Agent Control Standard en detalle: del problema de control a la operación
Catorce capítulos para CISOs, arquitectos de seguridad y responsables de plataformas de IA: qué exige normativamente la especificación v0.1.0, dónde termina hoy y qué decisiones hay que tomar antes de una implantación. Las correspondencias con incidentes, riesgos y regulación están marcadas como valoración de VamiSec.
Por qué los agentes de IA necesitan control en tiempo de ejecución
Un agente de IA no se limita a responder preguntas: desencadena acciones en sistemas de archivos, bases de datos, buzones de correo y cuentas en la nube. Con ello, la cuestión de seguridad se desplaza de la salida del modelo a quién revisa una acción concreta antes de que se ejecute.
Del generador de respuestas al actor
Las aplicaciones LLM clásicas generan texto que una persona lee antes de que ocurra nada. Los agentes de IA, en cambio, planifican de forma autónoma, invocan herramientas, escriben en una memoria a largo plazo y lanzan subagentes. Cada uno de estos pasos puede modificar datos o sacarlos al exterior. Por eso, la pregunta de control es: «¿Puede producirse ahora exactamente esta acción, con exactamente estos argumentos, en esta sesión?». Solo puede responderse en tiempo de ejecución, entre la decisión del modelo y su ejecución por parte del framework.
Los prompts de sistema no son controles
Muchos despliegues confían en instrucciones del prompt de sistema como «no borrar datos de producción». Esas frases son peticiones a un sistema probabilístico, no reglas que se hagan cumplir. La página del proyecto ACS arranca precisamente así su argumentación: los prompts de sistema no son controles, los mejores modelos no cubren los casos límite ni las entradas adversariales y los guardrails propietarios crean dependencia del proveedor.
Fabricantes e investigadores lo confirman. OpenAI escribió el 22 de diciembre de 2025 que la inyección de prompts (prompt injection) es «unlikely to ever be fully 'solved'». En el estudio «The Attacker Moves Second» (arXiv, 10 de octubre de 2025), ataques adaptativos superaron doce defensas recientes, en la mayoría de los casos con tasas de éxito superiores al 90 %, aunque, en su mayoría, habían comunicado inicialmente valores cercanos a cero. La robustez del modelo reduce el riesgo, pero no lo elimina. Hace falta una instancia de control independiente, fuera del modelo.
Lethal trifecta y Agents Rule of Two
Simon Willison describió el 16 de junio de 2025 la «lethal trifecta»: un agente que tiene acceso a datos privados, está expuesto a contenido no fiable y puede comunicarse con el exterior puede ser inducido, mediante prompt injection, a exfiltrar datos. Meta lo amplió el 31 de octubre de 2025 con la «Agents Rule of Two»: dentro de una sesión, un agente debe combinar como máximo dos de tres propiedades: procesar entradas no fiables; acceder a sistemas sensibles o datos privados; cambiar el estado o comunicarse con el exterior. Si necesita las tres, se requiere como mínimo supervisión, por ejemplo mediante aprobación humana. Meta subraya que la regla complementa el principio de mínimo privilegio y no lo sustituye.
Valoración de VamiSec: ambos modelos describen propiedades de una sesión, no de un modelo. Solo pueden hacerse cumplir si una instancia ve cada acción y el historial previo de la sesión. Ese punto de control es el que estandariza el OWASP Agent Control Standard (ACS). Para reconocer entradas no fiables se necesita el perfil opcional acs-provenance; ACS-Core por sí solo no aporta datos de procedencia.
Incidentes documentados y qué habría limitado el control en tiempo de ejecución
| Incidente (fuente, fecha) | Qué ocurrió | Podría haberlo limitado (valoración de VamiSec) |
|---|---|---|
| EchoLeak, CVE-2025-32711, Microsoft 365 Copilot (NVD 11 de junio de 2025; CVSS 3.1: 9.3 Microsoft, 7.5 NVD) | Zero-click: un correo electrónico manipulado llevó a Copilot a filtrar datos internos a través de la respuesta renderizada; se corrigió antes de su divulgación. | Revisión de steps/agentResponse con modify (eliminar URL externas de imágenes y enlaces) o deny, siempre que el host dispare el hook y aporte provenance. |
| El agente de Replit borra una base de datos de producción (SaaStr, julio de 2025; The Register, 22 de julio de 2025) | El agente ignoró una congelación de código (code freeze) ordenada, borró la base de datos de producción y generó mensajes de estado engañosos. | deny o ask sobre capabilities destructivas de base de datos en steps/toolCallRequest; cadena de auditoría para la reconstrucción. En primer lugar: separación entre desarrollo y producción, copias de seguridad. |
| GitHub MCP «Toxic Agent Flow» (Invariant Labs, 26 de mayo de 2025) | Prompt injection en un issue público; el agente publicó datos de repositorios privados mediante un pull request. Sin fallo en el código del servidor, sin CVE. | Política de sesión «tras una salida de herramienta no fiable, no escribir en otro repositorio» con deny o ask en steps/toolCallRequest; requiere acs-provenance. |
| Amazon Q Developer Extension v1.84.0, CVE-2025-8217 (AWS-2025-015, 23 de julio de 2025; CVSS 4.0: 5.1) | Prompt de borrado inyectado en la versión oficial; la ejecución falló por un error de sintaxis y los recursos de los clientes no se vieron afectados. | El prompt procedía del propio producto y se considera fiable, así que la provenance no ayuda. Serían eficaces deny o ask sobre capabilities de borrado y la fijación de versiones (version pinning) mediante la AgBOM. |
| ClawHavoc: skills maliciosos en ClawHub (The Hacker News, 2 de febrero de 2026; Unit 42, 23 de junio de 2026) | Una primera auditoría encontró 341 skills maliciosos entre 2.857 revisados, algunos de ellos con un dropper codificado en Base64. | Revisión en skillRegister y vinculación al digest en skillLoad; después, deny sobre descarga y ejecución (network.egress más process.execute). |
Todos los incidentes son anteriores a la especificación canónica ACS v0.1.0 (5 de junio de 2026). La columna derecha es una valoración, no una afirmación de que ACS habría evitado el incidente.
Por qué el control debe situarse en tiempo de ejecución
La selección del modelo, el endurecimiento de prompts y el red teaming antes de la puesta en producción siguen siendo necesarios, pero no dicen qué hace un agente en una sesión concreta. El control en tiempo de ejecución los complementa: actúa antes de la acción, evalúa el contexto de toda la sesión y deja una pista de auditoría reconstruible. El OWASP Top 10 for Agentic Applications 2026 recomienda para ASI02 (Tool Misuse and Exploitation) un middleware previo de aplicación de políticas, un «Intent Gate» que revisa la intención y los argumentos antes de la ejecución. ACS no se menciona ahí, pero aporta (valoración de VamiSec) un contrato de protocolo abierto precisamente para este punto de control. Las políticas siguen siendo responsabilidad suya.
Qué es ACS: partes, tres pilares, ACS-Core y siete perfiles
El OWASP Agent Control Standard (ACS) es una especificación de protocolo abierta mediante la cual un Guardian Agent independiente revisa lo que un agente de IA quiere hacer a continuación. El Guardian permite, bloquea o modifica la acción, la somete a aprobación o aplaza su decisión, antes de que se produzca.
Con más precisión: el Agent Control Standard (ACS) es una especificación del OWASP GenAI Security Project que define en qué puntos de control (hooks) un agente de IA somete sus pasos a una instancia de políticas externa y cómo responde esta con una decisión (disposition). El formato es JSON-RPC 2.0 con un campo propio acs_version, transportado por HTTP(S) o stdio. La versión actual es la especificación v0.1.0, publicada como release 0.1.2 (tag del 21 de septiembre de 2026). ACS define el contrato entre agente y Guardian, no las políticas: qué está permitido lo sigue decidiendo su organización.
Las partes
| Rol | Función según la especificación | Forma habitual (ejemplo) |
|---|---|---|
| Observed Agent | El sistema supervisado basado en LLM. Implementa el contrato de protocolo, notifica cada paso relevante mediante un hook y aplica la disposition recibida. No decide sobre sus propias acciones. | Agente de programación (coding agent), agente de soporte, framework de agentes integrado en un host |
| Guardian Agent | La instancia de políticas. Evalúa cada hook frente a la política del despliegue, devuelve una disposition y debe registrar cada decisión con su justificación, el identificador del modelo evaluador y, si está disponible, el nivel de confianza. | Motor de políticas (p. ej., OPA/Rego), opcionalmente complementado con una capa LLM |
| Aprobador | Tercera parte a la que el Guardian recurre en caso de ask: persona, agente o servicio. El Guardian debe verificar su identidad frente a la política. | Responsable de seguridad, servicio de aprobación, flujo de tickets |
| Principal | La parte autenticada que inicia una sesión o actúa en ella. | Empleados, cuenta de servicio |
La especificación exige no mezclar tres identidades: la del Observed Agent, la del Guardian y la del autor de las políticas.
Un principio de diseño sostiene la arquitectura: el modelo de lenguaje no debe saber nada de los hooks. Es el framework quien los dispara, y los datos de procedencia (provenance) se establecen fuera de la ruta de salida del modelo. Según nuestra lectura, así un modelo manipulado no debería poder ver ni influir en el punto de control.
Tres pilares: Instrument, Trace, Inspect
Instrument
Interceptar, evaluar y hacer cumplir en tiempo real: 19 hooks nativos steps/*, cinco dispositions, handshake, protección contra repetición (replay) y firmas. Sobre este pilar se construye la base obligatoria ACS-Core.
Trace
Un vocabulario con el que los eventos de los hooks aparecen como spans de OpenTelemetry y eventos OCSF; las decisiones quedan registradas como span event en el paso que las desencadena. ACS no inventa un formato de log nuevo. Trace funciona desacoplado de la aplicación de políticas (enforcement) y es best-effort.
Inspect
La AgBOM (Agent Bill of Materials): un inventario dinámico de modelos, servidores MCP, peers A2A, herramientas, fuentes de conocimiento, almacenes de memoria, capabilities y skills, serializable en CycloneDX 1.6, SPDX 3.0 o SWID.
ACS-Core y siete perfiles
La conformidad tiene una estructura modular. ACS-Core es la base obligatoria; sobre ella se apoyan seis perfiles opcionales que un despliegue declara en el handshake. No hay niveles numerados, solo nombres de perfil que se combinan de forma independiente. La única dependencia: acs-inspect-dynamic amplía acs-inspect.
| Perfil (nombre en el handshake) | Núcleo del requisito | Para qué lo necesita |
|---|---|---|
| acs-core (obligatorio) | Entre otros: handshake, envelope JSON-RPC, al menos seis hooks, las cinco dispositions con sus campos obligatorios, cadena de auditoría encadenada por hash con chain head publicado, protección contra replay, firma HMAC-SHA256 en cada solicitud y cada respuesta, Decision Honoring, system/ping | Canal autenticado; el agente cumple las decisiones del Guardian |
| acs-trace | Para cada paso admitido, eventos de OpenTelemetry y/u OCSF con atributos obligatorios; cada decisión como evento de traza | Integración con el SIEM, observabilidad multifabricante |
| acs-inspect | agbom/snapshot una vez por sesión antes del primer hook con contenido; el Guardian serializa, a petición, en al menos un formato BOM | Políticas que dependen del inventario, como la prohibición de un modelo o de una herramienta |
| acs-inspect-dynamic | Además, agbom/changed con cada cambio en el grafo de componentes | Detectar sustituciones en caliente (hot swaps) de modelos, servidores MCP o skills durante la sesión |
| acs-provenance | Objeto de provenance en cada campo con datos de cada hook (provenance_producer: deterministic) | Políticas de flujo de información según el patrón FIDES, CaMeL o de tipo AARM |
| acs-crypto | Firmas asimétricas o poscuánticas, como mínimo ML-DSA-65 | No repudio frente a terceros |
| acs-audit | request_hash en cada ContextEntry de la cadena de auditoría | La cadena vincula también el contenido de las solicitudes, no solo los metadatos |
En v0.1.0, la conformidad es una autodeclaración en el handshake: sin suite de pruebas, sin registro de implementaciones conformes, sin organismo de evaluación.
Lo que garantiza ACS-Core lo formula la especificación con sobriedad: el canal está autenticado y el Observed Agent cumple las decisiones. No se garantiza que las políticas sean estrictas: un Guardian permisivo es conforme, solo que permisivo. La evidencia de manipulación de la cadena de auditoría, también frente a un Guardian comprometido, solo la aportan acs-crypto y acs-audit, porque la base HMAC es un procedimiento simétrico. Las combinaciones de ejemplo de la especificación van desde una integración mínima en un IDE solo con acs-core hasta un despliegue de alta garantía (high assurance) con los siete perfiles.
El modelo de tiers de la página del proyecto: capas de arquitectura, no niveles
- 1Tier 1 · Platform layer
Los frameworks de agentes proporcionan hooks de middleware estandarizados: aquí nace el punto de control.
- 2Tier 2 · Enforcement layer
Un componente de código abierto lee políticas declarativas y devuelve decisiones a través de esos hooks.
- 3Tier 3 · Enterprise layer
Clasificadores propios y lógica específica del dominio se acoplan tras la misma interfaz.
Esta imagen describe quién aporta cada parte, no lo conforme que es un despliegue. Para las afirmaciones de conformidad solo cuentan los perfiles. Aun así, resulta útil para su planificación de arquitectura: separa la cuestión de qué plataforma proporciona los hooks de la de quién opera y mantiene las políticas.
Origen, gobernanza y licencia: de AOS a proyecto OWASP
Quien adopta pronto un estándar debería saber quién lo dirige, bajo qué licencia está y hasta qué punto es sólida su hoja de ruta. ACS tiene una historia breve, pero agitada.
De la observación al control
El trabajo comenzó el 11 de mayo de 2025 como «Agent Observability Standard» (AOS) en el entorno de GitHub de Zenity y pasó en junio de 2025 a la organización OWASP, donde AOS figuraba como «OWASP other project». En mayo y junio de 2025, la capa de protocolo se denominó temporalmente «ASOP» (Agent Security & Observability Protocol), antes de volver a llamarse AOS. Tras una fase con solo commits aislados a partir de mediados de 2025, el 10 de abril de 2026 llegó el cambio de nombre a Agent Control Standard. El nuevo nombre marca el paso de contenido: de la mera observación a la aplicación de políticas (enforcement). Después, ACS funcionó brevemente como proyecto independiente fuera de OWASP y regresó en septiembre de 2026, esta vez al OWASP GenAI Security Project.
| Fecha | Hito |
|---|---|
| 11 de mayo de 2025 | Primeros commits como «Agent Observability Standard» (AOS) |
| Junio de 2025 | Paso a la organización OWASP |
| 10 de abril de 2026 | Cambio de nombre AOS → ACS (Agent Control Standard) |
| 27 de mayo de 2026 | Nota de prensa de lanzamiento a través de Business Wire; fase como proyecto independiente |
| 5 de junio de 2026 | Integración de la especificación canónica v0.1.0, incluidos los hooks de skills |
| 11 de agosto de 2026 | Release v0.1.1: nueva licencia, especificación sin cambios |
| 1–10 de septiembre de 2026 | Relanzamiento en OWASP: página de recursos (1 de septiembre), sitio web y 44 esquemas JSON (5 de septiembre), gobernanza e implementación de referencia (10 de septiembre) |
| 21 de septiembre de 2026 | Tag v0.1.2, fijado a posteriori sobre un commit del 9 de septiembre de 2026 |
| Marzo de 2027 (objetivo) | Próximo release de la especificación, v0.2.0 |
Fuentes: historial de Git y documentos del proyecto en el repositorio de ACS, así como la página de recursos de OWASP; datos a 3 de octubre de 2026.
Estado: Incubator y public preview
ACS es un proyecto del OWASP GenAI Security Project y está adscrito allí a la Agentic Security Initiative. En sus propios metadatos de OWASP Nest declara el nivel 2, que en el esquema de Nest corresponde a la fase «Incubator»; con ello no queda acreditada una clasificación por parte de un órgano de OWASP. El Project Lead califica públicamente el estado como «public preview» y recomienda expresamente cautela a los implementadores. ACS no es un estándar ISO, IETF ni W3C, ni tampoco una norma armonizada. La fase temprana se aprecia también en lo formal: no hay GitHub Releases, solo tags; la prosa de la especificación y los esquemas cambiaron entre v0.1.1 y v0.1.2 sin que se incrementara la versión de la especificación v0.1.0.
¿Quién dirige el proyecto?
Según GOVERNANCE.md, Michael Bargury y Ory Segal crearon ACS; ambos siguen siendo líderes del proyecto. El Project Lead es Rock Lambros. En aras de la transparencia: Bargury es CTO y cofundador de Zenity, Zenity presenta a Lambros como «Director of AI Standards and Governance» y los primeros commits de AOS proceden mayoritariamente del entorno de Zenity. Los workstreams (Coding Agents, Development (SDK), Identity, Outreach y Spec) están dirigidos por personas de varias organizaciones. La página del proyecto describe ACS como neutral respecto a los fabricantes y gobernado por la comunidad; se trata de una autodescripción. Nuestra valoración: un proyecto OWASP con una fuerte impronta de Zenity en su fundación y su dirección.
Las decisiones pasan por un filtro de aceptación. Solo los issues con la etiqueta status:accepted entran en el backlog; los cambios de comportamiento, de texto normativo o de código requieren un issue aceptado, los cambios en la especificación empiezan como GitHub Discussion y los commits exigen un DCO sign-off. El desarrollo se realiza en la rama integration. Solo cuando el Project Lead promueve los cambios a main se vuelven a publicar el sitio web y las URI de los esquemas. A 3 de octubre de 2026, main no se ha vuelto a promover desde el 10 de septiembre de 2026, por lo que los cambios en integration aún no están publicados.
Licencia: qué puede reutilizar
| Componente | Licencia | Consecuencia práctica |
|---|---|---|
| Código, esquemas JSON, ejemplos de código en la documentación | Apache-2.0 | Uso en productos propietarios sin obligación de divulgación; licencia de patentes expresa |
| Documentación en prosa (textos de la especificación, README) | CC BY-SA 4.0 | Las traducciones y adaptaciones están sujetas a ShareAlike y requieren atribución |
| Releases hasta v0.1.0 inclusive | MIT | La licencia concedida entonces sigue vigente |
| Nombres y logotipos (OWASP, Agent Control Standard) | no se conceden derechos | Una implementación puede describirse como «ACS-conformant», pero no sugerir respaldo por parte del proyecto |
El cambio de licencia a Apache-2.0 y CC BY-SA 4.0 se produjo con el release v0.1.1 el 11 de agosto de 2026. VamiSec redacta todos los contenidos de esta página de forma independiente y no traduce prosa de la especificación.
Hoja de ruta: lo que está documentado
El próximo release de la especificación, v0.2.0, apunta a marzo de 2027; no hay fecha fijada para la v1.0. Para v0.2 están previstos, entre otros, streaming e interrupción, ASK recursivo y quórum, aislamiento multi-tenant, el binding de Cedar, la federación de AgBOM a través de peers A2A y el wrapping de A2A. El objetivo en curso desde el kick-off del 10 de septiembre de 2026: en un plazo de 90 días, una implementación de referencia del Guardian operativa, con un benchmark de interoperabilidad frente al Agent Governance Toolkit de Microsoft, en manos de evaluadores externos. Está por ver si se logra antes de principios de diciembre de 2026. También sigue abierto el PR #21, que pretende redefinir el alcance obligatorio de ACS-Core. Los esbozos de versiones divergentes publicados en blogs no constituyen una hoja de ruta oficial.
Instrument: los 19 hooks en el ciclo de vida de un agente
En cada hook, el Observed Agent se detiene y presenta al Guardian el siguiente paso. ACS v0.1.0 define 19 hooks nativos steps/*; cuáles de ellos se revisan realmente lo negocian ambas partes en cada sesión.
En el protocolo, los hooks llevan el prefijo steps/, por ejemplo steps/toolCallRequest. Además existen métodos que no son hooks nativos steps/*: agbom/snapshot y agbom/changed para el inventario, la sonda de disponibilidad (liveness probe) system/ping, el handshake handshake/hello y el namespace protocols/MCP/* para mensajes MCP encapsulados (wrapped). La página de hooks de la especificación cuenta 19 hooks más dos métodos AgBOM más ping como 22 métodos; el paquete de esquemas comprende en total 44 esquemas JSON. Algunos textos del proyecto (README, docs/acs.md) siguen mencionando 16 hooks de ciclo de vida: es el recuento sin los tres hooks de skills.
| Grupo | Hooks (steps/…) | Cuándo se disparan | Dispositions según la especificación |
|---|---|---|---|
| Sesión | sessionStart, agentTrigger, sessionEnd | Tras el handshake, antes de cualquier otro paso; activación por usuario, programación, evento, A2A o sistema; fin de la sesión, en el que el Guardian sella la cadena | sessionStart: allow/deny · agentTrigger: allow/deny/modify · sessionEnd: solo auditoría |
| Turno | turnStart, turnEnd | Inicio y fin de cada turno del agente; el turn_id acompaña a todos los pasos intermedios | turnStart: admite decisión, normalmente allow · turnEnd: solo auditoría |
| Mensajes | userMessage, agentResponse | Entrada del usuario antes de que llegue al contexto de razonamiento; salida del agente antes de su entrega | allow/deny/modify |
| Conocimiento y memoria | knowledgeRetrieval, memoryContextRetrieval, memoryStore | Consultas de conocimiento y RAG, lectura de la memoria hacia el contexto, escritura en la memoria a largo plazo | allow/deny/modify |
| Herramientas | toolCallRequest, toolCallResult | Tras analizar una llamada a herramienta, antes del dispatch; tras la ejecución, antes de que se incorpore el resultado | toolCallRequest: las cinco · toolCallResult: allow/deny/modify |
| Compactación | preCompact, postCompact | Antes y después de compactar la ventana de contexto | preCompact: deny posible · postCompact: modify, sin deny |
| Subagentes | subagentStart, subagentStop | Inicio de un subagente en el mismo proceso; su finalización | subagentStart: deny posible · subagentStop: solo auditoría |
| Skills | skillRegister, skillLoad, skillUnload | Incorporación al conjunto disponible como puerta de revisión estática; activación en la sesión; eliminación | skillRegister y skillLoad: allow/deny · skillUnload: solo auditoría |
Las restricciones por hook figuran en la prosa de la especificación; el propio esquema de respuesta no limita el campo decision por método.
El mínimo de ACS-Core: seis hooks
ACS-Core exige al menos seis hooks: sessionStart, userMessage o agentTrigger, toolCallRequest, toolCallResult, agentResponse y sessionEnd. Todos los demás debería implementarlos un framework siempre que pueda observar el evento correspondiente; se negocian en el handshake. Para su evaluación de productos, esto significa que la afirmación «compatible con ACS» no revela todavía si las escrituras en memoria, los subagentes o los skills llegan siquiera al Guardian.
La trampa de methods_evaluated
En el handshake, el Observed Agent comunica qué métodos implementa (methods_implemented). El Guardian responde con la lista de métodos que realmente evalúa (methods_evaluated). Si el agente envía un hook que no figura en ella, debe tratarlo como ALLOW-by-default: en el mejor de los casos, el paso se registra, pero no se revisa. La única implementación de referencia, por ejemplo, solo evalúa steps/toolCallRequest y steps/toolCallResult, es decir, dos de 19 hooks.
toolCallRequest: el punto central de aplicación
steps/toolCallRequest es el único hook para el que la especificación prevé expresamente las cinco dispositions; aquí es también donde actúan los paradigmas de control. Hay una regla MUST central: los frameworks deben disparar toolCallRequest para cada acción que abandone el contexto de razonamiento del agente, aunque el framework no la gestione internamente como herramienta (tool). Esto abarca los accesos de lectura y escritura al sistema de archivos, las peticiones de red, los inicios de procesos y los comandos de shell. Lo que eluda este hook no lo ve ninguna política.
Son obligatorios en el payload tool.name y arguments, y cada valor de argumento puede llevar su propia provenance. Opcionalmente se añaden una capability abstracta, como filesystem.delete o network.egress, el raw_command y un intent. Así, las políticas pueden evaluar qué provoca una acción en lugar de qué programa la ejecuta.
Hooks con un efecto protector especial
- memoryStore es el sumidero estándar para la influencia entre sesiones y, según la especificación, el punto de actuación frente al envenenamiento de memoria (cf. ASI06: Memory & Context Poisoning).
- preCompact y postCompact protegen la compactación: el resumen debe llevar origin agent_generated y heredar la procedencia de todas las entradas compactadas, para que el contenido no fiable no quede blanqueado.
- subagentStart permite al Guardian denegar el inicio de un subagente; cada subagente recibe su propio session_id y su propia cadena de auditoría.
- skillRegister y skillLoad vinculan los skills a un digest: solo puede cargarse lo que se haya aprobado previamente con idéntico skill_id e idéntico digest; las cargas que no puedan asignarse deberían rechazarse.
Las cinco dispositions en detalle: allow, deny, modify, ask, defer
A cada hook, el Guardian responde con exactamente una disposition. Los detalles (campos obligatorios, reglas de composición, plazos) deciden si una política es segura o permeable en caso de fallo.
En el protocolo, las dispositions figuran en minúsculas en el campo decision; la prosa de la especificación las escribe en mayúsculas (ALLOW, DENY…). En v0.1, toda respuesta es de tipo final: los estados intermedios (progress) y las interrupciones (interruption) no están previstos hasta v0.2. Son obligatorios en toda respuesta type, acs_version, request_id y decision; el request_id replica el de la solicitud.
| Disposition | Efecto en el Observed Agent | Campos obligatorios (esquema) | Uso típico |
|---|---|---|---|
| allow | La acción se ejecuta tal como se solicitó | ninguno; se recomienda reasoning cuando se esperan pistas de auditoría visibles para el usuario | Acceso de lectura dentro del alcance permitido |
| deny | La acción se bloquea | reasoning | Comando de shell destructivo, egress hacia un destino desconocido |
| modify | La acción se ejecuta con el payload modificado | reasoning, modifications | Limitar una consulta, enmascarar datos personales en el resultado de una herramienta |
| ask | El agente se detiene hasta la aprobación | reasoning, ask_details | Pago, envío masivo a destinatarios externos |
| defer | La decisión se aplaza | reasoning, defer_details | Script desconocido, falta de contexto |
Opcionales en cada decisión: reason_codes, policy_references (policy_id, policy_version, policy_name, rule_id), policy_data, cited_provenance_ids y metadata con evaluator (deterministic, agent o composite).
MODIFY: dos formas que se excluyen mutuamente
El objeto modifications admite dos formas. O bien modified_content sustituye todo el payload, y entonces no se permiten más ediciones. O bien el Guardian envía ediciones estructuradas: redactions (ruta JSON Pointer más texto de sustitución, por defecto «[REDACTED]») y/o parameter_overrides (nombre del argumento más valor nuevo). Ambas pueden aparecer juntas, pero sus destinos deben ser disjuntos: ninguna ruta de enmascaramiento puede afectar al mismo campo que un override, ni tampoco a uno superior o subordinado. La especificación lo justifica así: un orden de aplicación fijo resolvería los conflictos de forma silenciosa y, según el orden, volvería a exponer valores enmascarados o sobrescribiría valores saneados. Si un Guardian infringe estas reglas, el Observed Agent debe tratar la respuesta como un deny.
Un ejemplo: un agente quiere consultar por completo una tabla de clientes. El Guardian responde con modify y una entrada en parameter_overrides que limita la consulta a 500 filas, como en el escenario del simulador «Consulta ilimitada a la base de datos». Los valores de override figuran como valor bruto en el objeto, no dentro de un envoltorio value.
ASK: aprobación con reglas claras
- ask_details exige un approver (el aprobador) con type (human, agent o service) e id, una question y timeout_seconds (como mínimo 1).
- Si vence el plazo, se aplica timeout_disposition; el valor por defecto es deny.
- El Guardian debe verificar la identidad del aprobador frente a la política: la autenticación del aprobador es obligatoria.
- Un solo salto: los aprobadores no pueden devolver a su vez un ask. El quórum y las aprobaciones recursivas se aplazan a v0.2.
- Si un cliente no puede resolver ASK, el Guardian no puede enviar un ask. Recurre a defer con timeout_decision deny o a deny con el reason code approver_unavailable; un allow silencioso queda excluido.
- Mediante intent_extension, una aprobación puede ampliar las capabilities permitidas para this_request o para toda la session. Según la especificación, es la única vía conforme para modificar a posteriori el intent fijado.
Importante desde el punto de vista regulatorio: ASK no equivale automáticamente a supervisión humana. El aprobador puede ser un agente o un servicio, y timeout_disposition puede configurarse en allow. La supervisión humana conforme al artículo 14 del Reglamento de IA de la UE (AI Act) es aplicable a los sistemas de alto riesgo a partir del 2 de diciembre de 2027 (anexo III) o del 2 de agosto de 2028 (anexo I); los agentes de IA no son de alto riesgo per se. Quien utilice ASK como componente para ello necesita, según la valoración de VamiSec, una política con approver.type human y timeout_disposition deny, así como un proceso de aprobación que evite la fatiga de decisión. En ese caso, ASK respalda la generación de evidencias, pero no cumple por sí solo el art. 14: v0.1 no contempla un botón de parada, solo el deny paso a paso.
DEFER: aplazar la decisión, pero con límites
defer_details exige un reason (insufficient_context, conflicting_policies, low_confidence o pending_dependency), un resolution_method (additional_context, human_approval o timeout) y resolution_timeout_ms. Para el vencimiento del plazo, timeout_decision solo admite deny o ask, nunca allow, y por defecto vale deny. La prosa exige el campo, pero el esquema no lo marca como obligatorio; por eso, establézcalo siempre de forma explícita. Los aplazamientos en cascada deben estar limitados por sesión. Preste atención a las unidades: ASK cuenta en segundos (timeout_seconds) y DEFER en milisegundos (resolution_timeout_ms).
Handshake, failure posture y timeouts
Antes de que se dispare el primer hook, el Observed Agent y el Guardian negocian qué se revisa, cuánto se espera y qué ocurre en caso de fallo. Estos pocos campos determinan si su punto de control resiste cuando llega el momento crítico.
Cada sesión empieza con handshake/hello. El ClientHello va en el payload de un request envelope normal y el ServerHello vuelve como result, sin decision. La versión negociada debe coincidir con la del cliente en la versión principal (major); los campos desconocidos deben ignorarse.
| Mensaje | Campos obligatorios | Campos opcionales relevantes para la seguridad |
|---|---|---|
| ClientHello (Observed Agent) | acs_versions_supported, methods_implemented, transports_supported (http, https, stdio), provenance_producer (deterministic o none) | profiles_supported, wrapped_protocols, max_payload_size_bytes |
| ServerHello (Guardian) | negotiated_version, methods_evaluated, selected_transport, timeout_config (default_ms, opcionalmente per_method_ms) | on_decision_failure (proceed o deny, por defecto proceed), signature_algorithms_supported, skew_window_ms (por defecto 300000), policy_requires_provenance, approver_types_supported, profiles_accepted, trace_emission, agbom_serializations_supported |
Rechazos en el handshake: UNSUPPORTED_VERSION (-32001) en caso de conflicto de versiones; PROVENANCE_REQUIRED (-32002) cuando el cliente no aporta provenance, pero la política del Guardian la exige.
Failure posture: fail-open es el valor por defecto
El Observed Agent debe esperar la decisión para cada paso notificado, hasta el timeout negociado, y aplicarla. Un framework que envía hooks pero ignora el veredicto no es conforme. Si no llega ninguna decisión utilizable, la especificación habla de un decision failure: el Guardian guarda silencio, el transporte se interrumpe (conexión rechazada, error de TLS, respuesta defectuosa) o el Guardian devuelve un error en lugar de una decisión. En los tres casos se aplica on_decision_failure, cuyo valor por defecto es proceed: la acción continúa sin revisar. Un despliegue debe configurar expresamente fail-closed (deny).
La especificación reconoce abiertamente el precio: quien pueda perturbar el canal convierte el control en un mero registro. Como contrapeso rige una obligación estricta: todo paso que continúe sin decisión debe registrarse como evento de auditoría. Si, aun así, llega una decisión dentro del plazo, el agente debe cumplirla, con independencia de la posture.
Startup posture: cuando ya falla el handshake
Si el Guardian no está accesible al inicio de la sesión o responde sin ServerHello, se aplica una startup posture configurada fuera del protocolo: proceed (la sesión arranca sin protección) o refuse. También aquí proceed es el valor por defecto, para que una caída del Guardian no bloquee nuevas sesiones. Una sesión iniciada sin protección debe constar en el log de auditoría propio del despliegue. En cambio, un rechazo expreso por parte del Guardian, como SESSION_REFUSED, cuenta como decisión y no como fallo.
| Situación | Mecanismo que se aplica | Valor por defecto |
|---|---|---|
| Guardian no accesible al inicio de la sesión | Startup posture (configurada fuera del protocolo) | proceed: la sesión se ejecuta sin protección, obligación de auditoría |
| El Guardian guarda silencio, error de transporte o respuesta de error durante la sesión | on_decision_failure del ServerHello | proceed: el paso se ejecuta sin revisar, obligación de auditoría |
| Vence el plazo de ASK | timeout_disposition | deny |
| Vence el plazo de DEFER | timeout_decision | deny |
| Objeto modifications no válido | Regla de composición de MODIFY | Se trata como deny |
| Falla system/ping | Señal a nivel de transporte, no un evento de aplicación (enforcement) | sin disposition |
Timeouts: sin valor por defecto en la especificación
La especificación no fija un timeout numérico por defecto. timeout_config.default_ms es obligatorio en el ServerHello, pero su valor corresponde al despliegue; per_method_ms permite valores distintos por método. El esquema del handshake recuerda que cada milisegundo de timeout supone, en el peor de los casos, latencia para el paso, y recomienda ajustar los plazos por método a la tolerancia de latencia en lugar de a un valor global generoso. La implementación de referencia usa 5000 ms: un valor de implementación, no una exigencia. Para v0.2 está previsto un modelo de timeouts basado en la sensibilidad. Para aclarar términos: ACS_ON_DECISION_FAILURE es una variable de entorno del Guardian de referencia que establece el valor de on_decision_failure, no un campo de la especificación.
Un ping no demuestra que se apliquen las decisiones
system/ping es una mera sonda de disponibilidad (liveness probe): el Guardian debe responder siempre allow, el ping no necesita firma y no se escribe en la cadena de auditoría. Así, un Guardian puede responder a los pings y, al mismo tiempo, rechazar todos los hooks firmados. Por eso, la especificación recomienda supervisar directamente los decision failures en la ruta de los hooks.
Arquitectura del Guardian: primero lo determinista, LLM opcional
Un Guardian Agent no es un segundo modelo de lenguaje que vigila al primero por encima del hombro. ACS establece un orden fijo: primero decide código de políticas determinista; un LLM solo puede intervenir después y sin acceso a la política.
Dos capas, orden fijo
La capa determinista evalúa primero cada hook. Decide por sí misma o delega en la capa de agente, según la especificación mediante una configuración de cadena (chain) con los modos «*», on_ask o basado en patrones. Sin embargo, v0.1 no define un formato para esa configuración. La capa de agente recibe las mismas entradas más el resultado intermedio de la capa determinista, pero nunca el código de las políticas. Su respuesta debe volver a pasar por la capa determinista en el camino de vuelta.
- 1Llega un hook
El request envelope, el SessionContext, el intent y, si existe, la provenance se envían al motor de políticas.
- 2Evaluación determinista
Policy as Code (en v0.1, con OPA/Rego como referencia inicial) devuelve allow, deny, modify, ask o defer, o delega.
- 3Capa LLM opcional
Evalúa los casos que no pueden decidirse de forma determinista; trata los campos no fiables como datos y no ve código de políticas.
- 4Comprobación de retorno y respuesta
El resultado vuelve a pasar por la capa determinista; metadata.evaluator indica deterministic, agent o composite.
- 5Registro
Cada decisión se registra con su justificación, el identificador del modelo y, si está disponible, el nivel de confianza.
Motor de políticas: una interfaz, no un producto
ACS define la interfaz con el motor determinista, no el motor en sí. La entrada consta de request envelope, SessionContext, intent y provenance; la salida, de un decision envelope, opcionalmente con una delegación a la capa de agente (delegate_to). Además, ACS establece convenciones, entre ellas: ninguna llamada HTTP externa en las políticas canónicas. Esto favorece el determinismo y la latencia.
| Motor | Estado en ACS | Contexto |
|---|---|---|
| OPA / Rego | Referencia inicial para v0.1 | Proyecto CNCF con estado Graduated (desde el 29 de enero de 2021), Apache-2.0; la implementación de referencia usa el OPA incluido en el Agent Governance Toolkit |
| Cedar | Fast-follow para v0.2 (binding de Cedar) | Lenguaje de políticas de AWS, Apache-2.0, CNCF Sandbox (desde el 8 de octubre de 2025); base de Policy en Amazon Bedrock AgentCore |
| Motor propio | Admisible si respeta la interfaz | Por ejemplo, lógica específica del dominio o clasificadores tras la misma interfaz |
El README y la sección 2 de la especificación mencionan Cedar y Rego a la par; el estado por versión lo fija la sección 12.1.
Obligaciones de la capa LLM
- Los datos no fiables son datos, no instrucciones; los campos correspondientes deben envolverse o entrecomillarse en el prompt.
- Sin acceso al código de políticas de la capa determinista.
- Registrar cada decisión con justificación, identificador del modelo y nivel de confianza (si está disponible); con evaluator agent o composite debe indicarse model_id.
- Los plazos siguen el timeout_config negociado en el handshake.
- Toda la capa es opcional en v0.1.0: los despliegues puramente deterministas son plenamente conformes.
Paradigmas de control sin extensión propia del protocolo
La especificación cita cuatro paradigmas como objetivos para v0.1. Un Guardian los expresa mediante los mismos campos: reason_codes, policy_references, policy_data y cited_provenance_ids. Si un despliegue combina varios paradigmas, una sola decisión puede citarlos todos.
IBAC · autorización basada en la intención
El intent de una sesión se fija antes de que entren datos no fiables; después solo se amplía mediante una aprobación auditada (intent_extension). Una desviación puede terminar en defer; policy_data indica entonces la capability solicitada y la entrada más cercana de Intent.parsed. No necesita acs-provenance.
FIDES · control del flujo de información
Enfoque de investigación con etiquetas de confidencialidad e integridad (arXiv 2505.23643, 2025). Un rechazo cita en cited_provenance_ids el linaje infractor y en policy_data la ruta del argumento afectado.
CaMeL · síntesis de programas
Enfoque de investigación que deriva el flujo de control y de datos de la petición fiable (arXiv 2503.18813, 2025). El Guardian comprueba si los argumentos proceden de un origen no fiable.
Tipo AARM · contexto acumulativo
Evalúa el historial de la sesión hasta ese momento en lugar del paso individual. Un rechazo cita el primer paso no fiable y refleja en policy_data la retrospectiva relevante.
FIDES, CaMeL y las reglas de tipo AARM necesitan datos de procedencia y, por tanto, requieren el perfil acs-provenance; IBAC puro, no. ACS no implementa ninguno de estos procedimientos: aporta los campos con los que un Guardian los aplica y los justifica. Por tanto, ACS no impide la prompt injection: crea el punto de control en el que las políticas actúan contra sus consecuencias.
Operación: latencia y disponibilidad (valoración de VamiSec)
- Latencia: cada revisión está en la ruta crítica del agente. Mantenga la capa determinista en local y sin llamadas externas, reserve la capa LLM para unos pocos casos dudosos y mida evaluation_duration_ms por método.
- Disponibilidad: con fail-closed, el Guardian pasa a ser crítico para la operación. Opérelo cerca del agente y de forma redundante. La propia implementación de referencia documenta el riesgo: escribe los logs de forma síncrona en la ruta de decisión, de modo que un disco lento bloquea todas las decisiones en curso.
- Ciclo de vida de las políticas: versione las políticas y devuelva policy_version en cada decisión; la especificación lo prevé para reconstruir estados históricos de las políticas.
- Delimitación: el Guardian no sustituye al sandbox, al IAM, a la gestión de secretos ni al firewall de egress. Las acciones que eluden toolCallRequest siguen siendo invisibles para él.
La única implementación de referencia ejecuta sin modificaciones el Agent Governance Toolkit de Microsoft tras el protocolo ACS. Es expresamente una prueba de concepto: dos de 19 hooks activos, sin firma HMAC, fail-open por defecto. Demuestra el patrón para dos clientes (Claude Code y OpenCode), pero no está pensada para la operación en producción.
Seguridad del canal: firmas, protección contra replay y cadena de auditoría
Un Guardian Agent solo es tan fiable como el canal a través del cual decide. Por eso ACS-Core exige tres mecanismos: una firma en cada solicitud y cada respuesta, protección frente a mensajes repetidos y una cadena de auditoría encadenada mediante hashes. Este capítulo muestra qué aportan estos mecanismos y dónde se encuentra su límite.
Entre el Observed Agent y el Guardian Agent circulan decisiones que autorizan o bloquean acciones. Quien pueda manipular este canal convierte un deny en un allow o reintroduce una autorización antigua. Por ello, el OWASP Agent Control Standard (ACS) trata la seguridad del canal como parte de la línea base obligatoria ACS-Core y no como un perfil opcional.
Firma base: HMAC-SHA256 con clave de sesión
ACS-Core exige en cada solicitud y cada respuesta una firma sobre el envelope canónico. La línea base que cumple esta obligación es HMAC-SHA256. La clave se deriva por sesión mediante HKDF a partir de material de claves del despliegue (un secreto precompartido o una vinculación de canal, como un TLS exporter) junto con el session_id. La v0.1 no define ningún intercambio de claves en el protocolo. Se firma la canonicalización RFC 8785 (JCS) del envelope sin el campo signature; el receptor recalcula esta forma y rechaza cualquier firma que no coincida. TLS por sí solo no basta, de forma expresa, porque no vincula cada mensaje individual para la auditoría. Solo queda exento de la obligación de firma el método de liveness system/ping.
Hay dos detalles relevantes para la arquitectura. En el esquema JSON, signature es opcional, pero en ACS-Core es normativamente obligatoria: una mera validación contra el esquema no detecta, por tanto, la ausencia de firmas. Además, la especificación no fija para HKDF la sal, la cadena info, la función hash ni la longitud de la clave, por lo que dos implementaciones pueden derivar claves distintas. Según nuestra valoración, estos parámetros deben recogerse en el acuerdo de interfaz entre la operación de la plataforma y la del Guardian.
Protección contra replay
Cada solicitud lleva un request_id (UUID), un timestamp y, opcionalmente, un nonce. El Guardian debe rechazar las solicitudes cuya marca de tiempo quede fuera de la ventana negociada skew_window_ms (valor por defecto recomendado: 300 000 ms, es decir, cinco minutos) y rechazar los valores de request_id duplicados dentro de una sesión; los nonces duplicados debería rechazarlos. De ello se deriva un requisito operativo que se pasa por alto con facilidad: relojes sincronizados en ambos extremos.
| Código | Nombre | Desencadenante | Reacción del Observed Agent según la especificación |
|---|---|---|---|
| -32000 | SESSION_REFUSED | La política rechaza la sesión y no encaja ningún código más específico (p. ej., agent_id no admisible) | No reintentar sin un cambio de política o de configuración |
| -32001 | UNSUPPORTED_VERSION | No hay ninguna acs_version común en el handshake | Repetir el handshake con una versión compatible |
| -32002 | PROVENANCE_REQUIRED | La política exige provenance y el cliente declara provenance_producer: none | Reconectarse como productor deterministic o utilizar un Guardian sin obligación de provenance |
| -32003 | CAPABILITY_NOT_NEGOTIATED | Se utiliza un método o perfil que el handshake no ha negociado | Volver a negociar el método o el perfil |
| -32004 | SIGNATURE_INVALID | La firma obligatoria falta, es defectuosa o no se puede verificar | Volver a firmar y, en su caso, resolver de nuevo el key_id |
| -32005 | REPLAY_DETECTED | request_id o nonce duplicado en la sesión | Generar un nuevo request_id y un nuevo nonce |
| -32006 | TIMESTAMP_OUT_OF_WINDOW | Marca de tiempo fuera de skew_window_ms | Corregir la deriva del reloj |
| -32007 | CHAIN_MISMATCH | El chain_hash del cliente difiere de la cabeza de la cadena del Guardian | Recargar el estado de la sesión; una discrepancia persistente es un evento de integridad |
Resumen propio del registro de errores de ACS (especificación v0.1.0, §17.1). system/ping no debe devolver ningún error específico de ACS.
Cadena de auditoría: cadena de hashes con cabeza publicada
El Guardian mantiene por sesión un SessionContext, una cadena append-only de ContextEntries. Cada entrada recibe un entry_hash: SHA-256 sobre la entrada canonicalizada con JCS sin los campos de hash, encadenado con el hash de la entrada anterior; la primera entrada tiene previous_hash null. En la v0.1 no se admiten otras canonicalizaciones. Lo decisivo es la publicación: para cada paso con contenido (content-bearing step), el Guardian debe incluir el chain_hash actual en su respuesta, cubierto por la firma de la respuesta. La especificación expone abiertamente el motivo: si el Guardian mantuviera privada la cabeza de la cadena, podría, por ejemplo, eliminar un deny, recalcular la cadena a partir de ese punto y presentar más tarde un historial depurado. Quien registre el tráfico detecta una cadena reescrita a posteriori.
Qué acredita la cadena y qué no
- Los campos obligatorios de un ContextEntry son solo entry_id, step_id, step_type y entry_hash. El request_hash sobre el contenido de la solicitud solo se recomienda en ACS-Core (SHOULD) y únicamente es obligatorio en el perfil acs-audit. Sin él, la cadena acredita que un paso tuvo lugar, pero no qué se solicitó.
- El esquema de ContextEntry no contempla ningún campo para la disposition, la justificación ni el aprobador. ACS registra normativamente las decisiones como eventos de Trace (perfil acs-trace, capítulo 9); solo una extensión de intent escribe una entrada propia con la identidad del aprobador (capítulo 11).
- HMAC es simétrico: el Guardian posee la clave y podría volver a firmar una cabeza de cadena reescrita. El canal está protegido frente a la manipulación en la red, no frente a un Guardian comprometido.
- El no repudio frente a terceros solo se obtiene con acs-crypto: como mínimo ML-DSA-65 (MUST), SLH-DSA-128s (SHOULD) y, de forma opcional, esquemas híbridos.
- En la v0.1 no existe una conciliación entre varios Guardians (issue #18, aplazado).
Trace: OpenTelemetry y OCSF en el SOC
Con el pilar Trace, las acciones de los agentes y las decisiones del Guardian llegan al stack de observabilidad y SIEM existente. Para ello, ACS no inventa un formato nuevo, sino que aporta un vocabulario para OpenTelemetry y OCSF. Para el SOC lo que cuenta es qué clases llegan, qué fiabilidad tienen y dónde presenta todavía lagunas el mapeo.
La aportación normativa de Trace es el vocabulario: nombres de span, claves de atributo, clases de eventos y la correspondencia entre dispositions y niveles de severidad. La transmisión se realiza mediante OTLP (gRPC o HTTP) hacia los backends existentes; el espacio de nombres de wire trace/* solo está reservado en v0.1.0. El objetivo declarado es que los eventos de ACS encajen en las pipelines del SIEM sin parsers especiales. Las extensiones de OTel y OCSF figuran en el repositorio con el estado «Working draft». Trace es el perfil opcional acs-trace. Quien lo declare debe emitir, para cada paso admitido, al menos uno de los dos formatos con los atributos obligatorios, registrar cada decisión con su disposition, su evaluador y, si existe, su justificación, y trasladar al evento los hechos de provenance del hook.
OpenTelemetry: un span por hook y las decisiones como span event
La jerarquía de spans es determinista: un span raíz acs.session por sesión, por debajo un acs.turn por turno y un span de step por hook. Las decisiones no son spans propios, sino un span event acs.decision en el span del step; así, el veredicto y la acción controlada comparten el mismo contexto padre. Los atributos obligatorios del evento son acs.decision y acs.evaluator (deterministic, agent o composite). Para las llamadas a herramientas, ACS utiliza los nombres de span gen_ai.tool.call y gen_ai.tool.result. Atención: en las convenciones GenAI de OpenTelemetry (en estado «Development» a octubre de 2026), gen_ai.tool.call es solo un prefijo de atributo y el nombre de span recomendado es execute_tool {gen_ai.tool.name}. Por tanto, los dashboards y las consultas alineados con estas convenciones no encajan con los spans de herramientas de ACS sin adaptarlos.
| Evento de ACS | Clase OCSF (UID) | Observación |
|---|---|---|
| sessionStart, sessionEnd, subagentStart, subagentStop | 3002 Authentication | Representado como Logon o Logoff, respectivamente |
| userMessage, agentResponse, agentTrigger, turnStart, turnEnd | 6002 Application Lifecycle | ACS denomina la clase «Application Activity»; en OCSF, ese es el nombre de la categoría 6 |
| toolCallRequest, toolCallResult | 1007 Process Activity | Fuente central de las acciones de los agentes |
| knowledgeRetrieval, memoryContextRetrieval, memoryStore, preCompact, postCompact | 6005 Datastore Activity | Compactación con activity_id 99; en OCSF, el genérico «Other» |
| Decisiones deny, modify, ask, defer | 2004 Detection Finding | severity_id: modify 2, ask y defer 3, deny 4; allow normalmente solo informativo (1) |
| agbom/snapshot, agbom/changed | 5001 Device Inventory Info | ACS denomina la clase «Inventory Info» |
Clases según el mapeo de ACS (OCSF 1.5+), nombres de clase según OCSF 1.5.0. Los agentes aparecen como actor.user.type «AI Agent»; los campos específicos de ACS, como reason_codes y las referencias a políticas, se ubican en unmapped.acs.
Casos de uso SIEM para agentes
| Caso de uso | Fuente de datos | Posible reacción |
|---|---|---|
| Bypass del Guardian (fail-open) | Evento de auditoría obligatorio para cada paso sin decisión; inicio de sesión sin protección | Alerta desde el primer evento en agentes de alto riesgo; comprobar la disponibilidad del Guardian |
| Acumulación de deny | Detection Finding 2004 con severity_id 4, reason_codes, policy_id | Revisión de la sesión; indicio de prompt injection o de una configuración errónea |
| Carga de aprobaciones | Findings ask (severity_id 3) por periodo, complementados con los datos del aprobador de ask_details | Ajustar los umbrales y la capacidad de los aprobadores y prevenir la fatiga de aprobación |
| Deriva del inventario | agbom/changed con reason user_action o discovery (solo con acs-inspect-dynamic) | Contraste con la lista de autorización; en su caso, endurecer la política |
| Evento de integridad | CHAIN_MISMATCH o reason_code chain_mismatch | Investigarlo como evento de integridad, no descartarlo como error transitorio |
| Agente o persona | actor.user.type «AI Agent» | Baselines separadas, correlación con identidades humanas |
Interpretación de VamiSec: ACS no define lógica de detección ni playbooks de respuesta. Según el issue #37, todavía falta un formato conforme para el evento de auditoría fail-open; por ello, construya las reglas sobre los mapeos JSON y pruébelas con datos reales.
Límites que debería tener en cuenta
- Best effort: Trace nunca debe bloquear la aplicación de las decisiones. Si el receptor (sink) falla, la decisión llega igualmente al Observed Agent, por lo que la telemetría puede presentar lagunas.
- Autodeclaración: los eventos de Trace se generan en el entorno observado y solo se convierten en evidencia mediante la atestación de una parte externa.
- Laguna de skills: los mapeos cubren 16 de los 19 hooks nativos más los dos métodos agbom. skillRegister, skillLoad y skillUnload no tienen mapeo ni de OTel ni de OCSF.
- Desfase documental: la ubicación de la provenance en OCSF es contradictoria (enrichments en el mapeo normativo, unmapped.acs.provenance en la guía). La página de ejemplos con consultas de Splunk y Elastic sigue utilizando el nombre antiguo ASOP y OCSF 1.0.
- Protección de datos: los spans pueden contener prompts y argumentos de herramientas. La especificación recomienda aplicar el enmascaramiento (redaction) ya en el momento de la emisión; según nuestra valoración, esto debe figurar de forma vinculante en el plan de logging.
Inspect: AgBOM, el inventario del agente en tiempo de ejecución
Los agentes cambian sus capacidades en tiempo de ejecución: un modelo nuevo, un servidor MCP cargado a posteriori, un skill recién registrado. La AgBOM (Agent Bill of Materials) permite consultar este estado por sesión y basar decisiones en él. No es un nuevo formato de SBOM, y tampoco sustituye a ninguno.
Según la especificación, la AgBOM es un inventario dinámico y consultable de los componentes que utiliza un Observed Agent. La justificación es precisa: cualquier política que dependa de lo que es un agente (qué modelo, qué herramientas) resulta inverificable sin inventario. Si una política del Guardian depende del inventario, por ejemplo para prohibir un modelo o una herramienta, el despliegue debe implementar el perfil acs-inspect. La AgBOM canónica es un grafo de componentes almacenado como lista plana con referencias por ID, de modo que los distintos estados puedan compararse mediante diff.
Ocho tipos de componentes
| Tipo | Qué se registra (selección de campos obligatorios) |
|---|---|
| model | Nombre, versión, proveedor, endpoint y ventana de contexto; opcionalmente, una instantánea de la configuración |
| mcp_server | Nombre, versión, endpoint y las herramientas ofrecidas |
| a2a_peer | Endpoint y versión del protocolo |
| tool | Nombre, versión, proveedor y capability abstracta, p. ej., filesystem.delete o network.egress |
| knowledge_source | Nombre y tipo de fuente (vector_db, search_index, knowledge_base, web_search, other) |
| memory_store | Nombre, scope (session, user, tenant, global) y tipo de almacenamiento |
| agent_capability | Nombre y descripción de un grupo de capacidades pasivo |
| skill | Nombre, descripción, así como referencia y digest de integridad del artefacto cargable |
La fuente normativa es el esquema component.json. Algunas páginas de la documentación mencionan seis o siete tipos; los determinantes son ocho.
snapshot y changed: dos métodos de wire
El Observed Agent envía agbom/snapshot una vez por sesión, después de sessionStart y antes del primer hook con contenido (content-bearing); el mensaje contiene la AgBOM completa. agbom/changed notifica mutaciones (componentes añadidos, eliminados o modificados, como diff o como snapshot completo) y puede indicar una causa, por ejemplo component_upgraded, discovery o user_action. Ambos eventos se incorporan a la cadena de auditoría. El Guardian puede rechazar mediante deny una sesión con un componente prohibido o bloquear un hot swap.
Importante para la elección de perfil: quien solo declare acs-inspect entrega exactamente un snapshot por sesión y no hace seguimiento de los cambios. Los cambios en tiempo de ejecución solo se vuelven visibles con acs-inspect-dynamic. Los desencadenantes de snapshot renegotiation y policy_request remiten a mecanismos cuya especificación está prevista para la v0.2; en la v0.1, en la práctica, solo session_start es fiable. Además, cada componente debería llevar una registration_provenance (obligatoria con acs-provenance). Así se puede distinguir si un componente procede de la configuración o se añadió en tiempo de ejecución.
Serializaciones: CycloneDX, SPDX, SWID
En el wire siempre se transmite la forma canónica; el Guardian genera serializaciones bajo demanda para las herramientas de procesamiento posterior. Un despliegue acs-inspect debe ofrecer al menos una de ellas: CycloneDX 1.6, SPDX 3.0 o SWID (ISO/IEC 19770-2). Los tres mapeos tienen el estado «Working draft»; las correspondencias con CycloneDX y SPDX no son en parte válidas según el esquema. El mapeo de CycloneDX utiliza como tipo de componente nombres como ai-model o service, que CycloneDX 1.6 no contempla en esa forma; el mapeo de SPDX emplea clases y relaciones que no existen en SPDX 3.0.1. Por ello, planifique las exportaciones con validación propia. CycloneDX, por su parte, está disponible en la versión 1.7 desde octubre de 2025.
Delimitación: AgBOM, AI-SBOM y SBOM del CRA
AgBOM (ACS)
Referida al tiempo de ejecución y a cada sesión, anclada en la cadena de auditoría y apta para la toma de decisiones. Inventaría lo que el Observed Agent, según su propia declaración, utiliza en esa sesión; con acs-provenance, además, la procedencia de cada registro.
AI-SBOM / ML-BOM
Describe modelos y conjuntos de datos, por ejemplo con CycloneDX ML-BOM o con el perfil AI de SPDX 3.0. El término AI-BOM no aparece en ACS; la comparación es una clasificación nuestra.
SBOM del CRA
Obligatoria a partir del 11 de diciembre de 2027 para los fabricantes de productos con elementos digitales (anexo I, parte II, punto 1, del CRA): legible por máquina y, como mínimo, con las dependencias de primer nivel. La AgBOM puede complementar esta SBOM de tiempo de compilación con componentes de tiempo de ejecución, pero no la sustituye.
Provenance e identidad: procedencia de los datos, límites de la identidad
Que una acción sea admisible depende a menudo de la procedencia de los datos que la desencadenan. Provenance proporciona al Guardian estos hechos de procedencia campo a campo, y Session Intent fija el propósito. La parte de identidad (Identity) de ACS, en cambio, describe hasta ahora sobre todo cuestiones abiertas.
Provenance por campo: hechos en lugar de etiquetas de confianza
Provenance responde a la pregunta de dónde procede un elemento de datos y cómo llegó hasta su ubicación. Un objeto de provenance lleva un provenance_id, un origin con uno de siete valores (user_input, system, tool_output, retrieved, agent_generated, a2a_inbound, external) y, opcionalmente, source_id (por ejemplo, el nombre de la herramienta, una URL o una ruta) y derived_from como lista de predecesores. Estos datos se asocian a los campos portadores de datos; en toolCallRequest, incluso a cada argumento individual. De este modo, una política puede actuar sobre un flujo de datos concreto en lugar de sobre toda la llamada.
- Establecido por el framework: origin, source_id y derived_from los asigna código determinista fuera de la ruta de salida del LLM. Indicar al LLM que genere la provenance no es conforme.
- Linaje transitivo: los datos derivados heredan la procedencia de sus entradas, también a través de resúmenes y de la compactación. Así, un resumen de salidas de herramientas ajenas sigue siendo reconocible como tal.
- Sin campo trust: en la v0.1, un valor trust solo está reservado, no esquematizado. El Guardian deriva la confianza de origin y source_id conforme a su política; el material no fiable nunca se vuelve fiable por el procesamiento del LLM (regla de monotonía).
- Todo o nada: con provenance_producer: deterministic, cada campo portador de datos debe llevar provenance; un relleno parcial no es conforme. Si el cliente declara provenance_producer: none aunque la política exija provenance, el Guardian rechaza la sesión ya en el handshake con PROVENANCE_REQUIRED.
Provenance no forma parte de ACS-Core, sino del perfil acs-provenance. Es un requisito previo para paradigmas de aplicación de políticas como FIDES, CaMeL y AARM, pero no para la mera autorización basada en intent (IBAC). ACS no impide la prompt injection. Crea el punto de control en el que una política puede limitar sus consecuencias, por ejemplo bloqueando un correo electrónico cuyo destinatario y contenido procedan de un resultado de recuperación (retrieval) no fiable. Las etiquetas de sensibilidad o de IFC no forman parte del estándar; corresponden al Guardian o al despliegue.
Session Intent: el propósito fijado
En ACS, Intent no es un formato de wire, sino un concepto de gobernanza: vincula las acciones a un propósito autorizado, y lo hace antes de que los datos no fiables puedan ejercer influencia. Intent.parsed, el conjunto de capabilities autorizado para la sesión, se fija en sessionStart o en el primer agentTrigger. A partir de ese momento, ni el LLM ni las salidas de herramientas ni los datos procedentes de canales no fiables pueden modificarlo; si el intent se fija en sessionStart, debe rechazarse cualquier agentTrigger posterior con un intent divergente.
La única vía conforme para ampliarlo es una intent_extension que un aprobador devuelve a través del flujo ask, con datos obligatorios sobre capabilities y scope. Con scope this_request, la extensión solo se aplica a la solicitud en curso. Con scope session, el Guardian añade las capabilities, escribe un ContextEntry del tipo intent_extension con la identidad del aprobador y mantiene la provenance de la extensión separada de la del intent original. Con scope_mode strict, no debe aceptar ninguna extensión que la política prohíba en modo estricto. Para los CISOs, según nuestra valoración, esta es la palanca contra la escalada progresiva de privilegios: cada ampliación requiere una aprobación autenticada.
Identity: normativamente escueta, mucho aún en desarrollo
Qué es normativo
ACS no prescribe ningún mecanismo de autenticación; el utilizado se declara en el handshake, y los esquemas de confianza como SPIFFE, OIDC o PKI quedan definidos por el despliegue. Son obligatorias la autenticación de los aprobadores y la separación de tres identidades: Observed Agent, Guardian y autor de las políticas.
Qué aún no es vinculante
Los documentos de trabajo del workstream de identidad mencionan cinco retos en tiempo de ejecución; cuatro están en «Pending» y uno en «Partially specified». Formulaciones como «Required by ACS» para DPoP o RAR no son vinculantes: el propio proyecto aclara que ACS no prescribe ningún mecanismo. El modelo de identificadores y la vigencia de los tokens solo son propuestas.
Delimitación frente a AIMS
El borrador del IETF AIMS (draft-klrc-aiagent-auth) aborda la emisión de identidades, la vinculación de credenciales y la autenticación del transporte. ACS se concibe como complementario: aplicación de políticas en tiempo de ejecución en lugar de emisión de identidades.
La firma de ACS-Core autentica de forma simétrica el canal entre el Observed Agent y el Guardian. No es ni una autenticación del principal ni no repudio; no debería mezclar ambas cosas en la arquitectura ni en las evidencias.
MCP, A2A y skills: protocolos y capacidades cargables
Los agentes se comunican con las herramientas a través de MCP y con otros agentes a través de A2A, y cargan skills como componentes ejecutables. ACS v0.1 cubre estas tres superficies con distinto alcance: el wrapping de MCP está especificado, A2A solo está reservado y el ciclo de vida de los skills tiene hooks propios.
Wrapping de MCP: especificado, con una cuestión de obligatoriedad abierta
El espacio de nombres protocols/MCP/* es la vía canónica para transportar mensajes MCP hasta el Guardian, por ejemplo protocols/MCP/tools/call. El mensaje MCP permanece inalterado; ACS superpone el envelope, el contrato de decisión y las reglas de la cadena de auditoría. El flujo tiene dos etapas: el agente presenta la solicitud encapsulada al Guardian, aplica su decisión, reenvía el mensaje al servidor MCP tras un allow, según la descripción del flujo, y somete también la respuesta de este a evaluación antes de procesarla.
Un despliegue puede agrupar las llamadas a herramientas MCP (tools/call) en los hooks genéricos steps/toolCallRequest y steps/toolCallResult si bastan políticas a nivel de herramienta. El wrapping debería utilizarse cuando la política necesita distinciones específicas de MCP: negociación de capabilities en initialize, plantillas de prompts del lado del servidor (prompts/get), accesos a recursos (resources/read) y notificaciones (notifications/*). Con independencia de ello, los frameworks deben disparar toolCallRequest para cada acción que abandone el contexto de razonamiento, también para las operaciones integradas de archivos, red o shell.
MCP 2026-07-28: la prosa de la especificación va por detrás
Desde el 28 de julio de 2026, la revisión vigente de MCP es la 2026-07-28 (a octubre de 2026). Hace que el núcleo del protocolo sea sin estado, suprime el handshake initialize y declara obsoletos, entre otros, Sampling y Roots. El espacio de nombres de ACS protocols/MCP/* es neutral respecto a la versión; la revisión 2025-06-18 solo aparece en la especificación como ejemplo. Sin embargo, la prosa sigue presuponiendo la semántica anterior y menciona expresamente la negociación de initialize como punto que debe controlarse. La especificación deja abierto si esto afecta en la práctica a los wrappers; no disponemos de un análisis sólido al respecto. Según nuestra valoración, las arquitecturas con un uso intensivo de MCP deberían prever los hooks genéricos de herramientas como punto de control principal.
A2A: reservado para la v0.2
En la v0.1, el espacio de nombres protocols/A2A/* solo está reservado; la semántica normativa de wrapping está prevista para la v0.2 (fecha objetivo para la v0.2.0: marzo de 2027). Las páginas de A2A del repositorio proceden de la época AOS de 2025 y no son compatibles con el esquema. Hoy, las relaciones A2A solo se hacen visibles de forma indirecta: a través de agentTrigger con trigger_type a2a_inbound y de los componentes a2a_peer de la AgBOM. En cambio, ACS cubre los subagentes in-process con subagentStart y subagentStop; cada subagente recibe una sesión propia con su propia cadena de auditoría, que el agente padre referencia mediante el final_chain_hash sin fusionar las cadenas.
Ciclo de vida de los skills: register, load, unload
| Hook | Finalidad | Opciones del Guardian |
|---|---|---|
| steps/skillRegister | Puerta de control estática: el Guardian ve la definición completa del skill antes de que se ejecute cualquiera de sus acciones. La aprobación se aplica al par (skill_id, digest). | allow o deny; un skill rechazado no debe llegar a ser cargable. Debería contrastar las capabilities declaradas con las herramientas compuestas y puede rechazar declaraciones demasiado amplias. |
| steps/skillLoad | Puerta de control en tiempo de ejecución para cada activación; el load_path hace visibles las cascadas (el skill A carga B, B carga C). | allow o deny; debería rechazar las cargas sin una aprobación atribuible, con un digest divergente o fuera de los composed_skills declarados. |
| steps/skillUnload | Mantiene actualizado el inventario activo; alternativamente, puede integrarse en agbom/changed. | Solo auditoría; según la especificación, la carga y descarga repetidas son una señal que merece observarse. |
Resumen propio de las descripciones de los hooks en ACS v0.1.0.
El digest cubre el artefacto cargable completo, incluidos los pesos de modelo o los adaptadores empaquetados; en la AgBOM solo se persisten la referencia y el digest, no el contenido. El Guardian no debería fiarse de un digest_verified notificado por el framework, sino compararlo él mismo con su aprobación. La propuesta de diseño (design proposal) sobre el ciclo de vida de los skills del repositorio señala abiertamente el límite: el digest vincula el artefacto registrado, no el código que un skill cargue posteriormente; esa carga posterior se canaliza como network.egress o process.execute a través de los hooks de herramientas habituales. El escaneo de marketplaces antes de la publicación no forma parte de ACS, y para los tres hooks de skills todavía falta un mapeo de Trace (capítulo 9).
Conformidad y madurez: qué aporta la v0.1 y qué no
ACS es un proyecto joven de OWASP en una fase temprana. Para las decisiones de arquitectura y de compras, lo que cuenta es, por tanto, el estado verificable: especificación v0.1.0, release 0.1.2, una implementación de referencia como prueba de concepto y la conformidad como autodeclaración.
0.1.0Versión de la especificación; release 0.1.2, tag del 21 de septiembre de 2026
2 de 19Hooks que la implementación de referencia evalúa en vivo
7Perfiles de conformidad; toda afirmación de conformidad es una autodeclaración
03/2027Fecha objetivo para la v0.2.0; para la v1.0 no hay fecha
ACS es un proyecto del OWASP GenAI Security Project y, según los propios metadatos de OWASP Nest, está clasificado en el nivel 2 (Incubator); el Project Lead califica su estado de «public preview». ACS no es un estándar ISO, IETF ni W3C, ni tampoco una norma armonizada.
Lo que ya aporta la v0.1
Pese a la fase temprana, la v0.1 aporta sustancia: un vocabulario común de 19 hooks y cinco dispositions, 44 esquemas JSON publicados, una failure posture claramente descrita con obligación de auditoría para cada bypass y una especificación que señala abiertamente sus propias lagunas. Según nuestra valoración, esto basta para medir a los proveedores con un criterio abierto y común y para diseñar los propios puntos de control de modo que sigan siendo compatibles con versiones posteriores, pero no para fiarse de etiquetas de conformidad.
La conformidad es una autodeclaración
En el handshake, el Observed Agent declara qué perfiles admite (profiles_supported) y el Guardian, cuáles acepta (profiles_accepted). Existen exactamente siete perfiles: acs-core como obligatorio, además de acs-trace, acs-inspect, acs-inspect-dynamic, acs-provenance, acs-crypto y acs-audit. No existen grados ni niveles. Quién verifica las afirmaciones de conformidad lo responde la propia especificación: en la v0.1.0, nadie. No hay suite de pruebas, ni registro de implementaciones conformes, ni ningún organismo que resuelva las afirmaciones controvertidas (issue #19, abierto, prioridad P1). Además, ACS-Core solo garantiza dos cosas: un canal autenticado y que el Observed Agent acate las decisiones del Guardian. No garantiza políticas estrictas: también un Guardian permisivo es conforme.
Implementación de referencia: el estado real, sin adornos
La única implementación de referencia es expresamente una prueba de concepto. Utiliza el Agent Governance Toolkit (AGT) de Microsoft sin modificaciones como motor de políticas detrás del wire de ACS, con integraciones de host para Claude Code y OpenCode. Declara acs-core solo con reservas («qualified») y ninguno de los seis perfiles opcionales. No existe un benchmark de interoperabilidad con AGT; es el objetivo de la ventana de 90 días abierta con el kick-off del 10 de septiembre de 2026. De ello no puede deducirse un respaldo de ACS por parte de Microsoft. Atención a la coincidencia de nombres: en la documentación de AGT, «ACS» designa la «Agent Control Specification» propia de Microsoft (2 de junio de 2026), el lenguaje de políticas de AGT, y no el estándar de OWASP.
| Requisito de ACS-Core | Estado de la implementación de referencia |
|---|---|
| Handshake handshake/hello | Se responde, pero el ServerHello solo contiene valores constantes; el ClientHello no se lee |
| Al menos seis hooks | 2 de 19 evaluados: steps/toolCallRequest y steps/toolCallResult |
| Las cinco dispositions | allow, deny y modify presentes; ask sin ask_details (no válido según el esquema); defer nunca se genera |
| chain_hash en las respuestas | La cadena se mantiene, pero no se publica en ninguna respuesta |
| Firma base HMAC-SHA256 | No implementada; wire no autenticado, protección solo mediante vinculación a loopback (issue #70) |
| Protección contra replay | No implementada |
| Decision Honoring, on_decision_failure | Implementado en ambos hosts; valor por defecto proceed (fail-open), cada bypass se audita (issues #32, #37) |
| system/ping, protocols/MCP/* | No implementados |
Fuente: información autodeclarada de la implementación de referencia (reference-implementations/agt/README.md), estado de la rama main a 10 de septiembre de 2026. La implementación de referencia no llegó al repositorio hasta después del commit de release etiquetado 0.1.2.
Lagunas abiertas de la especificación con relevancia práctica
- Fail-open por defecto: on_decision_failure y la startup posture están en proceed; fail-closed (deny o refuse, respectivamente) debe configurarlo usted de forma deliberada.
- Sin mecanismo de parada: la v0.1 no incluye ningún kill switch; la interrupción (interruption) y el streaming están previstos para la v0.2. En la v0.1, un agente solo se detiene paso a paso mediante deny.
- Alcance obligatorio en evolución: una propuesta abierta (PR #21) rebajaría modify y system/ping a SHOULD.
- Lagunas de interoperabilidad (análisis propio): los parámetros de HKDF, la firma del handshake y la entrada para request_hash están insuficientemente especificados.
- Desfase documental: algunas páginas siguen mencionando 16 en lugar de 19 hooks o solo tres dispositions. Lo normativo son la especificación y los esquemas.
Implantación en la práctica y relación con la regulación
ACS no es una herramienta de cumplimiento normativo. Sin embargo, aporta componentes técnicos con los que puede respaldar la aportación de evidencias sobre las obligaciones derivadas del Reglamento de IA de la UE (AI Act), NIS2, DORA y el CRA, así como sobre los requisitos de ISO/IEC 42001. Este capítulo asigna los componentes a los requisitos y esboza una puesta en marcha en cinco pasos.
Antes de nada, tres precisiones. Primero, ACS no genera presunción de conformidad; el texto de la especificación no contiene ninguna correspondencia con el AI Act, NIS2, DORA, el CRA o ISO/IEC 42001: todas las correspondencias que figuran a continuación son interpretaciones de VamiSec. Segundo, los agentes de IA no son per se sistemas de alto riesgo. Las obligaciones para sistemas de alto riesgo del capítulo III, secciones 1 a 3, del Reglamento (UE) 2024/1689 se aplican, según el Digital Omnibus (Reglamento (UE) 2026/1744), a partir del 2 de diciembre de 2027 para el anexo III y a partir del 2 de agosto de 2028 para el anexo I; el art. 50 se aplica desde el 2 de agosto de 2026. Tercero, toda argumentación depende de los perfiles: ACS-Core por sí solo no incluye ni Trace ni AgBOM ni request_hash.
| Requisito | Componente de ACS (perfil) | Artefacto de evidencia | Salvedad |
|---|---|---|---|
| AI Act, art. 12: registro automático de eventos | Trace por paso y eventos de decisión, cadena de auditoría (acs-trace, acs-audit) | Datos en el SIEM, cadena de hashes verificable | Trace es una autodeclaración; ACS-Core no incluye Trace |
| AI Act, art. 14, apdo. 4, letra d): invalidar | ask en toolCallRequest con aprobador humano y timeout_disposition deny (acs-trace) | Eventos de decisión con ask_details, entradas intent_extension | Según la especificación, el aprobador también puede ser agent o service: exclúyalo mediante política |
| AI Act, art. 14, apdo. 4, letra e): detener | deny en sessionStart, turnStart, toolCallRequest; on_decision_failure deny, startup posture refuse | Evidencia de configuración fail-closed, acta de un ejercicio de parada | Sin kill switch en la v0.1; fail-open por defecto |
| AI Act, art. 26: supervisión, vigilancia, logs ≥ 6 meses | Aprobadores autenticados, Guardian como monitor en tiempo de ejecución, exportación de Trace | Matriz de roles de aprobadores, informe de monitorización, política de conservación | ACS no regula la conservación; la competencia sigue siendo una cuestión organizativa |
| AI Act, art. 72: vigilancia poscomercialización | Métricas de Trace, AgBOM (mcp_server, a2a_peer), hooks de subagentes | Sección del plan de vigilancia poscomercialización «Datos de ejecución de los agentes» | La plantilla de la Comisión no se espera hasta el 2 de septiembre de 2027 |
| NIS2, art. 21, apdo. 2 / § 30 BSIG | Policy as Code (v0.1: OPA/Rego; binding de Cedar previsto para la v0.2), políticas de capabilities, AgBOM con digest de skills | Código de políticas aprobado, registro de componentes y proveedores por agente | El escaneo de marketplaces no forma parte de ACS |
| DORA, arts. 8–10, RTS (UE) 2024/1774, art. 12 | AgBOM como inventario, Trace según OCSF, cabeza de cadena firmada, eventos de auditoría fail-open, timestamp y skew_window_ms | Registro de activos de TIC ampliado, plan de logging, evidencia de sincronización horaria | HMAC no protege frente a un Guardian comprometido |
| CRA, anexo I: logging, SBOM | Trace como funcionalidad del producto, exportación de la AgBOM (CycloneDX 1.6, SPDX 3.0) | SBOM de compilación más exportación de la AgBOM, documentación del producto | Solo para productos de agentes; el anexo I se aplica a partir del 11 de diciembre de 2027; la AgBOM no sustituye a una SBOM |
| ISO/IEC 42001 A.6.2.6, A.6.2.8, A.7.5, A.10.3 | Trace y cadena de auditoría, acs-provenance, AgBOM | Plan de registro de eventos, evidencias de provenance, lista de proveedores | 42001 no otorga presunción de conformidad con el AI Act |
| NIST AI RMF MANAGE 2.4, MEASURE 2.4, GOVERN 1.6 | deny y ask, Trace, AgBOM | Criterios de desactivación, plan de monitorización, inventario | Marco voluntario |
Interpretación de VamiSec basada en ACS v0.1.0; ni OWASP ni las autoridades han establecido esta correspondencia. Los bancos y las aseguradoras deberían argumentar principalmente a través de DORA, ya que la obligación de vigilancia del art. 26, apdo. 5, del AI Act se considera cumplida a través de la gobernanza financiera. Para las entidades financieras con marco simplificado de gestión del riesgo de TIC (art. 16 de DORA) se aplica el título III de las RTS en lugar del art. 12.
Puesta en marcha en cinco pasos
- 1InventarioRegistrar y clasificar los agentes
Registre los agentes, modelos, herramientas, servidores MCP y skills, y aclare para cada caso de uso su clasificación según el AI Act. Resultado: un registro de agentes con clase de riesgo, responsables y accesos a datos.
- 2ArquitecturaDefinir puntos de control y perfiles
Compruebe qué hooks dispara realmente su plataforma y cuáles confirma el Guardian en el handshake en methods_evaluated: todo lo demás se considera allow-by-default y queda sin protección. Elija los perfiles según sus necesidades de evidencia, por ejemplo acs-core más acs-trace y acs-audit para las obligaciones de registro.
- 3PolíticaFormular las políticas como código
La capa determinista se ejecuta primero (referencia en v0.1: OPA/Rego). Formule reglas para comandos destructivos, egress y pagos, exija para las acciones con consecuencias relevantes ask con aprobador humano y timeout_disposition deny, y referencie las versiones de las políticas en policy_references.
- 4OperaciónDecidir y probar la failure posture
Para los agentes con alto potencial de daño, establezca on_decision_failure deny y la startup posture refuse. Pruebe la caída del Guardian, el replay y los errores de firma, y supervise directamente los fallos de decisión, porque un ping correcto no demuestra que la aplicación de las decisiones funcione correctamente.
- 5EvidenciaConectar Trace y documentar las evidencias
Exporte OCSF u OpenTelemetry al SIEM, implemente los casos de uso del capítulo 9 y fije plazos de conservación. Proteja la cabeza de la cadena de forma externa y verifique las afirmaciones de conformidad de los proveedores mediante pruebas propias.
El whitepaper para CISOs «Agent Control para CISOs» (en alemán), que puede solicitar más abajo en esta página, ofrece una profundización con un programa de 100 días, un modelo de roles, métricas y preguntas de evaluación para plataformas de agentes. VamiSec acompaña la evaluación, la arquitectura, el diseño de políticas y las pruebas como consultora independiente; VamiSec no forma parte del proyecto ACS.
Autoevaluación
ACS Readiness Assessment: ¿en qué punto está el control de sus agentes de IA en tiempo de ejecución?
18 preguntas en seis dimensiones, unos 10 minutos. Obtendrá su nivel de madurez, la preparación por componente de ACS y sus mayores brechas, cada una con un siguiente paso concreto.
0 / 18 preguntas respondidas
Los cuatro niveles
- 0 No existe
- No hay ninguna norma interna ni implementación técnica al respecto.
- 1 Ad hoc
- Algunos equipos lo resuelven por su cuenta, sin directrices ni evidencias.
- 2 Definido
- Regulado de forma vinculante e implantado en los agentes más importantes.
- 3 Aplicado y medido
- Impuesto técnicamente en todos los agentes relevantes y verificado con métricas.
Su resultado
Aún no ha respondido a todas las preguntas: las preguntas pendientes cuentan en la evaluación como «No existe».
Preparación por componente de ACS
ACS-Corebrecha0 %
Base obligatoria: hooks mínimos, las cinco dispositions, decision honoring con failure posture, cadena de auditoría y firma HMAC.
ACS-Tracebrecha0 %
Pasos y decisiones como eventos de OpenTelemetry u OCSF para el SIEM y el análisis forense.
ACS-Inspectbrecha0 %
AgBOM como inventario en tiempo de ejecución por sesión; los cambios en tiempo de ejecución, además, con acs-inspect-dynamic.
ACS-Provenancebrecha0 %
Procedencia y linaje en cada campo que transporta datos, como base para políticas basadas en la procedencia.
Supervisión y AI Actbrecha0 %
Aprobaciones y registros que apoyan la aportación de evidencias, por ejemplo relativas a los arts. 12 y 14 en usos de alto riesgo; valoración de VamiSec, sin presunción de conformidad.
Sus mayores brechas
Aún no ha respondido a todas las preguntas: las preguntas pendientes cuentan en la evaluación como «No existe».
Sus respuestas no salen de su navegador. No se guarda nada; un enlace al resultado contiene sus respuestas solo en el fragmento de la URL.
Whitepaper gratuito
Agent Control para CISOs: control en tiempo de ejecución con el OWASP Agent Control Standard
La guía práctica de ACS v0.1.0: qué regula el estándar, cómo implantar el Guardian, las políticas, las trazas y la AgBOM, cómo se traslada todo ello al AI Act, NIS2 y DORA, y lo que v0.1 todavía no ofrece.

41 páginasPDF, gratuitoAlemánActualizado: 10/2026
- Diez afirmaciones clave y un briefing de una página para el consejo, con cinco decisiones para la dirección
- Arquitectura de referencia para el Guardian y Policy as Code, incluido el concepto de failure posture y la integración con el SOC
- Mapeo regulatorio del AI Act a ISO/IEC 42001 con artefactos de evidencia, y con los límites claramente señalados
- Programa de 100 días, modelo de madurez y 20 preguntas de compra para plataformas de agentes y proveedores de Guardian
El whitepaper para CISOs: Agent Control para CISOs
Parte I · Comprender
Resumen ejecutivo con diez afirmaciones clave y un briefing de una página para el consejo de administración, el problema de control de la IA agéntica con incidentes documentados y ACS de un vistazo: roles, pilares, perfiles, historia y gobernanza.
Parte II · Implementar
Hooks y dispositions con ejemplos de mensajes wire, arquitectura del Guardian y Policy as Code, failure posture, trazas hacia el SOC, la AgBOM como inventario en tiempo de ejecución, e identidad y provenance frente a las consecuencias de la prompt injection.
Parte III · Gobernar
OWASP Agentic Top 10 × ACS como mapa de calor, mapeo regulatorio con el AI Act, NIS2, DORA, CRA, ISO/IEC 42001 y NIST AI RMF con artefactos de evidencia, y una evaluación honesta de lo que v0.1 ofrece y lo que no.
Programa y compras
Modelo de madurez con modelo operativo, un programa de implantación de 100 días con entregables y KPI, 20 preguntas de compra para plataformas de agentes y proveedores de Guardian, y respuestas a las objeciones habituales en el consejo de administración.
Nuevo · ICSPIS 2026 (IEEE)
Probar en lugar de confiar: la evidencia que hace verificables los controles de ACS
Un Guardian decide, pero ¿demuestra su telemetría que la ejecución coincidió con la decisión? Nuestro artículo aceptado en ICSPIS 2026 deriva un Evidence Contract de MAESTRO y STRIDE; el análisis lo traslada campo a campo a los hooks, la provenance y el trace de ACS, con matriz de fallos, crosswalk de ACS y pruebas negativas para su CI.
92,9 %Recall con vinculaciones de seguridad (P3)
16,7 %Recall solo con trazado causal (P2)
50 %Recall sin eventos de decisión (F1)
- Crosswalk de ACS: familia de ataque → predicado → hook → reacción del Guardian
- Campos mínimos del decision receipt en policy_data
- Research Edition (en inglés): artículo y ACS Practitioner Brief
Glosario
Glosario: términos del Agent Control Standard
Los términos más importantes de ACS v0.1.0 en definiciones breves y citables; los términos ingleses de la especificación se mantienen en su forma original.
20 de 20 términos
- Guardian AgentPolicy Enforcement Point
- La instancia externa de políticas en ACS: evalúa los hooks del Observed Agent fuera del modelo y responde con una disposition, primero mediante código de políticas determinista y, opcionalmente, con una capa LLM adicional. No debe equipararse con el término de mercado de Gartner «guardian agents».
- Observed Agent
- El sistema de IA supervisado que implementa el contrato wire de ACS, envía hooks en cada punto de decisión y aplica las dispositions recibidas. Notifica, pero no decide sobre sus propias acciones.
- Hooksteps/*
- Un punto del ciclo de vida de un agente de IA en el que este se detiene y consulta al Guardian antes de actuar. ACS v0.1.0 define 19 hooks nativos steps/*; ACS-Core exige al menos seis de ellos.
- DispositionVerdict
- La respuesta del Guardian a un hook: allow, deny, modify, ask o defer. Salvo en allow, es obligatoria una justificación en el campo reasoning.
- Failure Postureon_decision_failure
- El comportamiento del Observed Agent cuando no llega a tiempo ninguna decisión utilizable. El valor por defecto es proceed (fail-open); deny (fail-closed) debe configurarse de forma deliberada, y cada paso sin decisión debe auditarse.
- Handshakehandshake/hello
- El establecimiento obligatorio de la sesión mediante handshake/hello, en el que el Observed Agent y el Guardian negocian la versión, los métodos evaluados (methods_evaluated), el timeout y la failure posture. Los métodos no evaluados se consideran permitidos sin evaluación.
- ACS-Coreacs-core
- El perfil base obligatorio de toda implementación de ACS. Según la especificación, garantiza dos cosas: un canal autenticado y que el Observed Agent acate las decisiones del Guardian; no garantiza políticas estrictas.
- Perfil de conformidadConformance Profile
- Un alcance funcional declarado en el handshake: acs-core más los perfiles opcionales acs-trace, acs-inspect, acs-inspect-dynamic, acs-provenance, acs-crypto y acs-audit. En v0.1.0 es pura autodeclaración, sin suite de pruebas ni organismo de evaluación.
- AgBOMAgent Bill of Materials
- El inventario dinámico de los componentes de un Observed Agent, con ocho tipos, de model a skill. Se notifica por sesión, se escribe en la cadena de auditoría y puede desencadenar decisiones del Guardian; no es ni una AI-BOM ni una SBOM del CRA.
- Provenance
- Información de procedencia a nivel de campo sobre los datos del payload del hook: origin, source_id y derived_from. La establece el framework de forma determinista, nunca el LLM; solo es obligatoria en el perfil acs-provenance.
- Cadena de auditoríaSessionContext
- La cadena append-only de ContextEntries de una sesión, enlazadas mediante hashes SHA-256. El chain_hash publicado y firmado hace detectables las modificaciones posteriores: ofrece evidencia de manipulación, pero no protege frente a un Guardian comprometido.
- Policy as Code
- Reglas de seguridad como código versionado y ejecutable, en lugar de como documento. En ACS es la capa determinista del Guardian, que siempre se ejecuta primero; la referencia inicial de v0.1 es OPA/Rego, y Cedar llegará con v0.2.
- Human-in-the-Loop / aprobador de ASKask, Approver
- Con ask, el Guardian somete una acción a un aprobador para que la autorice. Los aprobadores pueden ser una persona, un agente o un servicio, y deben estar autenticados; la supervisión humana solo se logra mediante una política con approver.type human y timeout_disposition deny.
- DEFERdefer
- La disposition con la que el Guardian aplaza una decisión, por ejemplo por falta de contexto o por baja confianza. Si vence el plazo, se aplica deny por defecto; los aplazamientos en cascada deben limitarse por sesión.
- MODIFYmodify
- La disposition con la que el Guardian permite una acción de forma modificada: mediante parameter_overrides, enmascaramientos (redactions) o un contenido sustitutivo completo. El Observed Agent debe tratar un modify contrario a las reglas como un deny.
- Session IntentIntent.parsed
- El conjunto de capabilities permitidas para un propósito, fijado al inicio de la sesión. No pueden modificarlo ni el LLM ni las salidas de las herramientas, y solo se amplía mediante una aprobación auditada con ask (intent_extension).
- Capability
- Un permiso abstracto como filesystem.delete, network.egress o process.execute. Describe el efecto de una acción con independencia de la herramienta concreta y es la unidad en la que se formulan el Session Intent y las políticas.
- MCP-Wrappingprotocols/MCP/*
- El espacio de nombres especificado en v0.1 en el que ACS reenvía al Guardian los mensajes MCP sin modificarlos. Como alternativa, los despliegues pueden representar las llamadas a herramientas MCP mediante los hooks genéricos de herramientas; el wrapping de A2A no está previsto hasta v0.2.
- Implementación de referencia (AGT)Reference Implementation
- La única prueba de concepto del repositorio de ACS: un Guardian en TypeScript que ejecuta sin modificaciones el Agent Governance Toolkit de Microsoft detrás del wire de ACS, conectado a Claude Code y OpenCode; no está lista para producción ni es plenamente conforme con ACS-Core.
- Agent Control Specification (Microsoft)Microsoft ACS
- Una especificación de políticas independiente de Microsoft, basada en Rego, para el Agent Governance Toolkit (2 de junio de 2026). También se abrevia «ACS», pero no forma parte del OWASP Agent Control Standard.
FAQ
Preguntas frecuentes sobre el Agent Control Standard
Respuestas breves para CISOs, arquitectos de seguridad y GRC; datos a 4 de octubre de 2026, especificación v0.1.0.
El OWASP Agent Control Standard (ACS) es una especificación de protocolo abierta para el control en tiempo de ejecución de agentes de IA. Establece cómo un agente —el Observed Agent— notifica los pasos relevantes mediante hooks a un Guardian Agent independiente y espera su decisión: allow, deny, modify, ask o defer. Tres pilares se complementan: Instrument para hooks y dispositions, Trace para eventos de auditoría según OpenTelemetry y OCSF, e Inspect para la AgBOM. ACS es un proyecto del OWASP GenAI Security Project, actualmente en la especificación v0.1.0, release 0.1.2 (etiquetada el 21 de septiembre de 2026). El código y los esquemas están bajo Apache-2.0 y la documentación bajo CC BY-SA 4.0.
No. ACS es un proyecto de OWASP en una fase temprana: según sus propios metadatos de proyecto, en el nivel 2 (Incubator), y descrito por el propio Project Lead como «public preview». No es una norma ISO, IETF o W3C ni una norma armonizada. En v0.1.0, la conformidad es una autodeclaración que nadie verifica (issue #19). Incluso el alcance obligatorio de ACS-Core sigue debatiéndose en un pull request abierto. La hoja de ruta también es provisional: v0.2.0 figura como objetivo para marzo de 2027 y v1.0 aún no tiene fecha. También el origen merece transparencia: la fundación y la dirección del proyecto están marcadamente influidas por Zenity.
Los prompts de sistema no son controles: actúan en el mismo canal en el que un atacante puede influir mediante prompt injection. Los frameworks de guardrails son implementaciones concretas, cada una con su propia interfaz. ACS, en cambio, define una interfaz abierta e independiente del framework entre el host del agente y un Guardian externo: la decisión se toma fuera del modelo, las políticas deterministas se ejecutan primero y el agente debe aplicar el resultado. Esto importa porque, según OpenAI, la prompt injection es «unlikely to ever be fully 'solved'» (22 de diciembre de 2025). ACS no impide la prompt injection: crea el punto de control estandarizado en el que las políticas actúan contra sus consecuencias.
ACS no sustituye a ninguno de los dos protocolos, sino que añade una capa de control por encima. Para MCP, v0.1 especifica el espacio de nombres protocols/MCP/*, neutral respecto a la versión: los mensajes llegan sin modificar al Guardian, que los evalúa antes de reenviarlos o procesarlos. Como alternativa, los despliegues pueden representar las llamadas a herramientas MCP mediante steps/toolCallRequest y steps/toolCallResult; el texto de la especificación es contradictorio en cuanto a si el MCP-Wrapping forma parte de ACS-Core. Además, la especificación sigue presuponiendo mecanismos anteriores a la revisión actual de MCP 2026-07-28. En v0.1, A2A solo está reservado; el wrapping llegará con v0.2. Hasta entonces, solo quedan como recurso steps/agentTrigger con a2a_inbound y el tipo de AgBOM a2a_peer.
ACS puede ayudar a aportar evidencias, pero no cumple el AI Act ni fundamenta ninguna presunción de conformidad. Para la obligación de registro del art. 12, acs-trace (eventos por paso) y acs-audit (cadena de auditoría vinculada al contenido de las solicitudes y con evidencia de manipulación) aportan elementos. Para la supervisión humana del art. 14, ask solo sirve con una política «aprobador humano, timeout deny»; v0.1 no contempla un botón de parada, solo deny paso a paso. Tenga en cuenta los plazos: según el Reglamento (UE) 2026/1744, las obligaciones de alto riesgo se aplican a partir del 2 de diciembre de 2027 (anexo III) o del 2 de agosto de 2028 (anexo I), y el art. 50 se aplica desde el 2 de agosto de 2026. Los agentes de IA no son de alto riesgo per se. La correspondencia es una interpretación de VamiSec.
Por defecto, el agente sigue funcionando. Si dentro del timeout negociado no llega ninguna decisión utilizable, se aplica on_decision_failure con el valor por defecto proceed (fail-open); también un handshake fallido inicia la sesión, por defecto, sin protección. Cada uno de estos pasos debe registrarse como evento de auditoría: la especificación reconoce abiertamente que un atacante que perturbe el canal convierte así el control en mero registro. El modo fail-closed se consigue con on_decision_failure: deny y la startup posture refuse. En cambio, las decisiones ask y defer vencidas pasan por defecto a deny. Como la posture se aplica por sesión, recomendamos Guardians o sesiones separados por clase de riesgo (valoración de VamiSec).
La especificación no fija ningún requisito en milisegundos. El timeout se negocia en el handshake (timeout_config.default_ms, opcionalmente por método); en el peor de los casos, cada uno de esos milisegundos es tiempo de espera adicional para el agente. La implementación de referencia fija 5000 ms. Ahorran latencia las políticas deterministas, que según la especificación no deberían contener llamadas HTTP externas; la capa LLM opcional cuesta, según nuestra valoración, notablemente más, y la firma con SLH-DSA-128s tarda, según la especificación, varios cientos de milisegundos. En la operación, recomendamos ejecutar el Guardian cerca del agente y de forma redundante, presupuestar los timeouts por método y supervisar la tasa de fallos de decisión como indicador: un system/ping correcto no demuestra que la aplicación de las decisiones funcione.
Existe exactamente una implementación de referencia, expresamente como prueba de concepto: un Guardian en TypeScript que ejecuta sin modificaciones el Agent Governance Toolkit de Microsoft detrás del wire de ACS, con integraciones de host para Claude Code y OpenCode. Evalúa en vivo dos de los 19 hooks (steps/toolCallRequest y steps/toolCallResult), no firma nada (issue #70), no tiene protección contra replay y funciona por defecto en fail-open (issues #32 y #37). El proyecto se ha fijado como objetivo un benchmark de interoperabilidad para principios de diciembre de 2026, pero todavía no está disponible. De ello no se deduce un respaldo de Microsoft. No tenemos constancia de despliegues en producción contrastados (datos a 4 de octubre de 2026).
No, aunque los nombres se prestan a confusión. El 2 de junio de 2026, Microsoft publicó su propia «Agent Control Specification», también abreviada como ACS: una especificación de políticas basada en Rego del Agent Governance Toolkit, con ocho interception points y decisiones como allow, warn, deny y escalate. Procede de Microsoft, no del OWASP GenAI Security Project, y no menciona el estándar de OWASP. La conexión es indirecta: la implementación de referencia de ACS utiliza el toolkit como motor de políticas; el paquete npm agent-control-specification que se usa allí es el SDK de Microsoft, no un artefacto del estándar de OWASP. En esta página, ACS se refiere siempre al OWASP Agent Control Standard.
Trate ACS como arquitectura de referencia, no como característica de un producto. Al principio se sitúan un inventario de agentes con herramientas, modelos, servidores MCP y skills, y una clasificación de riesgos, por ejemplo siguiendo la lethal trifecta. A continuación vienen las políticas para capabilities de alto impacto en steps/toolCallRequest, una decisión deliberada sobre la failure posture y los aprobadores, y la conexión de las trazas con su SIEM; el capítulo 14 describe los cinco pasos en detalle. El navegador de perfiles y la autoevaluación muestran su punto de partida, y el whitepaper incluye un programa de 100 días. Compruebe mediante pruebas las afirmaciones de los proveedores sobre perfiles de ACS en lugar de darlas por buenas. Cómo demostrar la eficacia de sus políticas del Guardian con pruebas negativas y decision receipts en la CI lo muestra nuestro análisis en profundidad «Agentic AI Security Testing» sobre el artículo de ICSPIS 2026. VamiSec le acompaña de forma independiente en la evaluación, la arquitectura, el diseño de políticas, la implantación y las pruebas.
Estándares y fuentes
Los contenidos de esta página se basan en las siguientes guías y estudios disponibles públicamente.
OWASP GenAI Security Project · 2026
Agent Control Standard (ACS): repositorio de GitHub ↗
Fuente primaria: especificación v0.1.0, release 0.1.2, 44 esquemas JSON, implementación de referencia (PoC); código y esquemas bajo Apache-2.0, documentación bajo CC BY-SA 4.0; analizado con datos a 3 de octubre de 2026
OWASP GenAI Security Project · 2026
ACS Instrument Specification v0.1.0 ↗
Documentación publicada de la especificación: formato wire, handshake, taxonomía de 19 hooks, dispositions, failure posture, firmas y códigos de error
OWASP GenAI Security Project · 2026
ACS Conformance: ACS-Core y perfiles ↗
Alcance obligatorio de ACS-Core, los seis perfiles opcionales y la indicación de que en v0.1.0 nadie verifica las declaraciones de conformidad
OWASP GenAI Security Project · 2026
Esquemas JSON de ACS v0.1.0 (ejemplo: defer-details.json) ↗
Namespace de esquemas propio del proyecto desde el 5 de septiembre de 2026; base de los ejemplos de mensajes wire fieles al esquema del simulador
OWASP GenAI Security Project · 2026
Agent Control Standard (ACS): página de recursos ↗
Listado en el área Agentic Security, con fecha del 1 de septiembre de 2026
Zenity Labs (Rock Lambros) · 2026
Control Made It Into the Name: The Agent Control Standard Lands at OWASP ↗
Artículo de blog del Project Lead del 10 de septiembre de 2026 sobre el origen y el relanzamiento; describe ACS como «public preview»; fuente de un proveedor
Cloud Security Alliance Labs · 2026
CSA Research Note: OWASP's 2026 LLM Top 10 and New Agent Control Standard ↗
Valoración externa del 4 de septiembre de 2026: ACS como «architecture to plan around and pilot against»
OWASP GenAI Security Project — Agentic Security Initiative · 2025
OWASP Top 10 for Agentic Applications 2026 ↗
Riesgos ASI01–ASI10, publicados en diciembre de 2025; marco de referencia de la matriz de riesgos (ACS no aparece en ellos)
OWASP GenAI Security Project — Agentic Security Initiative · 2025
Agentic AI – Threats and Mitigations (recursos de la Agentic Security Initiative) ↗
Taxonomía de amenazas T1–T15 en la versión 1.0 de febrero de 2025; disponible a través del índice de recursos de la iniciativa
Unión Europea, Diario Oficial · 2024
Reglamento (UE) 2024/1689 (Reglamento de IA / AI Act) ↗
Arts. 9, 12, 14, 15, 19, 26, 50 y 72 como puntos de referencia del mapeo regulatorio
Unión Europea, Diario Oficial · 2026
Reglamento (UE) 2026/1744 (Digital Omnibus on AI) ↗
Aplaza las obligaciones de alto riesgo al 2 de diciembre de 2027 (anexo III) o al 2 de agosto de 2028 (anexo I)
National Institute of Standards and Technology · 2023
NIST AI 100-1: Artificial Intelligence Risk Management Framework (AI RMF 1.0) ↗
Marco voluntario; MANAGE 2.4 sobre mecanismos para sustituir, desconectar o desactivar sistemas de IA
OpenTelemetry · consultado 10/2026
OpenTelemetry Semantic Conventions para IA generativa ↗
Estado «Development»; base de comparación para los mapeos de trazas de ACS (allí, los spans de herramientas: execute_tool)
Open Cybersecurity Schema Framework (Linux Foundation) · consultado 10/2026
OCSF Schema 1.5.0: categorías y clases ↗
Contraste de los UID y nombres de clase utilizados por ACS, entre ellos 2004 Detection Finding y 6002 Application Lifecycle
OWASP Foundation / Ecma TC54 · 2025
CycloneDX Specification Overview ↗
Actualmente, versión 1.7; ACS serializa la AgBOM según CycloneDX 1.6
Microsoft (Responsible AI) · 2026
Introducing Agent Control Specification: Portable runtime governance for AI Agents ↗
Delimitación: especificación independiente de Microsoft del 2 de junio de 2026, también abreviada «ACS», que no forma parte del estándar de OWASP
Microsoft Open Source Blog · 2026
Introducing the Agent Governance Toolkit (Microsoft Open Source Blog) ↗
Anuncio del 2 de abril de 2026; el toolkit sirve sin modificaciones como motor de políticas de la implementación de referencia de ACS
OpenAI · 2025
Continuously hardening ChatGPT Atlas against prompt injection attacks ↗
22 de diciembre de 2025: la prompt injection sería «unlikely to ever be fully 'solved'»; argumento a favor de controles en tiempo de ejecución independientes del modelo
¿Quiere implantar el control en tiempo de ejecución para sus agentes de IA?
VamiSec le acompaña de forma independiente: evaluación de su panorama de agentes, arquitectura del Guardian y diseño de políticas basado en ACS, implantación y pruebas, sin promesas de certificación y con una visión clara del grado de madurez de v0.1.