<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     consensus="true"
     docName="draft-paxton-aicp-00"
     ipr="trust200902"
     submissionType="IETF"
     tocDepth="3"
     tocInclude="true"
     sortRefs="true"
     symRefs="true"
     version="3">
  <front>
    <title abbrev="AICP">Agent Infrastructure Control Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-paxton-aicp-00"/>
    <author fullname="Tihan-Nico Paxton" initials="T.P" surname="Paxton">
      <organization>Apollo Deploy</organization>
      <address>
        <email>tihan-nico@apollodeploy.com</email>
      </address>
    </author>
    <date year="2026" month="September" day="2"/>
    <area>Applications and Real-Time</area>
    <workgroup>Internet Engineering Task Force</workgroup>
    <keyword>agent</keyword>
    <keyword>infrastructure</keyword>
    <keyword>control plane</keyword>
    <keyword>intent</keyword>
    <keyword>automation</keyword>
    <abstract>
      <t>Autonomous software agents increasingly inspect and modify infrastructure through provider-specific APIs and generic tool protocols. Those interfaces expose operations, but they do not provide a common semantic contract for obtaining bounded situational context, expressing an intended outcome under constraints, reviewing the exact material effects, binding authorization to those effects, observing durable execution, and determining whether the intended outcome was achieved.</t>
      <t>This document specifies the Agent Infrastructure Control Protocol (AICP). AICP is a transport-independent object and lifecycle model for capability discovery, situations, intents, plans, authorization decisions, asynchronous operations, verified outcomes, machine-actionable problems, and reconciliation. It also specifies an HTTP binding and describes mappings to existing agent protocols. AICP does not replace cloud resource APIs, orchestration languages, agent-to-agent protocols, authentication systems, or provider policy engines.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Infrastructure control interfaces are commonly designed for human operators, provider SDKs, or declarative reconcilers. An autonomous caller can use those interfaces, but must often reconstruct essential control semantics from many provider-specific reads, natural-language descriptions, asynchronous job APIs, and unstructured error messages. The caller may be unable to determine whether a request was authorized, whether a preview is still valid, whether an interrupted mutation took effect, whether retry is safe, what side effects occurred, or which recovery action is permitted.</t>
      <t>Generic agent protocols improve invocation and interoperability, but an invocation envelope does not define the meaning of infrastructure control. Two providers can expose tools through the same protocol while using incompatible action names, state models, error semantics, and safety behavior. Conversely, existing infrastructure standards define valuable resource and orchestration models, but generally do not define a complete control contract optimized for an autonomous principal.</t>
      <t>AICP defines that contract as a linked control loop:</t>
      <ol spacing="normal">
        <li>discover the capabilities available to the authenticated principal;</li>
        <li>obtain a bounded, freshness-labelled situation;</li>
        <li>state an intent, hard constraints, and success criteria;</li>
        <li>receive a concrete, expiring plan with material changes, assumptions, unknowns, risk, feasibility, and authorization state;</li>
        <li>bind approval and execution to that exact plan revision;</li>
        <li>observe a durable asynchronous operation;</li>
        <li>verify the actual outcome and side effects; and</li>
        <li>reconcile or compensate when effects are uncertain or unacceptable.</li>
      </ol>
      <t>The protocol is designed so that each object supplies the decision inputs for the next stage and remains linked to its causes. This permits a different process, agent, or human operator to resume control without relying on a lossy transcript or private model state.</t>
      <section anchor="contribution">
        <name>Scope of the Contribution</name>
        <t>Cloud Infrastructure Management Interface (CIMI) <xref target="CIMI"/>, Cloud Application Management for Platforms (CAMP) <xref target="CAMP"/>, Topology and Orchestration Specification for Cloud Applications (TOSCA) <xref target="TOSCA"/>, Kubernetes <xref target="KUBERNETES"/>, and related systems already define infrastructure resources and operations. Model Context Protocol (MCP) <xref target="MCP"/> and Agent2Agent Protocol (A2A) <xref target="A2A"/> already define agent integration mechanisms. OAuth, workload identity, and provider policy systems already address identity and authority.</t>
        <t>AICP therefore does not claim to be the first infrastructure API or the first agent protocol. Its contribution is the interoperable semantic boundary between an autonomous principal and an infrastructure control plane: the representation and lifecycle of situation, intent, exact plan, authority, execution, effect certainty, verified outcome, and recovery.</t>
      </section>
      <section anchor="layering">
        <name>Layering</name>
        <t>AICP follows the architectural preference to profile and extend existing Internet protocols rather than define a monolithic agent protocol <xref target="AI-ARCH"/>. It defines a core model and an HTTP binding. Infrastructure vocabularies are supplied by profiles. MCP can expose AICP through a small set of tools, A2A can carry or delegate AICP objects, and provider adapters can map AICP profiles to native APIs. All bindings are expected to invoke the same provider planning, policy, execution, journaling, and verification services.</t>
        <t>AICP objects can reference existing resource representations rather than copying them. For example, a profile can use Kubernetes objects, a TOSCA service template, or a provider resource identifier as the target or arguments of an AICP action.</t>
      </section>
    </section>

    <section anchor="conventions">
      <name>Conventions and Terminology</name>
      <t>The key words <bcp14>MUST</bcp14>, <bcp14>MUST NOT</bcp14>, <bcp14>REQUIRED</bcp14>, <bcp14>SHALL</bcp14>, <bcp14>SHALL NOT</bcp14>, <bcp14>SHOULD</bcp14>, <bcp14>SHOULD NOT</bcp14>, <bcp14>RECOMMENDED</bcp14>, <bcp14>NOT RECOMMENDED</bcp14>, <bcp14>MAY</bcp14>, and <bcp14>OPTIONAL</bcp14> in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      <dl newline="true" spacing="normal">
        <dt>Agent</dt>
        <dd>An autonomous or semi-autonomous software system acting for a principal. A conforming client need not use artificial intelligence.</dd>
        <dt>Principal</dt>
        <dd>The authenticated security principal to which permissions, delegation, quotas, and audit records apply. It can represent an agent, workload, user, or service.</dd>
        <dt>Control plane</dt>
        <dd>A service that reads or changes infrastructure state, directly or through provider adapters.</dd>
        <dt>Resource</dt>
        <dd>An infrastructure object identified by a profile-defined type, provider-stable identifier, and optional scope and revision.</dd>
        <dt>Action</dt>
        <dd>A stable, profile-defined operation or outcome class advertised as a capability.</dd>
        <dt>Situation</dt>
        <dd>A bounded observation of resources, relationships, health, active operations, applicable constraints, and available actions, including freshness and coverage metadata.</dd>
        <dt>Intent</dt>
        <dd>A requested outcome expressed as an action, target, arguments, constraints, and success criteria. An intent is not an instruction to bypass planning or policy.</dd>
        <dt>Plan</dt>
        <dd>A provider-generated, revisioned, and expiring proposal for satisfying an intent, including exact material changes and decision metadata.</dd>
        <dt>Consequential action</dt>
        <dd>An action that can modify infrastructure state, incur cost, expose data, affect availability, alter authority, or produce another externally visible effect.</dd>
        <dt>Operation</dt>
        <dd>A durable representation of an execution attempt and its evolving control and effect state.</dd>
        <dt>Outcome</dt>
        <dd>A durable comparison between intended, expected, and observed effects after an operation reaches a terminal state.</dd>
        <dt>Effect state</dt>
        <dd>The provider's degree of certainty about external effects: none, possible, partial, complete, reversed, or unknown.</dd>
        <dt>Reconciliation</dt>
        <dd>An observation-oriented action used to determine actual infrastructure state when an operation's effects are uncertain.</dd>
        <dt>Compensation</dt>
        <dd>A new consequential action intended to counter some effects of an earlier action. Compensation is not assumed to restore identical prior state.</dd>
        <dt>Profile</dt>
        <dd>An independently versioned specification that defines resource types, actions, schemas, constraints, observations, and additional conformance requirements for an infrastructure domain.</dd>
      </dl>
    </section>

    <section anchor="goals">
      <name>Design Goals and Non-Goals</name>
      <section anchor="design-goals">
        <name>Goals</name>
        <ul spacing="normal">
          <li><t><strong>Legibility:</strong> facts that affect a control decision are represented as typed fields rather than only as prose.</t></li>
          <li><t><strong>Bounded context:</strong> the provider can return a compact decision view with explicit freshness, coverage, truncation, and omissions.</t></li>
          <li><t><strong>Outcome orientation:</strong> the caller states the desired result and constraints separately from the provider's mechanism.</t></li>
          <li><t><strong>Preview fidelity:</strong> a consequential execution is bound to an exact, expiring plan revision and is rejected if that plan is stale.</t></li>
          <li><t><strong>Authority clarity:</strong> feasibility, authorization, approval, and readiness are separate states derived from authenticated context.</t></li>
          <li><t><strong>Failure legibility:</strong> problems disclose retry safety, effect certainty, alternatives, and remediation actions in machine-actionable fields.</t></li>
          <li><t><strong>Durability:</strong> plans, operations, outcomes, and events can outlive a client session and support resumption.</t></li>
          <li><t><strong>Composability:</strong> profiles and bindings reuse existing resource models, authentication, event, telemetry, and evidence mechanisms.</t></li>
          <li><t><strong>Resource efficiency:</strong> clients can cache capabilities, request bounded views, follow deltas, and use structured next actions instead of repeating open-ended discovery.</t></li>
          <li><t><strong>Binding parity:</strong> no transport or agent adapter creates a privileged path around planning, policy, or audit.</t></li>
        </ul>
      </section>
      <section anchor="non-goals">
        <name>Non-Goals</name>
        <t>This document does not:</t>
        <ul spacing="normal">
          <li>define model prompts, private reasoning, chain-of-thought, or agent planning algorithms;</li>
          <li>define agent-to-agent conversation or task delegation;</li>
          <li>define a global directory of agents or infrastructure providers;</li>
          <li>define a universal representation for every cloud or infrastructure resource;</li>
          <li>replace provider-native APIs, Kubernetes reconciliation, CIMI, CAMP, TOSCA, OAM, or infrastructure-as-code systems;</li>
          <li>define a new authentication, credential, payment, telemetry, signature, or approval protocol;</li>
          <li>guarantee exactly-once execution or perfect rollback;</li>
          <li>permit a client to self-assert permissions, risk acceptance, or approval; or</li>
          <li>require providers to disclose sensitive topology, capacity, policy, or tenant information.</li>
        </ul>
      </section>
    </section>

    <section anchor="architecture">
      <name>Architecture</name>
      <section anchor="control-loop">
        <name>Linked Control Objects</name>
        <t>The AICP control loop consists of seven durable object classes: Capability Document, Situation, Intent Request, Plan, Operation, Outcome, and Problem. An Operation Event is an incremental delivery form for Operation changes.</t>
        <t>Each object <bcp14>MUST</bcp14> identify or link to the immediately preceding control objects where applicable. A Plan identifies its Intent Request and the Situation on which it was based. An Operation identifies the exact Plan revision. An Outcome identifies the Operation and preserves the expected and observed effects. These links form an audit and resumption graph; they do not expose model reasoning.</t>
        <t>A provider <bcp14>MAY</bcp14> retain objects for different periods, but it <bcp14>MUST</bcp14> advertise relevant retention limits and <bcp14>MUST NOT</bcp14> discard an active Operation before reaching a terminal phase.</t>
      </section>
      <section anchor="separation">
        <name>Separation of Responsibilities</name>
        <t>Consistent with intent-based networking concepts <xref target="RFC9315"/>, the client states a desired outcome separately from the provider's implementation mechanism. The client selects an advertised action, identifies targets, supplies arguments, states constraints and success criteria, and chooses preview or execute-if-ready mode. The provider observes native state, proposes mechanisms, evaluates policy, executes through native systems, journals effects, verifies outcomes, and reports uncertainty.</t>
        <t>The provider <bcp14>MUST</bcp14> derive identity, delegation, permissions, and approval validity from authenticated server-side context. It <bcp14>MUST NOT</bcp14> grant authority because a request body claims that authority. A purpose string or delegation reference is input to policy evaluation, not proof of permission.</t>
      </section>
      <section anchor="bindings-profiles">
        <name>Bindings and Profiles</name>
        <t>The core object model is independent of transport. This document's HTTP binding defines interoperable retrieval and mutation semantics. Other bindings <bcp14>MUST</bcp14> preserve object identity, request deduplication, plan-revision binding, operation durability, error semantics, and authorization parity.</t>
        <t>A profile defines domain vocabulary. Action and type identifiers <bcp14>MUST</bcp14> be absolute URIs controlled by the profile publisher. A profile <bcp14>MUST</bcp14> publish machine-readable input and output schemas and <bcp14>MUST</bcp14> define the semantics that affect interoperability, including effect class, idempotency, reversibility, preconditions, success criteria, and observation types.</t>
      </section>
      <section anchor="fast-path">
        <name>Preview and Execute-if-Ready</name>
        <t>Consequential intents default to preview. To avoid an unnecessary round trip for routine, low-risk work, a client can request <tt>execute-if-ready</tt>. The provider still creates an internal plan, evaluates current policy, binds execution to that plan, and returns the resulting Plan or Operation. It <bcp14>MUST NOT</bcp14> execute when feasibility is not <tt>feasible</tt>, authorization is not <tt>allowed</tt>, a required approval is absent, a hard constraint is unsatisfied, or policy requires explicit preview.</t>
        <t>The execute-if-ready mode is permission to use the safe fast path, not an instruction to weaken policy.</t>
      </section>
    </section>

    <section anchor="data-model">
      <name>Common Data Model</name>
      <section anchor="json-encoding">
        <name>JSON Encoding</name>
        <t>AICP JSON objects <bcp14>MUST</bcp14> be valid JSON as defined by <xref target="RFC8259"/> and <bcp14>MUST</bcp14> satisfy the Internet JSON (I-JSON) constraints in <xref target="RFC7493"/>. Object member names are case-sensitive. A producer <bcp14>MUST NOT</bcp14> emit duplicate member names. Time values <bcp14>MUST</bcp14> use the Internet date-time format in <xref target="RFC3339"/> and <bcp14>SHOULD</bcp14> use UTC.</t>
        <t>When a profile needs an integer outside the exact interoperable range of IEEE 754 binary64, it <bcp14>MUST</bcp14> encode that value as a string and define the lexical form. Monetary values <bcp14>SHOULD</bcp14> use decimal strings in profiles that require exact accounting; the numeric cost examples in this document are illustrative.</t>
      </section>
      <section anchor="common-members">
        <name>Common Members</name>
        <t>Except for Problem Details objects, AICP objects contain these common members:</t>
        <table anchor="common-member-table">
          <name>Common AICP Members</name>
          <thead><tr><th>Member</th><th>Requirement</th><th>Meaning</th></tr></thead>
          <tbody>
            <tr><td><tt>aicpVersion</tt></td><td>Required</td><td>The major.minor core version. This document defines <tt>0.1</tt>.</td></tr>
            <tr><td><tt>kind</tt></td><td>Required</td><td>The object class.</td></tr>
            <tr><td><tt>id</tt></td><td>Response objects</td><td>A provider-stable opaque identifier.</td></tr>
            <tr><td><tt>revision</tt></td><td>Mutable durable objects</td><td>An opaque value that changes on every semantically observable revision.</td></tr>
            <tr><td><tt>createdAt</tt></td><td>Durable response objects</td><td>Creation time.</td></tr>
            <tr><td><tt>updatedAt</tt></td><td>Optional</td><td>Time of the represented revision.</td></tr>
            <tr><td><tt>links</tt></td><td>As specified</td><td>A map from registered-by-this-document relation names to URI references.</td></tr>
            <tr><td><tt>extensions</tt></td><td>Optional</td><td>A map whose keys are absolute extension URIs.</td></tr>
            <tr><td><tt>criticalExtensions</tt></td><td>Optional</td><td>Extension URIs that must be understood for safe processing.</td></tr>
          </tbody>
        </table>
        <t>Identifiers are opaque. Clients <bcp14>MUST NOT</bcp14> infer type, ordering, time, tenancy, or authority from their syntax. Providers <bcp14>SHOULD</bcp14> generate identifiers with enough entropy to prevent enumeration.</t>
      </section>
      <section anchor="resource-reference">
        <name>Resource References</name>
        <t>A Resource Reference contains an absolute profile-defined <tt>type</tt> URI and provider-stable <tt>id</tt>. It can also contain <tt>scope</tt>, opaque <tt>revision</tt>, and non-authoritative <tt>displayName</tt>.</t>
        <t>The <tt>scope</tt> object narrows resolution with provider-defined string members such as account, project, tenant, region, namespace, or cluster. A provider <bcp14>MUST</bcp14> use the authenticated principal and scope together when resolving a reference and <bcp14>MUST NOT</bcp14> allow a display name to override the identifier.</t>
      </section>
      <section anchor="extension-processing">
        <name>Extension Processing</name>
        <t>Extension keys <bcp14>MUST</bcp14> be absolute URIs. A recipient <bcp14>MAY</bcp14> ignore an unrecognized extension unless its URI occurs in <tt>criticalExtensions</tt>. If a critical extension is unrecognized or unsupported, the recipient <bcp14>MUST</bcp14> reject the object with code <tt>unsupported-extension</tt> before causing a consequential effect.</t>
        <t>A provider <bcp14>MUST NOT</bcp14> change core semantics through a non-critical extension. An intermediary that preserves an object <bcp14>SHOULD</bcp14> preserve unrecognized extensions byte-for-byte where its representation permits.</t>
      </section>
      <section anchor="structured-over-prose">
        <name>Structured Semantics and Prose</name>
        <t>Human-readable titles, summaries, descriptions, and details are supplemental. A client <bcp14>MUST NOT</bcp14> treat prose as authorization, executable instructions, a replacement for a stable code, or a reason to violate a structured constraint. Providers <bcp14>MUST</bcp14> represent safety-relevant state in normative structured members.</t>
        <t>Neither clients nor providers are required to expose private chain-of-thought. Concise rationale, assumptions, evidence references, and policy reason codes are sufficient.</t>
      </section>
    </section>

    <section anchor="discovery">
      <name>Discovery and Capabilities</name>
      <section anchor="service-discovery">
        <name>Service Discovery</name>
        <t>An AICP HTTP provider <bcp14>MUST</bcp14> publish a Discovery object at <tt>/.well-known/aicp</tt>, as specified in <xref target="http-binding"/>. It lists supported core versions, profile URIs, authentication metadata, and links to the capability and request endpoints.</t>
        <t>Discovery only identifies a service and protocol surfaces. It is not a global provider directory and does not imply that every advertised profile or endpoint is authorized for the current principal.</t>
      </section>
      <section anchor="capability-doc">
        <name>Capability Document</name>
        <t>A Capability Document <bcp14>MUST</bcp14> contain a revision, supported profiles, an action list, and relevant protocol limits. Each Action Descriptor <bcp14>MUST</bcp14> contain:</t>
        <ul spacing="normal">
          <li>a stable absolute action URI, title, and concise description;</li>
          <li>one or more target type URIs;</li>
          <li>an input schema URI and, when applicable, an output schema URI;</li>
          <li>an effect class of <tt>read-only</tt> or <tt>consequential</tt>;</li>
          <li>whether planning is unsupported, optional, or required;</li>
          <li>whether idempotency is unsupported, request-id based, or inherent;</li>
          <li>whether reversibility is always, conditional, never, or unknown;</li>
          <li>a default risk level;</li>
          <li>permissions names sufficient for user explanation but not usable as proof of authority;</li>
          <li>observation types usable to verify the action; and</li>
          <li>applicable size, rate, retention, cost, or execution limits.</li>
        </ul>
        <t>The schemas <bcp14>MUST</bcp14> be retrievable by an authorized client and <bcp14>SHOULD</bcp14> use JSON Schema 2020-12 <xref target="JSON-SCHEMA"/>. The profile specification remains authoritative when schema validation alone cannot express a semantic requirement.</t>
        <t>A consequential action <bcp14>MUST</bcp14> advertise planning as <tt>required</tt>. A read-only action can advertise planning as optional or unsupported. Submitting preview for an action whose planning is unsupported fails with <tt>planning-unsupported</tt>; submitting it in execute-if-ready mode can create a read-only Operation.</t>
      </section>
      <section anchor="principal-capabilities">
        <name>Principal Scoping and Freshness</name>
        <t>A capability response <bcp14>MAY</bcp14> be scoped to the authenticated principal. If so, <tt>principalScoped</tt> is true, HTTP caching is private, and the provider <bcp14>MUST</bcp14> ensure that a response for one principal cannot be reused for another. A capability listing indicates discoverability, not a durable authorization grant; policy is evaluated again when planning and immediately before execution.</t>
        <t>Capability documents <bcp14>MUST</bcp14> have an opaque revision. Providers <bcp14>SHOULD</bcp14> support conditional retrieval so that clients can cache schemas and avoid repeated context transfer.</t>
      </section>
    </section>

    <section anchor="situations">
      <name>Situation Acquisition</name>
      <section anchor="situation-request">
        <name>Situation Request</name>
        <t>A Situation Request identifies one or more targets, a purpose, a view, optional categories to include, freshness requirements, and response budgets. The defined views are:</t>
        <dl newline="true" spacing="normal">
          <dt><tt>decision</tt></dt>
          <dd>The smallest representation the provider considers sufficient for choosing or evaluating an action for the stated purpose.</dd>
          <dt><tt>summary</tt></dt>
          <dd>A compact operational representation including principal resources, health, relationships, constraints, and active operations.</dd>
          <dt><tt>full</tt></dt>
          <dd>The most complete representation the provider is willing and authorized to disclose, still subject to explicit budgets and pagination.</dd>
        </dl>
        <t>A client <bcp14>SHOULD</bcp14> request <tt>decision</tt> first and expand selectively. A provider <bcp14>MAY</bcp14> return less detail for policy, privacy, size, or availability reasons, but it <bcp14>MUST</bcp14> disclose omissions in coverage metadata unless disclosing the existence of omitted data would itself violate policy.</t>
        <t>The optional <tt>budget</tt> can bound bytes and items. A provider <bcp14>MUST NOT</bcp14> exceed a hard client budget merely to make the response appear complete. It instead returns a cursor, truncation flag, and omissions.</t>
      </section>
      <section anchor="situation-response">
        <name>Situation Representation</name>
        <t>A Situation contains a provider-stable identifier and revision, observation and freshness times, coverage, resources, relationships, active Operations, applicable constraints, and available action URIs.</t>
        <t>Every resource observation <bcp14>MUST</bcp14> identify its observation time and health as healthy, degraded, unhealthy, or unknown. Profile-defined state can be included inline or by link. Secrets and credential values <bcp14>MUST NOT</bcp14> be included; references and redaction metadata are used instead.</t>
        <t>Coverage contains the delivered view, <tt>complete</tt>, <tt>truncated</tt>, explicit omissions, and an optional next cursor. The absence of a resource from an incomplete or truncated Situation <bcp14>MUST NOT</bcp14> be interpreted as proof that the resource does not exist.</t>
      </section>
      <section anchor="situation-consistency">
        <name>Consistency and Use</name>
        <t>A Situation is an observation, not a transaction snapshot unless a profile explicitly guarantees that property. Different resource observations can have different timestamps. Providers <bcp14>SHOULD</bcp14> minimize skew and disclose material skew as an omission or unknown.</t>
        <t>When an Intent Request cites a Situation identifier and revision, the provider <bcp14>MUST</bcp14> disclose in the Plan whether it reused, refreshed, or could not validate that Situation. Execution still requires current precondition evaluation.</t>
      </section>
    </section>

    <section anchor="intents">
      <name>Intent Requests</name>
      <section anchor="intent-members">
        <name>Required Semantics</name>
        <t>An Intent Request contains:</t>
        <ul spacing="normal">
          <li>a caller-generated <tt>requestId</tt> used for deduplication;</li>
          <li>an advertised action URI;</li>
          <li>one or more Resource References;</li>
          <li>arguments that validate against the action's input schema;</li>
          <li>hard constraints;</li>
          <li>success criteria;</li>
          <li>an optional cited Situation identifier and revision;</li>
          <li>a mode of <tt>preview</tt> or <tt>execute-if-ready</tt>;</li>
          <li>an optional human-readable purpose; and</li>
          <li>an optional reference to externally verified delegation.</li>
        </ul>
        <t>The provider <bcp14>MUST</bcp14> validate the action, targets, arguments, constraints, and profile before planning. Unknown, ambiguous, or contradictory requirements produce a Problem or a Plan whose feasibility is conditional, infeasible, or unknown. The provider <bcp14>MUST NOT</bcp14> silently relax a hard constraint.</t>
      </section>
      <section anchor="constraints">
        <name>Constraints</name>
        <t>Core constraints can restrict allowed scopes, time, cost, impact, and applicable policy references. Impact can include maximum changed resources, maximum unavailable resources, and prohibitions on data loss or downtime. Profiles can add a <tt>profile</tt> constraint object with semantics defined by the profile.</t>
        <t>A plan <bcp14>MUST</bcp14> echo the effective hard constraints. If policy adds a more restrictive constraint, the Plan includes it and explains its origin. If a requested constraint cannot be measured or enforced, feasibility is <tt>unknown</tt> or <tt>infeasible</tt>; it is not assumed satisfied.</t>
      </section>
      <section anchor="success-criteria">
        <name>Success Criteria</name>
        <t>A success criterion has an identifier, profile-defined type URI, optional subject, required flag, parameters, and optional observation window. The profile defines how it is measured and the evidence needed to evaluate it.</t>
        <t>Required criteria that cannot be evaluated cause the final Outcome to be failed or indeterminate as defined by the profile. An operation is not successful merely because provider API calls returned success; the required outcome criteria must be evaluated.</t>
      </section>
      <section anchor="intent-example">
        <name>Intent Example</name>
        <sourcecode type="json"><![CDATA[
{
  "aicpVersion": "0.1",
  "kind": "IntentRequest",
  "requestId": "req-7f2c",
  "action": "https://example.com/aicp/actions/workload.deploy",
  "targets": [{
    "type": "https://example.com/aicp/types/workload",
    "id": "signal",
    "scope": {"project": "production", "region": "jnb1"}
  }],
  "arguments": {"release": "sha256:9c9f0d4a", "replicas": 3},
  "constraints": {
    "impact": {"maxUnavailable": 1, "forbidDataLoss": true},
    "cost": {"currency": "USD", "maxIncrement": 15}
  },
  "successCriteria": [{
    "id": "health",
    "type": "https://example.com/aicp/criteria/healthy-replicas",
    "required": true,
    "parameters": {"operator": "equals", "value": 3},
    "windowSeconds": 300
  }],
  "mode": "preview"
}
]]></sourcecode>
      </section>
    </section>

    <section anchor="plans">
      <name>Plans and Authorization</name>
      <section anchor="plan-purpose">
        <name>Plan Purpose and Immutability</name>
        <t>A Plan is the reviewable boundary between desired outcome and infrastructure mutation. It describes what the provider proposes to do, the state on which that proposal depends, and whether the proposal is feasible and authorized.</t>
        <t>Each Plan has an opaque <tt>revision</tt> and <tt>expiresAt</tt>. A provider <bcp14>MUST</bcp14> change the revision whenever any execution-relevant member changes, including changes, steps, constraints, preconditions, risk, authorization, approval requirements, assumptions, unknowns, estimates, or success criteria. A Plan revision is immutable once referenced by an execution attempt or approval. Later evaluation creates a new revision and preserves the older audit record.</t>
      </section>
      <section anchor="plan-basis">
        <name>Basis, Changes, and Steps</name>
        <t>The <tt>basedOn</tt> object records the Situation identifier and revision when one was used, plus the observation time of the state used for planning. A Plan <bcp14>MUST</bcp14> include all known material changes in <tt>changes</tt>. A change identifies the operation, resource, optional before and after representations, optional JSON Patch <xref target="RFC6902"/>, a materiality flag, and a concise effect.</t>
        <t>The <tt>steps</tt> array describes execution order and dependencies. Steps are operationally informative; the complete material effect remains authoritative in <tt>changes</tt>. A provider <bcp14>MUST NOT</bcp14> omit a material effect merely because it occurs in an internal or provider-native sub-operation. If a precise effect cannot be known before execution, the provider includes an unknown and a worst-case risk factor.</t>
        <t>Providers <bcp14>SHOULD</bcp14> minimize incidental implementation detail. The Plan should be sufficiently precise to support authorization, comparison, and recovery without requiring the client to understand every provider-internal call.</t>
      </section>
      <section anchor="feasibility-auth-readiness">
        <name>Feasibility, Authorization, and Readiness</name>
        <t>Feasibility and authorization are independent:</t>
        <table anchor="decision-state-table">
          <name>Plan Decision States</name>
          <thead><tr><th>Dimension</th><th>States</th><th>Meaning</th></tr></thead>
          <tbody>
            <tr><td>Feasibility</td><td><tt>feasible</tt>, <tt>conditional</tt>, <tt>infeasible</tt>, <tt>unknown</tt></td><td>Whether the provider can satisfy the intent and hard constraints.</td></tr>
            <tr><td>Authorization</td><td><tt>allowed</tt>, <tt>denied</tt>, <tt>approval-required</tt>, <tt>clarification-required</tt>, <tt>unknown</tt></td><td>Whether the authenticated principal can execute this exact plan revision now.</td></tr>
            <tr><td>Readiness</td><td><tt>ready</tt>, <tt>blocked</tt>, <tt>expired</tt>, <tt>unknown</tt></td><td>The provider's combined answer about whether execution can safely be requested now.</td></tr>
          </tbody>
        </table>
        <t>The Plan's <tt>readiness</tt> object contains its state, evaluation time, and structured reasons. A Plan is ready only while unexpired, feasible, authorized as allowed, free of unmet approval requirements, and valid against all checked preconditions. The explicit value prevents each client from reconstructing a subtly different answer. Readiness is a point-in-time advisory and <bcp14>MUST</bcp14> be re-evaluated immediately before the first consequential effect.</t>
        <t>Authorization contains an evaluation time, structured reasons, approval requirements, and explanatory permission names. Explanatory permission names are not bearer capabilities and <bcp14>MUST NOT</bcp14> be accepted as proof of authority.</t>
      </section>
      <section anchor="approvals">
        <name>Approval Binding</name>
        <t>An Approval Requirement identifies a requirement type, audience, concise summary of the material action, expiry, and optional approval endpoint. The external approval mechanism is out of scope.</t>
        <t>An accepted approval <bcp14>MUST</bcp14> be cryptographically or transactionally bound by the provider to the Plan identifier and exact revision, approving principal, intended action, material changes, and expiry. If any of those change, the approval <bcp14>MUST NOT</bcp14> authorize the new revision. Approval of prose alone is insufficient.</t>
        <t>Providers <bcp14>SHOULD</bcp14> present the approver with the same material change, risk, blast radius, constraints, assumptions, unknowns, and expiry visible to the executing client. Approval interfaces <bcp14>MUST</bcp14> defend against substitution and approval-phishing attacks discussed in <xref target="security"/>.</t>
      </section>
      <section anchor="risk">
        <name>Risk and Blast Radius</name>
        <t>Risk has a level of none, low, medium, high, critical, or unknown; structured factors; and an estimated blast radius. Blast radius can count affected resources, tenants, and regions and includes a concise worst-case description.</t>
        <t>Risk is a provider and policy assessment, not a universal numerical truth. A provider <bcp14>MUST</bcp14> return <tt>unknown</tt> when it lacks sufficient information. A client <bcp14>MUST NOT</bcp14> treat a low value from an untrusted provider as authorization. Profiles <bcp14>SHOULD</bcp14> define minimum factors and consistent level guidance for comparable actions.</t>
      </section>
      <section anchor="plan-uncertainty">
        <name>Preconditions, Assumptions, and Unknowns</name>
        <t>Preconditions are facts that must hold for safe execution. Assumptions are facts the provider currently relies on but cannot guarantee. Unknowns are relevant decision inputs that the provider could not determine. Each is a structured Reason with a stable code and summary and can carry details and evidence links.</t>
        <t>A provider <bcp14>MUST</bcp14> verify enforceable preconditions immediately before execution. A material assumption becoming false or an unknown becoming unsafe causes the Operation to pause, fail, or enter compensation according to policy. The provider <bcp14>MUST NOT</bcp14> silently proceed by weakening a hard constraint.</t>
      </section>
      <section anchor="plan-next-actions">
        <name>Structured Next Actions</name>
        <t>A Plan includes <tt>nextActions</tt> selected from execute, wait, replan, approve, clarify, escalate, inspect, or stop, each with a reason, a safety indication, optional endpoint, and parameters. These are recommendations under current state, not new authority. The client still applies its policy and the provider re-evaluates authorization.</t>
      </section>
    </section>

    <section anchor="execution">
      <name>Execution and Operation Lifecycle</name>
      <section anchor="execution-request">
        <name>Execution Request</name>
        <t>An Execution Request contains a caller-generated request identifier, Plan identifier, exact Plan revision, and zero or more external approval references. The provider <bcp14>MUST</bcp14> reject execution when the Plan is missing, expired, stale, infeasible, denied, or outside a hard constraint. When a valid Plan lacks a required approval, the provider <bcp14>MUST NOT</bcp14> begin a consequential effect. It <bcp14>MAY</bcp14> create an Operation in <tt>awaiting-approval</tt> if its approval mechanism supports durable pending requests; otherwise it rejects the request with <tt>approval-required</tt>.</t>
        <t>Execution is a new authorization decision. A previously allowed Plan does not override revocation, changed principal status, emergency stop, quota, or policy changes. When rejection follows a material plan change, the provider returns or links a new Plan rather than silently executing it.</t>
      </section>
      <section anchor="operation-resource">
        <name>Operation Resource</name>
        <t>A provider <bcp14>MUST</bcp14> create or return a durable Operation before or atomically with accepting a consequential execution. The Operation identifies the Execution Request, Plan identifier and revision, current phase, effect state, monotonic sequence, progress, reasons, retry guidance, and structured next actions.</t>
        <t>The operation representation is the source of truth. Event delivery can be delayed, duplicated, or interrupted; a client can always retrieve the latest authorized representation while it is retained.</t>
      </section>
      <section anchor="operation-phases">
        <name>Phases</name>
        <table anchor="operation-phase-table">
          <name>Operation Phases</name>
          <thead><tr><th>Phase</th><th>Terminal</th><th>Meaning</th></tr></thead>
          <tbody>
            <tr><td><tt>queued</tt></td><td>No</td><td>Accepted but no consequential step is known to have started.</td></tr>
            <tr><td><tt>awaiting-approval</tt></td><td>No</td><td>Execution is blocked on a bound approval.</td></tr>
            <tr><td><tt>executing</tt></td><td>No</td><td>One or more planned steps can be producing effects.</td></tr>
            <tr><td><tt>verifying</tt></td><td>No</td><td>Planned mutation steps ended and success criteria are being evaluated.</td></tr>
            <tr><td><tt>paused</tt></td><td>No</td><td>Progress stopped for a stated, recoverable reason.</td></tr>
            <tr><td><tt>succeeded</tt></td><td>Yes</td><td>Required criteria were satisfied and effects are sufficiently determined.</td></tr>
            <tr><td><tt>failed</tt></td><td>Yes</td><td>The operation did not satisfy required criteria and effect state is sufficiently known.</td></tr>
            <tr><td><tt>cancelled</tt></td><td>Yes</td><td>Cancellation completed; the effect state states what remains.</td></tr>
            <tr><td><tt>indeterminate</tt></td><td>Yes</td><td>The provider cannot safely determine whether or to what extent effects occurred.</td></tr>
          </tbody>
        </table>
        <t>A provider can omit an intermediate phase but <bcp14>MUST NOT</bcp14> imply a phase that did not occur. Before a confirmed effect, <tt>queued</tt>, <tt>awaiting-approval</tt>, and <tt>paused</tt> can transition among policy-permitted non-terminal states or a terminal state. After effect begins, <tt>executing</tt> and <tt>verifying</tt> can alternate only when the exact Plan already authorizes the additional execution. A terminal phase <bcp14>MUST NOT</bcp14> be changed in place. Later discoveries are recorded in a new reconciliation Operation and a new Outcome revision linked to the original record.</t>
      </section>
      <section anchor="effect-state">
        <name>Effect State</name>
        <table anchor="effect-state-table">
          <name>Effect States</name>
          <thead><tr><th>State</th><th>Meaning</th><th>Blind retry</th></tr></thead>
          <tbody>
            <tr><td><tt>none</tt></td><td>No externally consequential effect occurred.</td><td>Permitted only when retry guidance also says safe.</td></tr>
            <tr><td><tt>possible</tt></td><td>An effect may have begun, but none is confirmed.</td><td>Forbidden.</td></tr>
            <tr><td><tt>partial</tt></td><td>Some effects are confirmed and the full plan is incomplete.</td><td>Forbidden.</td></tr>
            <tr><td><tt>complete</tt></td><td>All planned material effects are confirmed; success criteria can still fail.</td><td>Normally unnecessary and forbidden.</td></tr>
            <tr><td><tt>reversed</tt></td><td>Defined compensating effects are confirmed; exact prior state is not implied.</td><td>Forbidden unless a new plan says otherwise.</td></tr>
            <tr><td><tt>unknown</tt></td><td>The provider cannot bound or classify the actual effect.</td><td>Forbidden.</td></tr>
          </tbody>
        </table>
        <t>Phase and effect state are independent. A failed or cancelled operation can have partial effects. A successful operation has complete planned effects but can also report side effects. Providers <bcp14>MUST</bcp14> update effect state conservatively.</t>
      </section>
      <section anchor="progress">
        <name>Progress</name>
        <t>Progress identifies completed steps, active steps, total steps, and optionally a percentage. Step sets are authoritative; percentage is advisory and <bcp14>MUST NOT</bcp14> be interpreted as a probability of success or a safe cancellation boundary.</t>
      </section>
      <section anchor="operation-control">
        <name>Cancellation, Pause, and Resume</name>
        <t>Available controls are advertised through links and structured next actions. Cancellation is best effort. A cancellation request <bcp14>MUST</bcp14> be represented as its own idempotent control request. The provider <bcp14>MUST</bcp14> report the resulting terminal phase and effect state; it <bcp14>MUST NOT</bcp14> claim <tt>cancelled</tt> means that no effect occurred.</t>
        <t>A control request racing with completion returns the current Operation. Pause and resume semantics are profile-defined. Resumption <bcp14>MUST</bcp14> re-evaluate authority, constraints, and preconditions.</t>
      </section>
      <section anchor="operation-events">
        <name>Events</name>
        <t>Operation Events carry an event identifier, operation identifier, monotonically increasing per-operation sequence, event type, creation time, and event data. Delivery is at least once unless a binding or profile states stronger behavior. Clients <bcp14>MUST</bcp14> deduplicate by event identifier and sequence and <bcp14>MUST</bcp14> retrieve the current Operation after a detected sequence gap.</t>
        <t>Core event types are <tt>operation.phase-changed</tt>, <tt>operation.progress</tt>, <tt>operation.effect-changed</tt>, <tt>operation.problem</tt>, and <tt>operation.outcome</tt>. Profile-specific event types <bcp14>MUST</bcp14> be absolute URIs. Event data is a notification and <bcp14>MUST NOT</bcp14> cause a client to skip retrieval of an authorization- or safety-relevant current representation.</t>
        <t>A provider <bcp14>MAY</bcp14> encode events using CloudEvents <xref target="CLOUDEVENTS"/>. Such an encoding preserves the AICP operation identifier, sequence, and event type.</t>
      </section>
    </section>

    <section anchor="outcomes">
      <name>Outcomes, Verification, and Evidence</name>
      <section anchor="outcome-resource">
        <name>Outcome Resource</name>
        <t>Every terminal Operation <bcp14>MUST</bcp14> link to an Outcome. The Outcome contains the terminal status and effect state, expected changes from the Plan, observed changes, side effects, per-criterion results, evidence references, and structured next actions.</t>
        <t>The provider <bcp14>MUST</bcp14> distinguish an expected change from an observed change. It <bcp14>MUST NOT</bcp14> copy the Plan into <tt>observedChanges</tt> without observation. A side effect is any material observed effect not represented in the Plan's expected changes, including unexpected cost, exposure, dependency, or availability effects.</t>
      </section>
      <section anchor="criterion-results">
        <name>Criterion Results</name>
        <t>Each requested success criterion receives a result of satisfied, unsatisfied, unknown, or not-evaluated, together with an observation time when applicable, actual value, structured reasons, and evidence references.</t>
        <t>A required criterion that is unsatisfied causes status <tt>failed</tt>. Any compensation is a separate action. A required criterion whose state is unknown after the provider's defined verification period causes <tt>indeterminate</tt> unless the profile explicitly defines a safe, known failed state.</t>
      </section>
      <section anchor="evidence">
        <name>Evidence References</name>
        <t>An Evidence Reference identifies an evidence type URI and contains one or more of an authorized URI, digest, or concise summary. It can include subject, observation time, and freshness limit. Evidence can point to logs, metrics, traces, signed observations, attestations, policy decisions, or provider-native audit records.</t>
        <t>AICP does not define a signature or evidence verification protocol. Profiles <bcp14>SHOULD</bcp14> reuse applicable evidence work such as VIRP <xref target="VIRP"/> and EMILIA <xref target="EMILIA"/> and telemetry standards such as OpenTelemetry <xref target="OTEL"/>. Access to evidence <bcp14>MUST</bcp14> be independently authorized and <bcp14>MUST NOT</bcp14> be granted merely because a client can read an Outcome.</t>
      </section>
      <section anchor="compensation">
        <name>Compensation</name>
        <t>A compensating action is a new Intent, Plan, authorization decision, Operation, and Outcome. It links to the original Operation and describes which effects it intends to counter. A provider <bcp14>MUST NOT</bcp14> mutate the original history to make compensation appear to be an atomic rollback.</t>
        <t>The original action's reversibility descriptor is only a planning hint. Current state, authorization, and risk are evaluated again. If full restoration is impossible, the compensation Plan declares residual effects and unknowns.</t>
      </section>
    </section>

    <section anchor="problems">
      <name>Problems and Recovery Semantics</name>
      <section anchor="problem-details">
        <name>Problem Representation</name>
        <t>HTTP errors use Problem Details for HTTP APIs <xref target="RFC9457"/> with media type <tt>application/problem+json</tt>. An AICP Problem adds:</t>
        <ul spacing="normal">
          <li><tt>aicpVersion</tt> and a stable <tt>code</tt>;</li>
          <li>the relevant <tt>requestId</tt> and optional Operation link;</li>
          <li><tt>effectState</tt>;</li>
          <li><tt>retry.safe</tt>, optional delay, and <tt>requiresReconciliation</tt>;</li>
          <li>structured constraint or field violations;</li>
          <li>safe alternatives and remediations; and</li>
          <li>links to current Plans, Operations, Situations, or capability documents.</li>
        </ul>
        <t>The human-readable <tt>detail</tt> member is not authoritative. A client bases retry and recovery decisions on stable code, effect state, retry fields, and current operation state.</t>
      </section>
      <section anchor="core-problem-codes">
        <name>Core Problem Codes</name>
        <table anchor="problem-code-table">
          <name>Initial AICP Problem Codes</name>
          <thead><tr><th>Code</th><th>Typical HTTP status</th><th>Required behavior</th></tr></thead>
          <tbody>
            <tr><td><tt>invalid-request</tt></td><td>400</td><td>Return field or semantic violations; no effect.</td></tr>
            <tr><td><tt>unsupported-version</tt></td><td>400</td><td>Link supported versions; no effect.</td></tr>
            <tr><td><tt>unsupported-profile</tt></td><td>400</td><td>Link supported profiles; no effect.</td></tr>
            <tr><td><tt>unsupported-action</tt></td><td>400 or 404</td><td>Disclose alternatives only when authorized.</td></tr>
            <tr><td><tt>unsupported-extension</tt></td><td>400</td><td>Identify unsupported critical URIs; no effect.</td></tr>
            <tr><td><tt>planning-unsupported</tt></td><td>409</td><td>Use an allowed direct mode or another advertised action; no effect.</td></tr>
            <tr><td><tt>authorization-denied</tt></td><td>403</td><td>Do not disclose protected policy or target existence.</td></tr>
            <tr><td><tt>approval-required</tt></td><td>403 or 409</td><td>Link exact Plan and requirements; no effect.</td></tr>
            <tr><td><tt>plan-stale</tt></td><td>412</td><td>Do not execute; link or create a new Plan.</td></tr>
            <tr><td><tt>plan-expired</tt></td><td>409</td><td>Do not execute; replan.</td></tr>
            <tr><td><tt>precondition-failed</tt></td><td>412</td><td>Do not begin new effect; disclose failed preconditions.</td></tr>
            <tr><td><tt>constraint-unsatisfied</tt></td><td>409 or 422</td><td>Do not silently relax; offer authorized alternatives.</td></tr>
            <tr><td><tt>capacity-unavailable</tt></td><td>409 or 503</td><td>Return delay and alternatives when known.</td></tr>
            <tr><td><tt>request-id-reuse</tt></td><td>409</td><td>Same request identifier was used with different semantics.</td></tr>
            <tr><td><tt>rate-limited</tt></td><td>429</td><td>Return retry delay and preserve accepted operation state.</td></tr>
            <tr><td><tt>operation-not-cancellable</tt></td><td>409</td><td>Return current operation and effect state.</td></tr>
            <tr><td><tt>effect-indeterminate</tt></td><td>500 or 503</td><td>Blind retry is unsafe; link reconciliation.</td></tr>
            <tr><td><tt>reconciliation-required</tt></td><td>409</td><td>Caller must observe actual state before another mutation.</td></tr>
          </tbody>
        </table>
        <t>HTTP status codes remain transport-level classifications; the AICP code supplies stable domain behavior. Providers <bcp14>MAY</bcp14> define profile-specific codes using absolute problem type URIs and names that do not collide with core codes.</t>
      </section>
      <section anchor="recovery-actions">
        <name>Recovery Actions</name>
        <t>Next actions and remediations use the controlled action values execute, wait, replan, approve, clarify, cancel, reconcile, compensate, escalate, stop, and inspect. Each item states whether following the recommendation is non-consequential under current state. A <tt>safe</tt> value does not grant permission and can become stale.</t>
        <t>When retry is unsafe, <tt>retry.safe</tt> is false. If reconciliation is required, the provider <bcp14>MUST</bcp14> link or describe a reconciliation action and <bcp14>MUST NOT</bcp14> recommend a repeat of the original consequential request until actual effect state is sufficiently known.</t>
      </section>
    </section>

    <section anchor="reliability">
      <name>Idempotency, Concurrency, and Reconciliation</name>
      <section anchor="request-deduplication">
        <name>Request Deduplication</name>
        <t>Every mutation request contains a caller-generated <tt>requestId</tt>. During its advertised retention interval, a provider scopes this identifier to the authenticated principal, service, request kind, and action. Repeating the identifier with semantically identical input <bcp14>MUST</bcp14> return the same Plan, Operation, control result, or terminal record rather than start another consequential effect.</t>
        <t>Reusing the identifier with semantically different input <bcp14>MUST</bcp14> fail with <tt>request-id-reuse</tt>. Providers <bcp14>MUST</bcp14> compare a normalized internal representation sufficient to detect a material difference; this document does not standardize a cross-provider canonical JSON digest.</t>
        <t>The capability document <bcp14>MUST</bcp14> advertise request identifier retention. A client <bcp14>MUST NOT</bcp14> assume deduplication after that interval and <bcp14>SHOULD</bcp14> retrieve the prior Operation before taking another consequential action.</t>
      </section>
      <section anchor="optimistic-concurrency">
        <name>Optimistic Concurrency</name>
        <t>Plans bind to observed resource revisions and preconditions. HTTP representations use entity tags and conditional requests as specified in <xref target="http-binding"/>. A provider <bcp14>MUST</bcp14> reject execution if a material target revision or precondition changed unless the Plan explicitly described and authorized that variance.</t>
        <t>A provider <bcp14>MUST NOT</bcp14> recompute a stale Plan and execute the new result under the old approval. It can return a new Plan for review.</t>
      </section>
      <section anchor="no-exactly-once">
        <name>No Exactly-Once Assumption</name>
        <t>AICP does not guarantee exactly-once external effects. Native provider calls, network failures, failover, and partial execution can make an accepted request's effects uncertain. Idempotency prevents many duplicates but does not prove that an external effect did or did not occur.</t>
        <t>If the provider cannot safely determine the effect, the Operation reaches <tt>indeterminate</tt> with effect state <tt>possible</tt>, <tt>partial</tt>, or <tt>unknown</tt>. The client <bcp14>MUST NOT</bcp14> blindly retry and <bcp14>MUST</bcp14> use the advertised reconciliation path or escalate.</t>
      </section>
      <section anchor="reconciliation-procedure">
        <name>Reconciliation Procedure</name>
        <t>A reconciliation action observes authoritative native state and compares it to the Plan's expected changes and the latest known effects. It produces a new Operation and Outcome linked to the indeterminate Operation. It can classify effects as none, partial, complete, reversed, or still unknown and can propose a new completion or compensation Plan.</t>
        <t>Reconciliation is observation-oriented. If it must mutate state, that mutation is represented as a separate consequential Plan and Operation.</t>
      </section>
    </section>

    <section anchor="http-binding">
      <name>HTTP Binding</name>
      <section anchor="http-general">
        <name>General Requirements</name>
        <t>The AICP HTTP binding uses HTTP semantics from <xref target="RFC9110"/>, encrypted transport, JSON representations, conditional requests, and link-driven endpoints. An implementation <bcp14>MUST</bcp14> support HTTP/1.1 or later and <bcp14>MUST</bcp14> use TLS 1.2 or later; TLS 1.3 <xref target="RFC8446"/> is <bcp14>RECOMMENDED</bcp14>.</t>
        <t>AICP success representations use media type <tt>application/aicp+json</tt>. Problems use <tt>application/problem+json</tt>. Clients send <tt>Accept</tt> and <tt>Content-Type</tt> accordingly. Servers <bcp14>MUST</bcp14> reject an unsupported content type without interpreting it as an AICP mutation.</t>
        <t>Authentication and token acquisition are outside scope. HTTP providers <bcp14>SHOULD</bcp14> publish OAuth 2.0 Protected Resource Metadata <xref target="RFC9728"/> when OAuth is used. Authorization requests can use Rich Authorization Requests <xref target="RFC9396"/> or another policy mechanism. Bearer and proof-of-possession credentials <bcp14>MUST NOT</bcp14> appear inside AICP JSON objects.</t>
      </section>
      <section anchor="well-known">
        <name>Well-Known Discovery</name>
        <t>The path <tt>/.well-known/aicp</tt> is formed according to <xref target="RFC8615"/>. A successful <tt>GET</tt> returns a Discovery object. The object contains at least:</t>
        <sourcecode type="json"><![CDATA[
{
  "aicpVersion": "0.1",
  "kind": "Discovery",
  "service": "Example Infrastructure Control",
  "versions": ["0.1"],
  "profiles": ["https://example.com/aicp/profiles/workload/0.1"],
  "auth": {
    "protectedResourceMetadata":
      "https://c.example/.well-known/oauth-protected-resource"
  },
  "links": {
    "capabilities": "https://control.example.com/aicp/capabilities",
    "situations": "https://control.example.com/aicp/situations",
    "intents": "https://control.example.com/aicp/intents"
  }
}
]]></sourcecode>
        <t>The origin of an absolute link is authoritative for that endpoint. A client <bcp14>MUST NOT</bcp14> forward credentials to a different origin unless its authentication policy explicitly authorizes that origin. Redirect handling follows the credential and redirection security requirements of HTTP and the authentication scheme.</t>
      </section>
      <section anchor="http-resources">
        <name>Resource Interaction Pattern</name>
        <t>Endpoint paths other than the well-known URI are discovered from <tt>links</tt>; their literal spelling is not normative. The following interaction pattern is normative:</t>
        <table anchor="http-pattern-table">
          <name>HTTP Interaction Pattern</name>
          <thead><tr><th>Interaction</th><th>Method</th><th>Request</th><th>Response</th></tr></thead>
          <tbody>
            <tr><td>Discover service</td><td>GET</td><td>None</td><td>Discovery</td></tr>
            <tr><td>List capabilities</td><td>GET</td><td>Conditional headers optional</td><td>Capability Document</td></tr>
            <tr><td>Acquire situation</td><td>POST</td><td>Situation Request</td><td>Situation</td></tr>
            <tr><td>Submit intent</td><td>POST</td><td>Intent Request</td><td>Plan or Operation</td></tr>
            <tr><td>Retrieve plan</td><td>GET</td><td>Conditional headers optional</td><td>Plan</td></tr>
            <tr><td>Execute plan</td><td>POST</td><td>Execution Request and <tt>If-Match</tt></td><td>Operation</td></tr>
            <tr><td>Retrieve operation</td><td>GET</td><td>Conditional headers or wait preference optional</td><td>Operation</td></tr>
            <tr><td>Control operation</td><td>POST</td><td>Profile-defined control request with request ID</td><td>Operation</td></tr>
            <tr><td>Retrieve events</td><td>GET</td><td>Cursor and wait preference optional</td><td>Event collection or stream</td></tr>
            <tr><td>Retrieve outcome</td><td>GET</td><td>Conditional headers optional</td><td>Outcome</td></tr>
          </tbody>
        </table>
        <t>A created Plan or Operation is returned with <tt>Location</tt> pointing to its durable resource. A provider <bcp14>MUST</bcp14> return the same resource location for a deduplicated request.</t>
      </section>
      <section anchor="http-status">
        <name>Status Codes</name>
        <t>A synchronous retrieval or completed non-mutating request normally returns 200. Creation of a durable Plan can return 200 or 201. Acceptance of asynchronous execution returns 202 with an Operation and <tt>Location</tt>. A provider <bcp14>MUST NOT</bcp14> use 202 without a retrievable operation status.</t>
        <t>Conditional failure uses 304 for retrieval, 409 for domain conflict or expired state, and 412 for a failed HTTP or plan precondition. Authentication uses 401; authorization denial uses 403; disclosure-sensitive implementations can use 404 where required to conceal target existence. A missing required condition uses 428 and rate limiting uses 429 as defined by <xref target="RFC6585"/>. Service unavailability uses 503 with appropriate retry metadata. Semantic errors include a Problem object even when the HTTP status is sufficient for a generic client.</t>
      </section>
      <section anchor="etags">
        <name>Entity Tags and Conditional Execution</name>
        <t>Providers <bcp14>MUST</bcp14> return a strong entity tag for each Plan revision and <bcp14>SHOULD</bcp14> return entity tags for Discovery, Capability Document, Situation, Operation, and Outcome representations. The opaque AICP <tt>revision</tt> and HTTP <tt>ETag</tt> can have different syntax but identify the same semantically observable revision.</t>
        <t>An explicit Plan execution request <bcp14>MUST</bcp14> contain <tt>planRevision</tt> and <bcp14>MUST</bcp14> use <tt>If-Match</tt> with the Plan's current strong entity tag. A missing <tt>If-Match</tt> returns 428 when the server requires a condition; a mismatch returns 412 with code <tt>plan-stale</tt>. A provider <bcp14>MUST NOT</bcp14> execute a newer Plan under an older entity tag or approval.</t>
      </section>
      <section anchor="http-prefer">
        <name>Asynchronous Preference and Waiting</name>
        <t>Clients can use the <tt>Prefer</tt> header from <xref target="RFC7240"/>. <tt>respond-async</tt> asks the server not to wait for completion. <tt>wait=N</tt> on an Operation or event retrieval asks the server to wait up to N seconds for a newer revision. The server can decline either preference and reports applied preferences with <tt>Preference-Applied</tt>.</t>
        <t>Long polling and streaming are optional. A provider supporting event streaming <bcp14>MUST</bcp14> also support ordinary retrieval of the current Operation. Cursors are opaque, scoped to the principal and collection, and <bcp14>MUST NOT</bcp14> be treated as credentials.</t>
      </section>
      <section anchor="http-caching">
        <name>Caching and Bounded Transfer</name>
        <t>Discovery, public profile schemas, and non-sensitive capabilities <bcp14>SHOULD</bcp14> use explicit cache controls. Principal-scoped representations use <tt>Cache-Control: private</tt> or <tt>no-store</tt> as appropriate and ensure authorization state is not shared across principals.</t>
        <t>A Situation response respects the caller's item and byte budgets. HTTP compression <bcp14>SHOULD</bcp14> be supported. Providers <bcp14>SHOULD</bcp14> offer conditional retrieval and event deltas so that a client does not repeatedly transfer unchanged full state.</t>
      </section>
      <section anchor="http-tracing">
        <name>Correlation and Telemetry</name>
        <t>A provider <bcp14>SHOULD</bcp14> accept standard trace-context propagation and link authorized trace, metric, log, and audit evidence from the resulting Operation. AICP request identifiers are for deduplication and audit correlation; they are not a substitute for distributed tracing identifiers.</t>
      </section>
    </section>

    <section anchor="other-bindings">
      <name>Relationship to Agent Protocols</name>
      <section anchor="mcp-binding">
        <name>Model Context Protocol</name>
        <t>MCP <xref target="MCP"/> standardizes how an AI application discovers and invokes tools and accesses resources. An MCP server can expose AICP without defining one tool for every provider action. A recommended minimal tool surface is:</t>
        <ul spacing="normal">
          <li><tt>aicp.discover</tt> - retrieve Discovery and principal-scoped capabilities;</li>
          <li><tt>aicp.situation</tt> - submit a Situation Request;</li>
          <li><tt>aicp.plan</tt> - submit an Intent Request in preview or execute-if-ready mode;</li>
          <li><tt>aicp.execute</tt> - execute an exact Plan revision;</li>
          <li><tt>aicp.observe</tt> - retrieve an Operation, Outcome, or events; and</li>
          <li><tt>aicp.control</tt> - request cancellation, pause, resume, reconciliation, or another advertised control.</li>
        </ul>
        <t>Action URIs and profile schemas travel as data. This fixed surface reduces tool-list size, selection ambiguity, and adapter churn. An implementation can expose more specialized tools, but they <bcp14>MUST</bcp14> preserve the same Plan, policy, Operation, error, and audit semantics to claim AICP conformance.</t>
        <t>An MCP adapter <bcp14>MUST NOT</bcp14> bypass the authorization path used by the HTTP binding. MCP task facilities can represent long-running delivery, but the AICP Operation remains the authoritative infrastructure effect record.</t>
      </section>
      <section anchor="a2a-relationship">
        <name>Agent2Agent Protocol</name>
        <t>A2A <xref target="A2A"/> can delegate infrastructure work to another agent or carry AICP objects as artifacts. An A2A task describes inter-agent work and conversation; an AICP Operation describes infrastructure execution and effects. Implementations <bcp14>SHOULD</bcp14> link the two identifiers without collapsing their state machines.</t>
      </section>
      <section anchor="aep-relationship">
        <name>Agent Execution Protocol</name>
        <t>The Agent Execution Protocol (AEP) <xref target="AEP"/> describes a governed reasoning-loop boundary. An AEP ACT transition can invoke an AICP request, and an AICP Situation, Operation, or Outcome can be an input to SENSE or OBSERVE. AICP does not standardize the internal reasoning loop or replace its governing enforcement component.</t>
      </section>
    </section>

    <section anchor="ergonomics">
      <name>Agent Ergonomics and Resource Efficiency</name>
      <section anchor="bounded-context">
        <name>Progressive Disclosure</name>
        <t>Clients <bcp14>SHOULD</bcp14> begin with cached capabilities and a decision Situation. Providers <bcp14>SHOULD</bcp14> order decision views by operational relevance rather than provider database layout. A caller can then request summary or full views, specific include categories, evidence, or a continuation cursor only where uncertainty remains.</t>
        <t>Every truncated or policy-limited response identifies coverage and omissions. This allows an agent to reason about what it does not know without paying to retrieve irrelevant state.</t>
      </section>
      <section anchor="stable-semantics">
        <name>Stable Machine Semantics</name>
        <t>Stable action URIs, schemas, codes, enumerated states, and structured reasons <bcp14>SHOULD</bcp14> be favored over parsing provider prose. A profile <bcp14>SHOULD</bcp14> use intent-aligned action identifiers such as deploy, resize, expose, rotate, or reconcile rather than method names derived from one implementation.</t>
        <t>Descriptions are untrusted explanatory data. Clients <bcp14>SHOULD</bcp14> select actions by authenticated capability identity, schema, effect class, policy, and target compatibility, not by semantic similarity to a natural-language description alone.</t>
      </section>
      <section anchor="accretive-context">
        <name>Accretive Context</name>
        <t>AICP objects form a durable graph. A resumed client can retrieve the current Operation and follow links to the exact Plan, originating intent, observed Situation, Outcome, and evidence. It need not reconstruct authority or effects from a chat transcript. Providers <bcp14>SHOULD</bcp14> retain concise object summaries even when bulky evidence has moved to archival storage.</t>
      </section>
      <section anchor="least-calls">
        <name>Least-Call Behavior</name>
        <t>The protocol permits but does not require a single request to plan and execute through <tt>execute-if-ready</tt>. Providers still enforce planning internally. Clients use conditional retrieval, wait preferences, and event cursors to avoid hot polling. Problems carry recovery choices so the next call is deliberate rather than exploratory.</t>
      </section>
      <section anchor="decision-quality">
        <name>Decision Quality Without Private Reasoning</name>
        <t>Providers report relevant evidence, assumptions, unknowns, and concise reason codes. They <bcp14>MUST NOT</bcp14> require a model's hidden reasoning trace as a condition of interoperability. Clients can supply a short purpose and success criteria without disclosing private chain-of-thought or unrelated context.</t>
      </section>
    </section>

    <section anchor="profiles-versioning">
      <name>Profiles, Versioning, and Extensibility</name>
      <section anchor="profile-requirements">
        <name>Profile Requirements</name>
        <t>A conforming profile specification defines:</t>
        <ul spacing="normal">
          <li>a stable profile URI and versioning policy;</li>
          <li>resource type and relationship URIs;</li>
          <li>action descriptors and input/output schemas;</li>
          <li>constraint and success-criterion semantics;</li>
          <li>observation and evidence types;</li>
          <li>materiality, effect class, idempotency, reversibility, and risk guidance;</li>
          <li>native-state mapping and loss of fidelity;</li>
          <li>additional Problem codes and recovery behavior; and</li>
          <li>conformance examples and tests.</li>
        </ul>
        <t>A profile <bcp14>SHOULD</bcp14> reference an existing resource or orchestration model where one is fit for purpose. It <bcp14>MUST</bcp14> disclose mapping loss rather than imply semantic equivalence.</t>
      </section>
      <section anchor="core-versioning">
        <name>Core Version Negotiation</name>
        <t>The Discovery object lists supported major.minor versions. A client selects a mutually supported version by sending the corresponding media type and object value. This document defines <tt>0.1</tt>; pre-1.0 versions can make incompatible changes.</t>
        <t>After a 1.0 specification, a minor version will add only backward-compatible optional semantics, while a major version can make incompatible changes. A recipient <bcp14>MUST</bcp14> reject an unsupported version before a consequential effect.</t>
      </section>
      <section anchor="schema-evolution">
        <name>Schema Evolution</name>
        <t>New optional fields are introduced through a negotiated core version, profile version, or extension URI. Unknown top-level members are not a substitute for extensions and <bcp14>MAY</bcp14> be rejected. Critical behavior always appears in <tt>criticalExtensions</tt> or a negotiated profile.</t>
      </section>
    </section>

    <section anchor="conformance">
      <name>Conformance</name>
      <section anchor="provider-conformance">
        <name>Core Provider</name>
        <t>An AICP Core Provider implements Discovery, Capability Documents, Situation Requests, Intent Requests, Plans, authorization state, Operations, Outcomes, Problems, request deduplication, plan-revision binding, and reconciliation semantics in at least one binding. An AICP HTTP Provider additionally implements <xref target="http-binding"/>.</t>
      </section>
      <section anchor="client-conformance">
        <name>Core Client</name>
        <t>An AICP Core Client validates versions and critical extensions, treats prose as non-authoritative, honors hard constraints, executes only exact Plan revisions, deduplicates events, does not blindly retry uncertain effects, and follows binding-specific credential rules.</t>
      </section>
      <section anchor="profile-conformance">
        <name>Profile Conformance</name>
        <t>A provider or client claiming profile conformance implements all profile requirements identified as mandatory and publishes the supported profile URI in Discovery. Core conformance alone does not imply semantic interoperability for an unshared profile.</t>
      </section>
      <section anchor="conformance-tests">
        <name>Minimum Test Cases</name>
        <t>A conformance suite <bcp14>MUST</bcp14> test at least:</t>
        <ol spacing="normal">
          <li>same request identifier and same semantics return the same result;</li>
          <li>same request identifier and different semantics return <tt>request-id-reuse</tt>;</li>
          <li>a stale, expired, or mismatched Plan is not executed;</li>
          <li>approval for one revision cannot authorize another;</li>
          <li>denied work cannot bypass policy through another binding;</li>
          <li>truncation and omissions are explicit;</li>
          <li>a partial or uncertain effect reaches an appropriate effect and retry state;</li>
          <li>an event gap is recoverable from the Operation resource;</li>
          <li>cancellation races report remaining effects;</li>
          <li>compensation is a separate authorized action;</li>
          <li>unsupported critical extensions are rejected before effect; and</li>
          <li>malicious descriptions cannot supply authority or executable instructions.</li>
        </ol>
      </section>
    </section>

    <section anchor="operational">
      <name>Operational Considerations</name>
      <section anchor="retention">
        <name>Retention and Resumption</name>
        <t>Providers advertise request-deduplication, Plan, Operation, Outcome, and event retention. Active Operations are durable across service restarts. If detailed events expire before the Outcome, the provider preserves a terminal summary, effect state, Plan link, and evidence index sufficient for audit and safe recovery.</t>
      </section>
      <section anchor="backpressure">
        <name>Backpressure and Resource Exhaustion</name>
        <t>Providers enforce authenticated quotas for Situation size, concurrent plans, active Operations, event subscriptions, and expensive verification. Rate limiting does not discard an accepted Operation. Problems distinguish rejection before acceptance from throttling of observation after an effect may have begun.</t>
      </section>
      <section anchor="emergency-control">
        <name>Revocation and Emergency Stop</name>
        <t>Providers <bcp14>MUST</bcp14> support operational revocation of credentials and <bcp14>SHOULD</bcp14> support policy-defined emergency stop. Revocation prevents new effects but does not erase or hide active operations. The provider attempts safe pause, cancellation, or containment and reports actual effect state.</t>
      </section>
      <section anchor="clock">
        <name>Clock and Expiry</name>
        <t>Plan and approval expiry is evaluated by the provider's clock. Providers maintain time synchronization appropriate to their maximum expiry granularity. Clients treat expiry as an upper bound and allow for network delay; they do not assume execution is valid merely because their local clock precedes <tt>expiresAt</tt>.</t>
      </section>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>AICP enables consequential control and therefore exposes the security impact of infrastructure APIs to autonomous and high-rate callers. Authentication alone is insufficient. Implementations require least privilege, policy evaluation, exact-plan binding, durable audit, rate control, and conservative uncertainty handling.</t>
      <section anchor="confused-deputy">
        <name>Confused Deputy and Cross-Tenant Access</name>
        <t>A provider resolves every Resource Reference in the authenticated principal's context, validates delegation and audience, and applies tenant boundaries at every linked resource. It does not trust scope, display name, purpose, requested permission, or delegation URI from the body as proof. Links and cursors are not bearer authorization unless explicitly specified by the authentication system.</t>
      </section>
      <section anchor="stale-plan-attack">
        <name>Stale Plan and Time-of-Check/Time-of-Use</name>
        <t>An attacker or concurrent actor can change infrastructure after preview. Strong entity tags, opaque revisions, expiry, native resource preconditions, and immediate authorization re-evaluation reduce this risk. Providers do not execute a recomputed plan under old approval and do not silently widen a constraint.</t>
      </section>
      <section anchor="approval-attacks">
        <name>Approval Substitution and Phishing</name>
        <t>An approval is bound to exact Plan identity, revision, action, material changes, principal, and expiry. Approval interfaces clearly identify the provider origin and material effect. They avoid approving a generic phrase that could be replayed against another target. High-risk plans should require phishing-resistant authentication and independent confirmation appropriate to organizational policy.</t>
      </section>
      <section anchor="prompt-injection">
        <name>Prompt Injection, Schema Poisoning, and Tool Shadowing</name>
        <t>Descriptions, resource labels, log content, telemetry annotations, and problem detail can contain attacker-controlled text. Clients treat such text as data, never as protocol instructions or authority. Action selection uses authenticated service identity, stable URI, schema, target type, and policy. Clients do not accept a newly advertised action that shadows a trusted action by title alone.</t>
        <t>Schema and profile documents require integrity and origin validation. Clients cache them by origin, URI, and revision and apply size and complexity limits to avoid parser and validation denial of service. A provider does not allow resource content to inject critical extensions or alter core fields.</t>
      </section>
      <section anchor="retry-attacks">
        <name>Replay, Duplicate Effects, and Retry Storms</name>
        <t>Unpredictable request identifiers, principal scoping, bounded retention, and semantic mismatch detection reduce replay. A provider rate-limits repeated retrieval without losing the durable Operation. A client backs off according to Problem metadata and never repeats a consequential request when effect state is possible, partial, or unknown.</t>
      </section>
      <section anchor="supply-chain">
        <name>Provider and Adapter Compromise</name>
        <t>A compromised adapter can misstate a plan, hide effects, or forge observations. Deployments should isolate provider adapters, constrain their native credentials, compare requested and native audit records, and use independent evidence for high-risk actions. AICP evidence links can support verification but do not make an untrusted provider trustworthy by themselves.</t>
      </section>
      <section anchor="secrets">
        <name>Secrets and Sensitive Data</name>
        <t>Secret values, bearer credentials, private keys, and unrestricted signed URLs do not appear in AICP objects. Profiles use opaque secret references resolved inside the authorized control plane. Logs, errors, plans, and evidence summaries are redacted before return and before inclusion in model context.</t>
      </section>
      <section anchor="blast-radius">
        <name>Autonomy and Blast Radius</name>
        <t>Autonomous clients can generate valid but harmful high-rate actions. Providers enforce independent limits on scope, spend, concurrent changes, unavailable resources, data destruction, region count, and approval threshold. A client's stated risk tolerance never overrides provider policy. The execute-if-ready fast path is disabled when policy requires explicit review.</t>
      </section>
      <section anchor="audit-security">
        <name>Audit Integrity</name>
        <t>Audit records link authenticated principal, delegated subject when known, request identifier, Situation, Plan revision, approval decisions, native operation identifiers, Operation events, Outcome, and evidence. Providers protect audit data from modification and unauthorized disclosure. Private model reasoning is neither necessary nor sufficient as an audit record.</t>
      </section>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>Situation and capability discovery can reveal topology, resource names, tenant existence, policy, capacity, cost, operational incidents, and organizational relationships. Providers return only the minimum information authorized for the principal and purpose. They can conceal target existence with an appropriate generic response where disclosure would create risk.</t>
      <t>Decision views and explicit include categories support data minimization. A provider can state an omission without disclosing protected details, for example by using a generic <tt>policy-limited</tt> reason. Clients avoid sending unrelated conversation history, personal data, or private reasoning in <tt>purpose</tt>, arguments, or extensions.</t>
      <t>Durable linked records increase accountability but also correlation risk. Retention is limited to operational, legal, and audit need. Identifiers use sufficient entropy and do not encode user identity. Evidence access is separately authorized, and telemetry links avoid embedding credentials. Cross-origin links are not automatically followed with credentials.</t>
      <t>Capability documents scoped to a principal can reveal permissions. They are privately cached or not stored, are not shared across principals, and can omit denied actions rather than exposing a permission map.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="iana-media-type">
        <name>Media Type Registration</name>
        <t>This document requests registration of <tt>application/aicp+json</tt> in the Media Types registry according to <xref target="RFC6838"/> using the following template:</t>
        <dl newline="true" spacing="normal">
          <dt>Type name</dt><dd>application</dd>
          <dt>Subtype name</dt><dd>aicp+json</dd>
          <dt>Required parameters</dt><dd>None</dd>
          <dt>Optional parameters</dt><dd>None</dd>
          <dt>Encoding considerations</dt><dd>binary; the content is UTF-8 JSON</dd>
          <dt>Security considerations</dt><dd>See <xref target="security"/> of this document.</dd>
          <dt>Interoperability considerations</dt><dd>Recipients use the <tt>aicpVersion</tt> member and negotiated profiles. Unknown critical extensions are rejected.</dd>
          <dt>Published specification</dt><dd>This document.</dd>
          <dt>Applications that use this media type</dt><dd>Infrastructure control planes, autonomous agents, orchestration gateways, and management clients.</dd>
          <dt>Fragment identifier considerations</dt><dd>None are defined by this specification. A profile can define fragment semantics, including JSON Pointer, for its own representations.</dd>
          <dt>Additional information</dt><dd>Magic number(s): none; file extension(s): none; Macintosh file type code(s): none.</dd>
          <dt>Person and email address to contact for further information</dt><dd>Tihan-Nico Paxton, tihan-nico@apollodeploy.com</dd>
          <dt>Intended usage</dt><dd>COMMON</dd>
          <dt>Restrictions on usage</dt><dd>None</dd>
          <dt>Author</dt><dd>Tihan-Nico Paxton</dd>
          <dt>Change controller</dt><dd>IETF</dd>
        </dl>
      </section>
      <section anchor="iana-well-known">
        <name>Well-Known URI Registration</name>
        <t>This document requests registration of <tt>aicp</tt> in the Well-Known URIs registry:</t>
        <dl newline="true" spacing="normal">
          <dt>URI suffix</dt><dd>aicp</dd>
          <dt>Change controller</dt><dd>IETF</dd>
          <dt>Specification document</dt><dd>This document, <xref target="well-known"/>.</dd>
          <dt>Related information</dt><dd>The resource returns an AICP Discovery object and does not itself authorize infrastructure operations.</dd>
        </dl>
      </section>
      <section anchor="iana-problem-registry">
        <name>AICP Problem Code Registry</name>
        <t>This document requests creation of the "AICP Problem Codes" registry under an "Agent Infrastructure Control Protocol" group. Initial entries are the codes in <xref target="problem-code-table"/>. Future registrations require Specification Required as defined by <xref target="RFC8126"/>.</t>
        <t>A registration contains code, problem type URI, intended HTTP status or range, effect-state requirements, retry requirements, and a specification reference. Designated Experts should reject names that are ambiguous, disclose credentials, redefine an existing code incompatibly, or omit safe behavior for uncertain effects.</t>
      </section>
    </section>

    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This initial draft was informed by the design vocabulary and operational lessons of HTTP, intent-based networking, MCP, A2A, AEP, VIRP, EMILIA, CIMI, CAMP, TOSCA, Kubernetes, CloudEvents, and OpenTelemetry. Their mention does not imply review or endorsement of this document by their authors or communities.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259">
        <front>
          <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
          <author initials="T." surname="Bray"/>
          <date month="December" year="2017"/>
        </front>
        <seriesInfo name="STD" value="90"/>
        <seriesInfo name="RFC" value="8259"/>
        <seriesInfo name="DOI" value="10.17487/RFC8259"/>
      </reference>
      <reference anchor="RFC7493" target="https://www.rfc-editor.org/info/rfc7493">
        <front>
          <title>The I-JSON Message Format</title>
          <author initials="T." surname="Bray"/>
          <date month="March" year="2015"/>
        </front>
        <seriesInfo name="RFC" value="7493"/>
        <seriesInfo name="DOI" value="10.17487/RFC7493"/>
      </reference>
      <reference anchor="RFC3339" target="https://www.rfc-editor.org/info/rfc3339">
        <front>
          <title>Date and Time on the Internet: Timestamps</title>
          <author initials="G." surname="Klyne"/>
          <author initials="C." surname="Newman"/>
          <date month="July" year="2002"/>
        </front>
        <seriesInfo name="RFC" value="3339"/>
        <seriesInfo name="DOI" value="10.17487/RFC3339"/>
      </reference>
      <reference anchor="RFC6902" target="https://www.rfc-editor.org/info/rfc6902">
        <front>
          <title>JavaScript Object Notation (JSON) Patch</title>
          <author initials="P." surname="Bryan"/>
          <author initials="M." surname="Nottingham"/>
          <date month="April" year="2013"/>
        </front>
        <seriesInfo name="RFC" value="6902"/>
        <seriesInfo name="DOI" value="10.17487/RFC6902"/>
      </reference>
      <reference anchor="RFC6585" target="https://www.rfc-editor.org/info/rfc6585">
        <front>
          <title>Additional HTTP Status Codes</title>
          <author initials="M." surname="Nottingham"/>
          <author initials="R." surname="Fielding"/>
          <date month="April" year="2012"/>
        </front>
        <seriesInfo name="RFC" value="6585"/>
        <seriesInfo name="DOI" value="10.17487/RFC6585"/>
      </reference>
      <reference anchor="RFC9110" target="https://www.rfc-editor.org/info/rfc9110">
        <front>
          <title>HTTP Semantics</title>
          <author initials="R." surname="Fielding"/>
          <author initials="M." surname="Nottingham"/>
          <author initials="J." surname="Reschke"/>
          <date month="June" year="2022"/>
        </front>
        <seriesInfo name="STD" value="97"/>
        <seriesInfo name="RFC" value="9110"/>
        <seriesInfo name="DOI" value="10.17487/RFC9110"/>
      </reference>
      <reference anchor="RFC6838" target="https://www.rfc-editor.org/info/rfc6838">
        <front>
          <title>Media Type Specifications and Registration Procedures</title>
          <author initials="N." surname="Freed"/>
          <author initials="J." surname="Klensin"/>
          <author initials="T." surname="Hansen"/>
          <date month="January" year="2013"/>
        </front>
        <seriesInfo name="BCP" value="13"/>
        <seriesInfo name="RFC" value="6838"/>
        <seriesInfo name="DOI" value="10.17487/RFC6838"/>
      </reference>
      <reference anchor="RFC7240" target="https://www.rfc-editor.org/info/rfc7240">
        <front>
          <title>Prefer Header for HTTP</title>
          <author initials="J." surname="Snell"/>
          <date month="June" year="2014"/>
        </front>
        <seriesInfo name="RFC" value="7240"/>
        <seriesInfo name="DOI" value="10.17487/RFC7240"/>
      </reference>
      <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8446">
        <front>
          <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
          <author initials="E." surname="Rescorla"/>
          <date month="August" year="2018"/>
        </front>
        <seriesInfo name="RFC" value="8446"/>
        <seriesInfo name="DOI" value="10.17487/RFC8446"/>
      </reference>
      <reference anchor="RFC8615" target="https://www.rfc-editor.org/info/rfc8615">
        <front>
          <title>Well-Known Uniform Resource Identifiers (URIs)</title>
          <author initials="M." surname="Nottingham"/>
          <date month="May" year="2019"/>
        </front>
        <seriesInfo name="RFC" value="8615"/>
        <seriesInfo name="DOI" value="10.17487/RFC8615"/>
      </reference>
      <reference anchor="RFC9396" target="https://www.rfc-editor.org/info/rfc9396">
        <front>
          <title>OAuth 2.0 Rich Authorization Requests</title>
          <author initials="T." surname="Lodderstedt"/>
          <author initials="J." surname="Richer"/>
          <author initials="B." surname="Campbell"/>
          <date month="May" year="2023"/>
        </front>
        <seriesInfo name="RFC" value="9396"/>
        <seriesInfo name="DOI" value="10.17487/RFC9396"/>
      </reference>
      <reference anchor="RFC9457" target="https://www.rfc-editor.org/info/rfc9457">
        <front>
          <title>Problem Details for HTTP APIs</title>
          <author initials="M." surname="Nottingham"/>
          <author initials="E." surname="Wilde"/>
          <author initials="S." surname="Dalal"/>
          <date month="July" year="2023"/>
        </front>
        <seriesInfo name="RFC" value="9457"/>
        <seriesInfo name="DOI" value="10.17487/RFC9457"/>
      </reference>
      <reference anchor="RFC9728" target="https://www.rfc-editor.org/info/rfc9728">
        <front>
          <title>OAuth 2.0 Protected Resource Metadata</title>
          <author><organization>IETF</organization></author>
          <date month="April" year="2025"/>
        </front>
        <seriesInfo name="RFC" value="9728"/>
        <seriesInfo name="DOI" value="10.17487/RFC9728"/>
      </reference>
      <reference anchor="RFC8126" target="https://www.rfc-editor.org/info/rfc8126">
        <front>
          <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
          <author initials="M." surname="Cotton"/>
          <author initials="B." surname="Leiba"/>
          <author initials="T." surname="Narten"/>
          <date month="June" year="2017"/>
        </front>
        <seriesInfo name="BCP" value="26"/>
        <seriesInfo name="RFC" value="8126"/>
        <seriesInfo name="DOI" value="10.17487/RFC8126"/>
      </reference>
    </references>

    <references>
      <name>Informative References</name>
      <reference anchor="JSON-SCHEMA" target="https://json-schema.org/draft/2020-12/json-schema-core.html">
        <front>
          <title>JSON Schema: A Media Type for Describing JSON Documents, Draft 2020-12</title>
          <author initials="A." surname="Wright"/>
          <author initials="H." surname="Andrews"/>
          <author initials="B." surname="Hutton"/>
          <author initials="G." surname="Dennis"/>
          <date month="June" year="2022"/>
        </front>
      </reference>
      <reference anchor="MCP" target="https://modelcontextprotocol.io/specification/2026-07-28">
        <front>
          <title>Model Context Protocol Specification, 2026-07-28</title>
          <author><organization>Model Context Protocol Project</organization></author>
          <date month="July" year="2026"/>
        </front>
      </reference>
      <reference anchor="A2A" target="https://a2a-protocol.org/v1.0.0/specification/">
        <front>
          <title>Agent2Agent Protocol Specification, Version 1.0</title>
          <author><organization>Linux Foundation</organization></author>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="AEP" target="https://datatracker.ietf.org/doc/draft-sato-soos-aep/02/">
        <front>
          <title>The Agent Execution Protocol (AEP) for Agentic AI Systems</title>
          <author initials="T." surname="Sato"/>
          <date month="June" day="30" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-sato-soos-aep-02"/>
        <refcontent>Work in Progress</refcontent>
      </reference>
      <reference anchor="VIRP" target="https://datatracker.ietf.org/doc/draft-howard-virp/06/">
        <front>
          <title>VIRP: Verified Infrastructure Response Protocol</title>
          <author initials="N." surname="Howard"/>
          <date month="August" day="1" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-howard-virp-06"/>
        <refcontent>Work in Progress</refcontent>
      </reference>
      <reference anchor="EMILIA" target="https://datatracker.ietf.org/doc/draft-schrock-ep-architecture/02/">
        <front>
          <title>The EMILIA Protocol: An Evidence Architecture for Consequential Agent Actions</title>
          <author initials="I." surname="Schrock"/>
          <date month="July" day="21" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-schrock-ep-architecture-02"/>
        <refcontent>Work in Progress</refcontent>
      </reference>
      <reference anchor="AI-ARCH" target="https://datatracker.ietf.org/doc/draft-daniel-ai-agent-internet-architecture/03/">
        <front>
          <title>Architectural Requirements for Supporting AI Agents on the Internet</title>
          <author initials="S. D." surname="Park"/>
          <author initials="I." surname="Siddique"/>
          <date month="August" day="28" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-daniel-ai-agent-internet-architecture-03"/>
        <refcontent>Work in Progress</refcontent>
      </reference>
      <reference anchor="CIMI" target="https://www.dmtf.org/dsp/DSP0263">
        <front>
          <title>Cloud Infrastructure Management Interface (CIMI) Model and REST Interface over HTTP</title>
          <author><organization>DMTF</organization></author>
          <date month="June" year="2016"/>
        </front>
        <seriesInfo name="DMTF" value="DSP0263 2.0.0"/>
      </reference>
      <reference anchor="CAMP" target="https://docs.oasis-open.org/camp/camp-spec/v1.2/cs01/camp-spec-v1.2-cs01.html">
        <front>
          <title>Cloud Application Management for Platforms Version 1.2</title>
          <author><organization>OASIS</organization></author>
          <date month="December" year="2020"/>
        </front>
      </reference>
      <reference anchor="TOSCA" target="https://docs.oasis-open.org/tosca/TOSCA/v2.0/TOSCA-v2.0.html">
        <front>
          <title>TOSCA Version 2.0</title>
          <author><organization>OASIS</organization></author>
          <date year="2025"/>
        </front>
      </reference>
      <reference anchor="KUBERNETES" target="https://kubernetes.io/docs/reference/using-api/api-concepts/">
        <front>
          <title>Kubernetes API Concepts</title>
          <author><organization>Kubernetes Authors</organization></author>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="CLOUDEVENTS" target="https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md">
        <front>
          <title>CloudEvents Specification, Version 1.0.2</title>
          <author><organization>Cloud Native Computing Foundation</organization></author>
          <date year="2022"/>
        </front>
      </reference>
      <reference anchor="OTEL" target="https://opentelemetry.io/docs/specs/otel/">
        <front>
          <title>OpenTelemetry Specification</title>
          <author><organization>Cloud Native Computing Foundation</organization></author>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="RFC9315" target="https://www.rfc-editor.org/info/rfc9315">
        <front>
          <title>Intent-Based Networking - Concepts and Definitions</title>
          <author initials="A." surname="Clemm"/>
          <author initials="L." surname="Ciavaglia"/>
          <author initials="L." surname="Granville"/>
          <author initials="J." surname="Tantsura"/>
          <date month="October" year="2022"/>
        </front>
        <seriesInfo name="RFC" value="9315"/>
        <seriesInfo name="DOI" value="10.17487/RFC9315"/>
      </reference>
    </references>

    <section anchor="worked-example">
      <name>Worked HTTP Control Loop</name>
      <t>This appendix is non-normative.</t>
      <ol spacing="normal">
        <li><t>The client retrieves <tt>/.well-known/aicp</tt> and a principal-scoped Capability Document. It selects a workload deployment action using the action URI, target type, effect class, and schemas.</t></li>
        <li><t>The client requests a decision Situation for the production workload with a freshness limit and a 32 KiB budget. The Situation reports workload revision 42, three healthy replicas, one active read-only inspection, applicable production policy, complete decision coverage, and the deployment action.</t></li>
        <li><t>The client posts an Intent Request with a unique request identifier, target release digest, maximum one unavailable replica, no downtime, no data loss, cost limit, and health/error-rate criteria. It requests preview.</t></li>
        <li><t>The provider returns a Plan with revision 3, a five-minute expiry, exact release change, two ordered steps, resource-revision and capacity preconditions, medium risk, and one release-owner approval requirement. The HTTP response contains a strong entity tag.</t></li>
        <li><t>The approver sees and approves Plan revision 3. The approval record binds the target, release digest, material change, risk, and expiry.</t></li>
        <li><t>The client posts an Execution Request naming Plan revision 3 and uses <tt>If-Match</tt> with the Plan entity tag. The provider re-evaluates current policy and preconditions, then returns 202, an Operation, and its Location.</t></li>
        <li><t>The client waits on the Operation resource. Events show staging, health verification, promotion, and final verification. A temporary event delivery gap causes the client to retrieve the current Operation rather than infer state.</t></li>
        <li><t>The Operation reaches <tt>succeeded</tt> with <tt>complete</tt> effects. Its Outcome shows the expected release change, the observed release change, no side effects, satisfied health and error-rate criteria, and evidence links.</t></li>
      </ol>
      <t>If the native provider timed out after accepting the promotion and could not determine its effect, step 7 would instead produce <tt>indeterminate</tt>, unsafe retry guidance, and a reconciliation action. Reconciliation would inspect native state before any completion or compensation Plan.</t>
    </section>

    <section anchor="invariants">
      <name>Protocol Invariants</name>
      <t>This appendix summarizes safety invariants. The normative text in the body controls.</t>
      <ol spacing="normal">
        <li>No consequential effect occurs from a preview request.</li>
        <li>No client-supplied claim creates authority.</li>
        <li>An approval authorizes only one exact Plan revision and context.</li>
        <li>A stale Plan is rejected, not silently recomputed and executed.</li>
        <li>A hard constraint is satisfied, rejected, or reported unknown; it is not silently relaxed.</li>
        <li>A durable Operation exists for every accepted consequential execution.</li>
        <li>Success is determined by required outcome criteria, not only API-call completion.</li>
        <li>Phase and effect certainty are represented separately.</li>
        <li>Possible, partial, or unknown effects are never blindly retried.</li>
        <li>Compensation is a new consequential action with new authorization.</li>
        <li>Every truncated context states its coverage and omissions.</li>
        <li>Every binding reaches the same policy and audit boundary.</li>
        <li>Prose and private reasoning are not protocol authority.</li>
      </ol>
    </section>

    <section anchor="open-issues">
      <name>Open Issues for Subsequent Revisions</name>
      <t>This appendix records issues on which implementation experience is requested:</t>
      <ul spacing="normal">
        <li>whether the core should standardize canonical JSON comparison and an exact decimal convention;</li>
        <li>whether event delivery should select a required streaming format;</li>
        <li>whether approval exchange belongs in the core or a separate profile;</li>
        <li>which common vocabularies and evidence architecture belong in the first workload lifecycle profile; and</li>
        <li>whether batch and multi-resource atomicity require a transaction profile.</li>
      </ul>
    </section>

    <section anchor="changes">
      <name>Change Log</name>
      <t>This section is to be removed before RFC publication.</t>
      <dl newline="true" spacing="normal">
        <dt>draft-paxton-aicp-00</dt>
        <dd>Initial individual draft defining the core object model, control lifecycle, HTTP binding, agent-protocol relationships, reliability behavior, security, privacy, and IANA requests.</dd>
      </dl>
    </section>
  </back>
</rfc>
