ECL ACS Binding Profile 1

Requirement-IDs: compiled Version: 1.0 Status: normative profile of ECL-1 Version 1.0

This profile states how a deployment of the OWASP Agent Control Standard (ACS) connects to an ECL-1 deployment. An ACS Guardian becomes a decision source for an ECL Decision Layer. An ACS hook point can become an ECL enforcement point only when it runs outside everything the governed AI system can execute code in or control, and meets the Enforcement Layer requirements; a hook point inside the governed AI system can carry the Guardian's decision to an ECL decision point and is never an enforcement point (AC1-002). The ECL guarantee is unchanged: an action is released only on an ECL admit bound to the exact request, a failure that leaves the action without required proof ends closed, and the signed ECL evidence bundle is the record that a third party can check and, from L2, verify offline.

The pinned ACS text lets a deployment proceed when its Guardian cannot answer: the handshake member on_decision_failure defaults to proceed. This profile replaces that default for every action that an ECL claim covers. A decision failure at an ECL enforcement point ends in the declared safe state and never in the action going ahead (AC1-006).

The profile adds requirements to a claim that declares it. It removes none of the core requirements or of the requirements of DCMP-2, EBMP-2 and TRUST-POLICY-1.

Under this profile an action crosses its release boundary (ECL1N-0185) when an ECL enforcement point releases it on the admit of the DCMP-2 response that an ECL decision point issues for the exact request (AC1-003, AC1-005); a Guardian decision, and a hook point that is not an enforcement point, release nothing.

Pinned sources

The machine-readable record of these pins is conformance/binding-sources.json. ACS prose is licensed CC BY-SA 4.0 and its schemas Apache-2.0; this profile cites ACS identifiers and does not reproduce ACS text.

Source Revision File SHA-256
ACS specification version 0.1.0, Instrument pillar GenAI-Security-Project/agent-control-standard release tag v0.1.2 (tag object 11871fad2817aa8eefd69944649dbea85bf6085c), commit 7743826b2ec02e3daf47a08c82170fc7a43b0838 docs/spec/instrument/specification.md 53fd6658653ea358415c115b6dceff1961ac69e3dd4435556b3a17922942dea3
ACS conformance profiles same commit docs/spec/conformance.md 7c9d699efaba9d3fbcf9cc16288b653b1f9ae4cd7e33a874c19ba29d6495176c
ACS hook taxonomy same commit docs/spec/instrument/hooks.md 1441751389f0267a96a91e023b2483575368d51ac20c392a2a3c6a956c02576b
Response envelope schema same commit specification/v0.1.0/response-envelope.json 145f730c80a7a6ca8c870fe4a68b898d0ef6a8fcd0f2cc575f9ca70e6d43d0d9
Handshake schema same commit specification/v0.1.0/handshake.json 9fabf14e732372cdcab4923bd977ecd9fcd32896e4e4126cc460a640e0d627ab
Modifications schema same commit specification/v0.1.0/modifications.json 5602fb5ed3adb0ab360f29774f0c58b63fb7270f94130cf77d6d3bd93fe1ecc8
ContextEntry schema same commit specification/v0.1.0/context-entry.json efe01385a6150960c693653a36d38bd7b829697965631295b94a8c3115b95205
ASK details schema same commit specification/v0.1.0/ask-details.json 1a8a5348b677b265afa8f2f96394ced1811eddbd4bc4a0cdde3f7ac9322cdf1c
DEFER details schema same commit specification/v0.1.0/defer-details.json 5c0f3d28201f20f1aef9a06a7b66922ddd3f8f41a801665cf14432b5ddbaa5cf

The release file version.txt reads 0.1.2; the specification inside it is version 0.1.0. The mapping packet conformance/crosswalks/owasp-acs-core.json captures the same release. Disposition names are the wire values of the response envelope: allow, deny, modify, ask and defer.

Roles and declarations

AC1-001§ — A claim of this profile MUST identify the ACS specification version and repository release it implements by the revision and digests that this profile pins, the Guardian by principal identifier and trust domain, and each hook point that it claims as an ECL enforcement point with the in-scope action classes that hook point mediates.

AC1-002§ — An ACS hook point MUST NOT be claimed as an ECL enforcement point unless the governed AI system can neither bypass it, disable it nor change the decision it applies (ECL1N-0033, ECL1N-0043, ECL1N-0046), and the Consequential Action Register records its enforcement class with its rationale and residual bypass risk (ECL1N-0044, ECL1N-0045). A hook point that runs in a process, container or account in which the governed AI system can execute code, or that the governed AI system can start, stop or reconfigure, MUST NOT be claimed as an ECL enforcement point; it MAY carry the Guardian's decision to an ECL decision point, where AC1-004 gives that decision its class and the decision is not a verifiable input unless the decision point verifies the Guardian's signature over it under a key that the governed AI system cannot use.

AC1-003§ — A Guardian decision MUST reach an ECL enforcement point only through a DCMP-2 decision response that an ECL decision point issues and signs for the exact request (DCMP2-044 to DCMP2-051); an enforcement point MUST release an action only on that response's admit, and a Guardian allow MUST NOT create, widen or extend ECL authority, so the decision point still applies its native authority, scope, validity, budget and human-approval checks.

Dispositions

AC1-004§ — The ECL outcome for an action that a Guardian decision governs MUST be at least as strict, in the strictness order of the core standard (Section 4.3), as the outcome this mapping gives: allow maps to admit only when policy evaluated over verifiable inputs permits the action under the one-way rule of the core standard (Section 5.2), and otherwise to deny; deny maps to deny; ask maps to challenge naming the approval required (ECL1N-0174, ECL1N-0177), or to hold or deny where the Guardian substitutes for an approver-incapable client; defer maps to hold carrying the resolution condition and deadline (DCMP2-018); modify maps to deny of the original request, with the modified action handled under AC1-005. A Guardian decision whose evaluator is agent or composite, or that states no evaluator, is a judgment input. Any other Guardian decision is actor_supplied when it reaches the ECL decision point through a hook point or any other channel that the governed AI system can write, unless the decision point verifies the Guardian's signature over the decision under a key that the governed AI system cannot use; an ACS-Core HMAC under a key that the Observed Agent holds does not qualify, and an ACS-Crypto asymmetric signature under a key held only by the Guardian does (ECL1N-0178, AC1-009). Otherwise it takes the least trusted class of the inputs it evaluated, so one that evaluated SessionContext, Intent or other content the governed AI system wrote is actor_supplied. A Guardian decision that is a judgment or actor_supplied input MAY make the outcome stricter and MUST NOT be the basis of an admit. The exchange record MUST state in guardian.channel whether the decision point obtained the decision from the Guardian directly (direct), verified a Guardian signature under a key that the governed AI system cannot use (signed), or received it through a hook point (hook), and MUST name, in the derived_from of the Guardian decision's input, each decision input that the Guardian's request carried other than the action itself. A Guardian decision whose input has no derived_from, or whose channel is hook, MUST NOT be declared verifiable. When the response carries ecl.ext.acs-decision.v1, exactly one input MUST carry guardian: true. The class that this requirement gives a Guardian decision holds in every decision basis that the exchange record holds: an entry of the ecl.ext.decision-basis.v1 of the record's modification_response whose input is the input that the record marks guardian MUST have the class of the marked input. When guardian.channel is signed, the record MUST also give, in guardian.key_id, the identifier of the key under which the decision point verified the Guardian's signature and, in guardian.request_digest, the ecl.digest.sha-256.v1 digest of the RFC 8785 canonical form of the request that the Guardian evaluated. A verifier of the record cannot itself verify the Guardian's signature, which the record does not hold: the channel, the key and the digest are the adapter's statements, which an assessor checks against the deployment.

AC1-005§ — A modify decision MUST NOT release the original action. The action that the modification produces, if it is to go ahead, MUST be submitted as a new DCMP-2 decision request that carries the effective parameters after the modification, as the same JSON values, in action.parameters and action.parameters_digest, carries the original request's issuer, actor, subject, delegation_chain, authority_request, constraints and integrity_policy, and its action with only action_id, parameters and parameters_digest changed, names the original request as a causal predecessor by identifier and digest with the relation ecl.relation.modification-of.v1, and is evaluated and admitted on its own; an enforcement point MUST release only the parameters that the new request's admit binds, and a modifications object that the pinned text forbids (a wholesale replacement combined with edits, or edits with overlapping targets), or one that cannot be applied under the next section, MUST end in deny of the original with no new request. An exchange record of a modify that holds neither a modification_request nor a release records a deny of the original with no new request and MUST NOT be reported for the missing new request, since the record does not show why the modified action did not go ahead; one that holds a modification_response without its modification_request MUST be reported as ecl.rule.acs-modification-new-request.v1. A decision other than modify, and a decision failure, has no new request: the enforcement point MUST release the action, if at all, only on the admit of the original request, and an exchange record that records a decision failure, or a Guardian decision other than modify, and that holds a modification_request or a modification_response MUST be reported as ecl.rule.acs-modification-new-request.v1.

Effective parameters of a modify

The effective parameters of a modify follow the pinned modification rules. Each parameter_overrides member replaces the argument of that name, and each redaction replaces the value at its JSON Pointer, resolved against the tool call's arguments, with its replacement text ([REDACTED] when none is given). A wholesale modified_content replaces the arguments only when its text is a JSON object within the restricted canonical profile (IE1-001). A redaction path that does not resolve inside the arguments, or effective parameters outside that profile, make a modification one that cannot be applied. A modification that changes the action's target or operation, as the deployment derives them from the tool call's arguments (for an MCP tool, by the rule of its mapping, MG1-003), cannot be applied.

The new request keeps the original's target and operation (AC1-005), so a modification that changed the argument from which the deployment derives the target would release, under an admit for one resource, parameters that act on another. An exchange record does not show how the deployment derives the target and operation from the arguments. A checker of the record accepts the record of such a modification, which ends with no new request and no release (AC1-005), as it accepts that of any modify whose modified action did not go ahead. It cannot see whether the effective parameters of a new request that went ahead changed the target or operation; the assessor checks that against the deployment's mapping, which for an MCP tool is the mapping that MG1-003 declares.

Failure and timeouts

AC1-006§ — At an ECL enforcement point, a decision failure MUST end in the declared safe state and MUST NOT release the action, whatever on_decision_failure posture the handshake negotiated. A decision failure is any of these: no usable Guardian decision within the negotiated timeout; a transport failure; an error response without a decision; a decision whose disposition the mapping of AC1-004 does not name; a decision for a request_id other than the hooked step's; a response whose ACS signature, where the session requires one, does not verify; and a decision that arrives after the enforcement point applied the safe state for the step. A deployment that claims this profile MUST negotiate on_decision_failure as deny, and MUST configure the startup posture that the pinned text sets out of band as refuse, so that a failed handshake starts no unguarded session for an in-scope action class.

The pinned text's liveness method, system/ping, carries no enforcement semantics there, and its failure is not an enforcement event. This profile maps no ACS liveness method: the negotiated decision timeout of each step bounds a silent or unreachable Guardian, and its expiry is a decision failure.

AC1-007§ — The expiry of an ask or a defer MUST NOT release an in-scope action, even when the ask declares a timeout_disposition of allow or the defer a timeout_decision of ask: the ECL response for it MUST carry an expires_at no later than the Guardian's deadline and a safe_state under which the waiting action is not released (ecl.state.fail-closed.v1, ecl.state.quarantine.v1, ecl.state.emergency-halt.v1 or ecl.state.restricted.v1), and the enforcement point MUST record the expiry as a non-release outcome. The Guardian's deadline is the instant at which the ECL deployment received the Guardian's decision, which the exchange record holds as guardian.observed_at, plus the ask_details.timeout_seconds of an ask, in seconds, or plus the defer_details.resolution_timeout_ms of a defer, in milliseconds (the pinned ask-details.json and defer-details.json).

The pinned text does not say from which instant a Guardian's timeout runs, and an ACS response carries no time of issue. The profile counts the timeout from the instant the ECL deployment received the decision, so that the deadline can be computed from the exchange record and checked. An approval that arrives after the deadline releases nothing until a new evaluation admits the action. As in AARM-BINDING-1 (AB1-005), a fail-open or degraded state never decides an expiry: the degraded state can permit the action that waits.

Session chain and evidence

AC1-008§ — For each Guardian decision that an ECL decision depends on, the ECL decision response MUST carry the registered extension ecl.ext.acs-decision.v1 with the Guardian's decision, its evaluator, the ACS request_id, the chain_hash that the Guardian published for the step, and for a modify the ecl.digest.sha-256.v1 digest of the RFC 8785 form of its modifications object; when the deployment claims the ACS-Audit profile it MUST also carry the step's request_hash. A verifier that recomputes the ACS session chain under the chain-hashing rule below MUST find each recorded chain_hash as the head after that step's ContextEntry, which is the entry whose step_id is the recorded request_id.

The chain-hashing rule restates section 8.2 of the pinned Instrument specification. A ContextEntry's entry_hash is the lowercase hexadecimal SHA-256 of the UTF-8 bytes of the RFC 8785 canonical form of the entry with its entry_hash and previous_hash members removed, followed by the 32 bytes that the entry's previous_hash encodes in hexadecimal, or by no bytes for the first entry of a session, whose previous_hash is null or absent. Each later entry's previous_hash is the entry_hash of the entry before it, and the chain head after an entry is that entry's entry_hash.

AC1-009§ — The ACS session chain MUST be treated as a native record that coexists with EBMP-2 evidence under EBMP2-045: the signed ECL evidence bundle is the record of release, an ACS chain or chain head that disagrees with the ECL evidence MUST be reported as an integrity finding and MUST NOT be repaired by rewriting either record, and an ACS-Core signature (HMAC-SHA256 under a shared key) MUST NOT be presented as satisfying FR-108.

AC1-010§ — An adapter that retains exchange records for this profile MUST write each one as ecl_acs_exchange_v1, valid against https://externalcontrollayer.ai/ns/schema/binding/acs-exchange/1, and every value of ecl.ext.acs-decision.v1 it emits MUST validate against https://externalcontrollayer.ai/ns/schema/extension/acs-decision/1.

AC1-011§ — When the Observed Agent wraps MCP traffic in the ACS protocols/MCP/* namespace, a request that reaches an in-scope MCP server MUST also satisfy MCP-GATEWAY-1 at the point where it leaves for that server.

Decision basis

AC1-012§ — When an exchange record holds a response, the record's inputs MUST be the entries of the decision basis that the response records in ecl.ext.decision-basis.v1: each input of the record, without its guardian marker, MUST equal the entry of the extension's value whose input is the same, and each entry MUST appear in the record exactly once. A response that does not carry the extension records no inputs, and a response that carries it more than once matches no record. A record that breaks this MUST be reported as the verification finding ecl.rule.acs-inputs-match-basis.v1. The record's response, and its modification_response when it holds one, MUST each carry exactly one ecl.ext.decision-basis.v1 and MUST also satisfy DCMP2-053, each with the record's request or modification_request as the request it answers, with the response clock-skew allowance of the reference verification profile, zero (DCMP2-047); a record whose response fails either MUST be reported with ecl.rule.decision-basis-one-way.v1. Each DCMP-2 message that the record holds MUST satisfy the semantic rules of DCMP-2, and a record that holds one that fails a rule MUST be reported with that rule. The decision basis of the record's modification_response MUST carry the register reference of the decision basis of the response, member for member, and MUST record the same inputs, compared as input names are, each with the class, required, source and derived_from that the record's inputs give it; a record that breaks this MUST be reported as ecl.rule.acs-inputs-match-basis.v1.

The record is the adapter's account of a decision, and the response is the decision point's signed account of the same decision. If the two could disagree, each could pass its own check: a record could class an agent Guardian's allow as judgment while the signed basis classes it verifiable and rests the admit on it. The record's inputs use the vocabulary of the decision basis (an entry of ecl.ext.decision-basis.v1 with the guardian marker added), so every member is compared, including the status and reference of an input that was unavailable, late or malformed, the effect of each input and the inputs a Guardian decision was computed from. Agreement alone would let a record and its response agree on a basis that breaks the one-way rule, such as an admit while a required input was unavailable; the response is therefore held to DCMP2-053 as it would be in a signed evidence bundle.

The decision basis of the modification response is compared with the record for the same reason, since its admit releases the modified action. The new request is the original action with other parameters (AC1-005), of the same action class, so the register version declares the same inputs for both decisions; the status, effect, reference and times of each input describe the new decision and may differ. The new request is decided under the register version of the first decision; if that version is no longer in force, the modification is not admitted.

Disposition mapping (informative)

ACS disposition ECL outcome Release
allow from a deterministic evaluator admit when ECL policy over verifiable inputs permits it, otherwise deny Only on a verified admit
allow from an agent or composite evaluator, or one that states no evaluator As above; the Guardian decision is a judgment input and is never part of the basis Only on a verified admit
allow from a deterministic evaluator that a hook point carried to the decision point As above; the Guardian decision is an actor_supplied input and is never part of the basis Only on a verified admit
deny deny None
modify deny of the original; a new request carrying the effective parameters, if the modified action is to go ahead Only the new request's admitted parameters
ask challenge until the approval is recorded; hold or deny for an approver-incapable client None until a new evaluation admits
defer hold with the resolution condition and deadline None
Decision failure Declared safe state, recorded as denied with ecl.error.dependency-unavailable.v1 None

Session chain mapping (informative)

ACS element ECL counterpart
session_id Recorded with the workflow; one ACS session can span several ECL workflows
request_id of the hooked step request_id in ecl.ext.acs-decision.v1; the DCMP-2 message_id stays distinct (DCMP2-005)
ContextEntry entry_hash and the published chain_hash chain_hash in ecl.ext.acs-decision.v1 on the response that the step leads to
ContextEntry request_hash (ACS-Audit) request_hash in ecl.ext.acs-decision.v1
Response signature Not mapped; ECL evidence carries its own INTEGRITY-ENVELOPE-1 signatures

Exchange record (informative)

An ecl_acs_exchange_v1 record holds one hooked step's exchange. Its members are the ACS session_id and hook; the negotiated on_decision_failure posture and whether the deployment claims ACS-Audit (audit_profile); the guardian member with the status of the Guardian's answer (decided or failed), the kind of failure (timeout, transport, error, unmapped_disposition, request_mismatch, signature_invalid or late, the decision failures of AC1-006), the time the adapter observed it, the channel through which the decision point obtained a decision (direct, signed or hook, AC1-004) and the Guardian's result; the inputs of the ECL decision, which are the entries of the decision basis that the response records in ecl.ext.decision-basis.v1 (AC1-012), with the Guardian's decision marked by guardian and the inputs its request carried named in that entry's derived_from; the DCMP-2 request and response, and for a modify whose modified action went ahead the modification_request and modification_response; the session chain up to the step; and a release member only when the action was released. The rules registered for this profile, whose names begin ecl.rule.acs-, check a record after its schema.

Security considerations

ACS-Core assures that the channel between the Observed Agent and the Guardian is authenticated and that the agent honors the Guardian's decisions; it does not assure that a hook point is outside the governed AI system's reach, and its symmetric baseline signature cannot prove to a third party which party wrote a chain head. The profile therefore places the release decision at an ECL enforcement point outside the governed AI system (AC1-002), records the ACS chain heads inside signed ECL evidence, and removes the fail-open defaults for covered actions, the negotiated on_decision_failure and the out-of-band startup posture among them (AC1-006). An adversary who can delay or drop Guardian traffic can then cause denials, not unguarded actions. A Guardian whose agent layer is a language model is steerable by the content it reviews, which is why its decisions are judgment inputs. ACS hooks fire in the Observed Agent, and the ACS-Core signature is an HMAC under a per-session key that the Observed Agent holds, so the governed AI system can forge a decision that a hook carries; such a decision is never verifiable, and only a decision that the decision point obtains from the Guardian or authenticates by the Guardian's own signature can be (AC1-004).

Conformance

Kind What the citation establishes
Vectors The acs-binding suite accepts a deny for a Guardian decision that arrived after the safe state was applied, and a modify that ends in deny with no new request and no release, and refuses a fail-open proceed after a Guardian decision failure, a negotiated proceed posture, an admit after a decision failure, a release when an ask expires even with timeout_disposition allow, an expiry into a fail-open state or after the Guardian's deadline, an outcome weaker than the mapped disposition, a modification released under the original request or with other parameters, a new request that carries a number where the effective parameters hold a boolean, a modification response without its new request, a new request recorded, and released, after a Guardian decision other than modify, a Guardian allow from an agent or composite evaluator, or from one that states no evaluator, used as verifiable or as the basis of an admit, a deterministic Guardian decision carried by a hook point used as verifiable, a modification admitted on a Guardian decision that a hook point carried or that an agent evaluator made, a signed channel without the identifier of the key that signed the decision or the digest of the Guardian's request, a released request that declares a negative budget debit, a response that records a Guardian decision that no input marks, a record without the channel of a decision, a release without an admit, a response that does not record the Guardian decision, and a recorded chain head that the recomputed ACS chain does not contain; the binding-basis suite refuses a record whose inputs disagree with the decision basis of its response, a record whose response or modification response carries no decision basis, and a record whose response's decision basis breaks DCMP2-053, alone or with the request it answers
Assessor procedure Hook-point placement and enforcement class, handshake postures, Guardian identity, and how the deployment derives each action's target and operation from its arguments, which decides whether a modification can be applied, so that no modification that changes them is released (AC1-005)

The vectors establish the behavior of exchange records, not the conformance of an ACS product, and this profile claims no ACS conformance and no OWASP endorsement.