<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
]>
<?xml-model href="rfc7991bis.rnc"?>
<rfc
  xmlns:xi="http://www.w3.org/2001/XInclude"
  category="info"
  docName="draft-mackay-aacp-01"
  ipr="trust200902"
  obsoletes=""
  updates="draft-mackay-aacp-00"
  submissionType="independent"
  xml:lang="en"
  version="3">

  <front>
    <title abbrev="AACP">Agent Action Compression Protocol (AACP) Version 1.1</title>

    <seriesInfo name="Internet-Draft" value="draft-mackay-aacp-01"/>

    <author fullname="Andrew Mackay" initials="A." surname="Mackay">
      <organization>Independent</organization>
      <address>
        <email>mackayandrewr@gmail.com</email>
        <uri>https://aacp.dev</uri>
      </address>
    </author>

    <date day="30" month="May" year="2026"/>

    <area>General</area>
    <workgroup>Independent Submission</workgroup>

    <keyword>AACP</keyword>
    <keyword>agent</keyword>
    <keyword>multi-agent</keyword>
    <keyword>LLM</keyword>
    <keyword>coordination</keyword>
    <keyword>deterministic</keyword>
    <keyword>encoding</keyword>
    <keyword>protocol</keyword>

    <abstract>
      <t>
        This document defines the Agent Action Compression Protocol (AACP),
        a pipe-delimited coordination format for agent-to-agent communication
        in multi-agent large language model (LLM) systems. AACP transforms
        verbose natural language coordination instructions into deterministic,
        typed, machine-parseable packets that can be validated before
        transmission, logged as structured audit records, and replayed
        consistently across workflow runs.
      </t>
      <t>
        For known workflow types, a rule-based encoder produces AACP packets
        deterministically at zero LLM cost. A three-tier fallback encoder
        extends this to novel instructions: exact matches are served from a
        local registry cache at zero cost; pattern matches route to rule-based
        encoding at zero cost; novel instructions are encoded via LLM and
        logged to the registry, ensuring each novel pattern incurs at most one
        LLM encoding call regardless of how many times it subsequently appears.
      </t>
      <t>
        As a secondary benefit, AACP reduces coordination token usage by
        approximately 23 percent versus equivalent natural language instructions,
        measured against live API tokenisation on Claude Sonnet 4.5 and GPT-4o.
        Consistent token reduction has been validated across four models:
        Claude Sonnet 4.5, GPT-4o, GPT-4.1, and GPT-4.1-mini.
      </t>
      <t>
        AACP operates above transport protocols such as the Model Context
        Protocol (MCP) and Agent-to-Agent Protocol (A2A), compressing
        message payload content rather than addressing routing or delivery.
        The protocol is transport-agnostic, model-agnostic, and designed
        to complement rather than replace existing agent coordination
        infrastructure.
      </t>
    </abstract>

  </front>

  <middle>

    <section numbered="true" toc="default">
      <name>Introduction</name>
      <t>
        Multi-agent LLM systems coordinate by exchanging instructions between
        autonomous agents. In current implementations, these coordination
        messages are typically written in natural language -- verbose, ambiguous,
        and expensive to tokenise. More significantly, natural language
        coordination instructions are non-deterministic: the same intent may
        be expressed differently across runs, making coordination messages
        difficult to validate, log, replay, or audit.
      </t>
      <t>
        AACP addresses both problems. It replaces natural language coordination
        instructions with a compact, typed, pipe-delimited packet format that
        is deterministic, schema-validated, and structured for machine parsing.
      </t>
      <t>
        Consider a four-agent payroll workflow where an orchestrating agent
        instructs an HRMS agent to retrieve salary records. A typical English
        instruction:
      </t>
      <artwork><![CDATA[
"Please retrieve the employee salary records for the period
ending 31 August 2024. I need all active employees, their
departments, cost centres, base salary, any changes made this
month, and pension contribution rates. Return as JSON array."
      ]]></artwork>
      <t>
        This instruction consumes 56 tokens on Claude Sonnet 4.5. It is
        verbose, includes pleasantries, and will vary in wording across runs.
        The equivalent AACP packet:
      </t>
      <artwork><![CDATA[
FETCH|HR|return:HR-Agent|p:1|aacp:1.1|res:emp_salary|
period:2024-08|filter:status=active|fmt:json
      ]]></artwork>
      <t>
        consumes 52 tokens, is produced identically on every run by the
        rule-based encoder, validates against the v1.1 schema before
        transmission, and can be logged as a structured audit record without
        post-processing.
      </t>
      <t>
        Across a four-hop payroll workflow the total coordination token
        reduction is 22.9 percent on Claude Sonnet 4.5 and 23.7 percent
        on GPT-4o, measured from live API usage_metadata. The rule-based
        encoder produces all four packets at zero LLM cost.
      </t>
      <t>Beyond token reduction, AACP provides:</t>
      <ul>
        <li>Deterministic encoding -- identical input produces identical output</li>
        <li>Zero-cost encoding for known workflows via rule-based encoders</li>
        <li>Schema validation before packet transmission</li>
        <li>Structured, machine-readable audit trail without post-processing</li>
        <li>Self-improving fallback with registry cache</li>
        <li>Model-agnostic format validated across four LLM providers</li>
      </ul>
      <t>This document specifies AACP version 1.1 and updates draft-mackay-aacp-00
      with validated multi-model results, the closed fallback loop specification,
      and reference to the working open-source implementation.</t>
    </section>

    <section numbered="true" toc="default">
      <name>Terminology</name>
      <t>
        The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY",
        and "OPTIONAL" 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>
        <dt>Agent:</dt>
        <dd>An autonomous software process that receives instructions,
        performs tasks using one or more LLM API calls, and returns results.</dd>

        <dt>Coordination message:</dt>
        <dd>An instruction sent from one agent to another describing what
        action to take, on what resource, with what parameters, and where
        to return the result. Distinct from task content.</dd>

        <dt>AACP packet:</dt>
        <dd>A pipe-delimited string conforming to the format defined in
        Section 4, used as a coordination message.</dd>

        <dt>Task tokens:</dt>
        <dd>Tokens consumed by an agent performing its actual work. AACP
        does not reduce task tokens.</dd>

        <dt>Coordination tokens:</dt>
        <dd>Tokens consumed by the coordination message itself. AACP
        reduces these by approximately 23 percent versus verbose English.</dd>

        <dt>Rule-based encoder:</dt>
        <dd>A deterministic encoder producing AACP packets from structured
        input without an LLM call. Zero API cost per encoding.</dd>

        <dt>LLM encoder:</dt>
        <dd>An encoder using an LLM API call to compress an English
        instruction into an AACP packet. Used for novel instructions
        outside known workflow patterns.</dd>

        <dt>Registry:</dt>
        <dd>A local store of previously LLM-encoded instructions and
        their resulting AACP packets, enabling cache lookup on
        subsequent identical or similar instructions.</dd>
      </dl>
    </section>

    <section numbered="true" toc="default">
      <name>Motivation and Problem Statement</name>
      <t>
        The problem of verbosity in agent communication has been identified
        independently by multiple research groups. Mou et al. (2025)
        <xref target="ECOLANG"/> observed that "there exists redundancy in
        current agent communication" and achieved greater than 20 percent
        token reduction through evolved compression language for social
        simulation. AACP addresses the same problem with a typed, portable
        packet schema targeting business workflow coordination.
      </t>
      <t>
        Beyond verbosity, the non-deterministic nature of natural language
        coordination creates operational problems at scale. When coordination
        messages are expressed in free-form English, the same intent produces
        different messages on different runs. This makes it difficult to
        validate messages before transmission, correlate messages across runs
        for audit purposes, or replay workflows reliably.
      </t>
      <t>
        The specific technical gap AACP fills: neither MCP <xref target="MCP"/>
        nor A2A <xref target="A2A"/> address the semantic content of coordination
        messages. Both protocols operate at the transport and routing layers.
        AACP operates at the content layer, defining what agents say to each
        other rather than how messages are delivered.
      </t>
      <t>
        At enterprise scale, coordination token overhead is a measurable cost
        and sustainability concern. Agentic systems consume 5 to 30 times more
        tokens per task than standard single-turn interactions. In multi-agent
        workflows, coordination messages compound with every agent hop. For a
        payroll system processing 500 monthly runs, the coordination token
        reduction provided by AACP eliminates the cost of 500 LLM encoding
        calls and reduces input tokens on every coordination hop.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>Packet Format</name>
      <t>
        An AACP packet is a sequence of pipe-delimited fields. The pipe
        character (U+007C, "|") is the field separator.
      </t>
      <artwork><![CDATA[
packet = task "|" dom "|" named-fields
      ]]></artwork>
      <t>
        TASK and DOM are positional (fields 0 and 1 respectively). All
        other fields MUST be named key:value pairs. Empty positional
        slots MUST NOT appear in v1.1 packets.
      </t>

      <section numbered="true" toc="default">
        <name>Positional Fields</name>
        <dl>
          <dt>Field 0 -- TASK:</dt>
          <dd>The action verb. REQUIRED. MUST be one of the values
          defined in Section 5.1.</dd>
          <dt>Field 1 -- DOM:</dt>
          <dd>The business domain context. REQUIRED. MUST be one of
          the values defined in Section 5.2.</dd>
        </dl>
      </section>

      <section numbered="true" toc="default">
        <name>Named Fields</name>
        <t>
          After the two positional fields, all fields are named using
          the format key:value. The following named fields MUST appear
          in every packet:
        </t>
        <dl>
          <dt>return:</dt>
          <dd>The agent identifier that receives the result. REQUIRED.</dd>
          <dt>aacp:</dt>
          <dd>The protocol version. REQUIRED. MUST be "1.1" for packets
          conforming to this specification.</dd>
        </dl>
        <t>The following named fields are RECOMMENDED where applicable:</t>
        <dl>
          <dt>p:</dt>
          <dd>Priority. 1=critical, 2=medium (default), 3=low.</dd>
          <dt>res:</dt>
          <dd>The resource identifier the action applies to.</dd>
          <dt>period:</dt>
          <dd>A time period, expressed as YYYY-MM or similar.</dd>
          <dt>filter:</dt>
          <dd>A filter expression applied to the resource.</dd>
          <dt>fields:</dt>
          <dd>Comma-separated return fields. SHOULD be omitted when
          the receiving agent has default field definitions in its
          system configuration.</dd>
          <dt>fmt:</dt>
          <dd>The requested response format (e.g. json, pdf, xlsx).</dd>
        </dl>
      </section>

      <section numbered="true" toc="default">
        <name>Extended Fields</name>
        <t>
          Additional named fields MAY be appended after core fields.
          Defined extended keys include: src, src_prev, rules, validate,
          tmpl, data_ptr, amt, ccy, sup, match, terms, type, party,
          clause, issue, risk, block, flags, req, highlight, status,
          to, subj, att, flag_msg, tone, sentiment, actor, chain,
          prog, ltv, loyalty, urgency.
        </t>
        <t>
          Unknown extended keys MUST generate advisory warnings in
          validators, not errors. This permits forward compatibility
          and organisation-private extensions.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Packet Examples</name>
        <t>Fetch active employee salary records:</t>
        <artwork><![CDATA[
FETCH|HR|return:HR-Agent|p:1|aacp:1.1|res:emp_salary|
period:2024-08|filter:status=active|fmt:json
        ]]></artwork>
        <t>Merge datasets and calculate payroll:</t>
        <artwork><![CDATA[
MERGE|HR|return:HR-Agent|p:1|aacp:1.1|rules:payroll_v2|
validate:budget_cc
        ]]></artwork>
        <t>Flag a legal clause for review:</t>
        <artwork><![CDATA[
FLAG|LEGAL|return:LEG-Agent|p:1|aacp:1.1|type:NDA|
party:Acme-Ltd|clause:s7|issue:ip_rights_restriction|
risk:high|block:signature
        ]]></artwork>
        <t>Build IT user account:</t>
        <artwork><![CDATA[
BUILD|IT|return:IT-Agent|p:1|aacp:1.1|res:ad_account|
filter:usr=j.smith|fields:email,dept,grp,pwd_reset
        ]]></artwork>
        <t>Process supplier invoice:</t>
        <artwork><![CDATA[
PROC|FIN|return:FIN-Agent|p:2|aacp:1.1|res:invoice|
sup:ABC-Ltd|amt:4200|ccy:GBP|match:PO-441|terms:net30
        ]]></artwork>
        <t>Write deterministic audit record:</t>
        <artwork><![CDATA[
LOG|HR|return:AUD-Agent|p:2|aacp:1.1|actor:ORCHESTRATOR|
chain:HR-AGENT,FIN-AGENT,HR-AGENT,HR-AGENT|
status:review_required
        ]]></artwork>
      </section>
    </section>

    <section numbered="true" toc="default">
      <name>Valid Field Values</name>

      <section numbered="true" toc="default">
        <name>TASK Values</name>
        <t>
          The following TASK values are defined in AACP v1.1:
          FETCH, PROC, FLAG, RESOLVE, LOG, SEND, BUILD, MERGE,
          CALC, REPORT, ACK, SYNC.
        </t>
        <t>
          Implementations MUST warn on unrecognised TASK values.
          Implementations MUST NOT reject packets with unrecognised
          TASK values, to permit forward compatibility.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>DOM Values</name>
        <t>
          The following DOM values are defined in AACP v1.1:
          HR, FIN, SALES, LEGAL, IT, CS, MKT.
        </t>
        <t>
          Implementors MAY define additional domain values.
          Unrecognised DOM values SHOULD generate advisory warnings.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Priority Values</name>
        <t>
          The p: field accepts: 1 (critical), 2 (medium, default),
          3 (low).
        </t>
      </section>
    </section>

    <section numbered="true" toc="default">
      <name>Encoding</name>

      <section numbered="true" toc="default">
        <name>Rule-Based Encoding</name>
        <t>
          For known, repetitive workflow types, a rule-based encoder
          deterministically produces AACP packets from structured input
          without an LLM API call. This approach has zero API cost and
          produces identical output for identical input on every run.
        </t>
        <t>
          Reference implementations are provided for the following
          workflow types in the open-source SDK
          <xref target="AACP-SDK"/>:
        </t>
        <ul>
          <li>Payroll (PayrollEncoder, 6 coordination hops)</li>
          <li>IT Provisioning (ITEncoder, 6 coordination hops)</li>
          <li>Invoice Processing (InvoiceEncoder, 3 coordination hops)</li>
          <li>Contract Review (ContractEncoder, 3 coordination hops)</li>
        </ul>
      </section>

      <section numbered="true" toc="default">
        <name>LLM-Assisted Encoding</name>
        <t>
          For novel instructions outside known workflow patterns, an
          LLM-assisted encoder produces AACP packets by submitting the
          English instruction to a language model with the AACP
          specification as a system prompt. At current pricing for
          Claude Sonnet 4.5 this costs approximately $0.0006 USD per
          instruction.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Three-Tier Fallback and Registry</name>
        <t>
          The FallbackEncoder routes encoding requests through three
          tiers in priority order:
        </t>
        <t>
          Tier 1 -- Hash cache lookup: The SHA-256 hash of the
          normalised English instruction is looked up in the local
          registry. An exact match returns the cached packet immediately
          at zero cost. The times_seen counter is incremented.
        </t>
        <t>
          Tier 2 -- Pattern match: The instruction is matched against
          keyword patterns from both the registry and a built-in pattern
          set. A match above the configured threshold returns the cached
          packet or routes to rule-based encoding, both at zero cost.
        </t>
        <t>
          Tier 3 -- LLM fallback: Novel instructions with no match are
          encoded via LLM. The result is logged to the registry with
          extracted keywords, enabling Tier 1 and Tier 2 routing on
          all subsequent occurrences.
        </t>
        <t>
          This architecture ensures that each novel instruction pattern
          incurs at most one LLM encoding call regardless of how many
          times the instruction subsequently appears in the system.
          The "one LLM call per pattern, reused indefinitely" property
          has been validated in the reference implementation
          <xref target="AACP-SDK"/>.
        </t>
      </section>
    </section>

    <section numbered="true" toc="default">
      <name>Validation</name>
      <t>AACP validators MUST check:</t>
      <ul>
        <li>Field 0 (TASK) is present and recognised</li>
        <li>Field 1 (DOM) is present and recognised</li>
        <li>A return: named field is present and non-empty</li>
        <li>An aacp: named field is present</li>
      </ul>
      <t>AACP validators SHOULD warn on:</t>
      <ul>
        <li>Unrecognised TASK or DOM values</li>
        <li>Missing p: field</li>
        <li>AACP version mismatch</li>
        <li>sentiment: present without tone:</li>
        <li>ltv: present without ccy:</li>
        <li>Unknown extended field keys</li>
      </ul>
      <t>
        Validation errors MUST be reported before transmission.
        Warnings SHOULD be logged but MUST NOT prevent transmission.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>Decoding</name>
      <t>
        AACP packets are designed to be human-readable as written.
        Decoders MAY expand packets into structured English for audit
        purposes or debugging. For audit purposes, the AACP packet
        itself is the canonical record. Decoded output is advisory.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>Compression Boundaries</name>
      <t>
        Coordination tokens compress well: routing instructions,
        resource references, structured intent, action verbs, and
        metadata are efficiently expressed in AACP.
      </t>
      <t>
        Task tokens do not compress: the actual work an agent performs
        is unchanged by AACP. Total workflow cost impact depends on the
        ratio of coordination to task tokens.
      </t>
      <t>
        Embedding field lists and URI data pointers in packets increases
        token count significantly and SHOULD be avoided where the
        receiving agent has default field definitions in its system
        configuration.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>Tokenisation Benchmark</name>

      <section numbered="true" toc="default">
        <name>Methodology</name>
        <t>
          Coordination token counts were measured using live API
          usage_metadata. Each message was submitted as a bare user
          message with no system prompt and max_tokens=1 to isolate
          coordination token counts. The English baseline is the full
          verbose instruction the AACP packet replaces in production.
          Benchmark date: May 2026.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Tokenisation Results</name>
        <t>Four-hop payroll workflow. Tokens from live API.</t>
        <artwork><![CDATA[
+---------------------+-------+------+--------+--------+
| Hop                 |English| AACP |Claude% |GPT-4o% |
+---------------------+-------+------+--------+--------+
| fetch employees     |    56 |   52 |  -7.1% | -12.7% |
| fetch budgets       |    57 |   47 | -17.5% | -16.0% |
| merge and calculate |    65 |   43 | -33.8% | -31.6% |
| generate report     |    62 |   43 | -30.6% | -33.3% |
+---------------------+-------+------+--------+--------+
| TOTAL               |   240 |  185 | -22.9% | -23.7% |
+---------------------+-------+------+--------+--------+
        ]]></artwork>
      </section>

      <section numbered="true" toc="default">
        <name>Multi-Model Lab Validation</name>
        <t>
          A working multi-agent payroll lab <xref target="AACP-LAB"/>
          validates AACP packet interpretation across four models on a
          five-hop Q1 FY2026 payroll workflow. The workflow reads from
          real CSV data files and produces formatted Excel output via
          agent coordination using AACP packets throughout.
        </t>
        <artwork><![CDATA[
+-------------------+---------+-----------+---------+---------+
| Model             | Cost    | Tokens in | Latency | Success |
+-------------------+---------+-----------+---------+---------+
| gpt-4.1-mini      | $0.0044 |     7,566 |   82.5s |       Y |
| gpt-4.1           | $0.0224 |     7,673 |   39.4s |       Y |
| claude-sonnet-4-5 | $0.0416 |     9,062 |   77.5s |       Y |
| gpt-4o            | $0.0552 |     7,615 |   31.6s |       Y |
+-------------------+---------+-----------+---------+---------+
        ]]></artwork>
        <t>
          All four models correctly interpreted AACP v1.1 packets
          across all five workflow hops without model-specific
          prompt tuning. Every packet validated against the v1.1
          schema. The deterministic audit agent (Tier 0 -- no LLM
          call, $0.00) wrote structured audit records on every run.
        </t>
        <t>
          A notable quality difference was observed: Claude Sonnet 4.5
          identified anomalies across all four cost centres (8 total)
          while GPT models identified anomalies in two. For
          compliance-critical workflows, model selection should
          consider reasoning depth alongside cost. For
          coordination-heavy operational workflows where task
          complexity is low and structured output is the primary
          requirement, GPT-4.1-mini at $0.0044 per five-hop run
          provides adequate quality at significantly lower cost.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Encoding Cost Comparison</name>
        <t>
          For workflows handled by rule-based encoders, the total
          encoding cost per workflow run is $0.00 regardless of the
          number of hops. The LLM fallback encoder costs approximately
          $0.0006 per novel instruction. Once logged to the registry,
          the same instruction is subsequently served from cache at
          $0.00.
        </t>
        <t>
          For comparison, encoding the same four coordination messages
          via direct LLM call (without AACP rule-based encoding) costs
          approximately $0.0024 at Claude Sonnet 4.5 pricing. Over 500
          monthly payroll runs, the rule-based encoder saves approximately
          $1.20 in encoding costs alone, in addition to the coordination
          token reduction on every hop.
        </t>
      </section>
    </section>

    <section numbered="true" toc="default">
      <name>Relationship to Existing Protocols</name>
      <t>
        MCP <xref target="MCP"/> defines how agents access external
        tools and resources. AACP operates inside MCP message payloads,
        compressing the coordination instructions that describe what
        to retrieve or action. The two protocols are complementary.
      </t>
      <t>
        A2A <xref target="A2A"/> defines agent discovery and task
        routing between agents. AACP compresses the content of messages
        that A2A routes. The two protocols are complementary.
      </t>
      <t>
        AACP fills a distinct layer: deterministic, typed encoding of
        coordination message content. No existing published protocol
        addresses this specific layer.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>Implementation</name>
      <t>
        A reference implementation of AACP v1.1 is available as an
        open-source Python package <xref target="AACP-SDK"/>:
      </t>
      <artwork><![CDATA[
pip install aacp
      ]]></artwork>
      <t>
        The package includes the rule-based encoder with four workflow
        encoder implementations, the three-tier fallback encoder with
        registry, the schema validator, and a packet decoder. The
        package is available at https://pypi.org/project/aacp/ and the
        source is published at https://github.com/MackayAndrew/aacp
        under the MIT licence.
      </t>
      <t>
        A working multi-agent lab demonstrating AACP coordination
        across four LLM models is available at
        https://github.com/MackayAndrew/aacp-lab <xref target="AACP-LAB"/>.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>Extensibility</name>
      <t>
        Unknown named fields generate advisory warnings, not errors.
        Implementors MAY define organisation-private fields using a
        namespacing convention to avoid collision with future AACP
        fields (e.g. org_fieldname:).
      </t>
      <t>
        Implementors MAY define domain values beyond the seven defined
        in Section 5.2. A community encoding registry is planned for
        a future version, enabling shared rule-based patterns across
        implementors.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>Version Policy</name>
      <t>
        The aacp: field MUST be included in every packet and MUST
        specify the protocol version. Breaking changes increment the
        major version. Additive changes increment the minor version.
        Implementations SHOULD warn on version mismatch but MUST NOT
        reject packets on version mismatch alone.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>
        Packet injection: AACP packets MUST be treated as untrusted
        input. Validators MUST be applied before processing.
        Implementations MUST NOT execute actions based on unvalidated
        packets.
      </t>
      <t>
        Prompt injection: malicious content in AACP field values
        could be interpreted as instructions by a receiving LLM agent.
        Implementations SHOULD sanitise field values before including
        them in LLM prompts. Field values SHOULD be treated as data,
        not instructions.
      </t>
      <t>
        Replay attacks: AACP v1.1 does not include sequence numbers
        or timestamps. Security-sensitive environments SHOULD add
        replay protection at the transport layer.
      </t>
      <t>
        Sensitive data: PII, financial records, and credentials MUST
        NOT be embedded in AACP field values. Use authenticated data
        access layers referenced by pointer instead.
      </t>
      <t>
        Registry security: the local registry stores previously encoded
        instructions and their resulting packets. The registry file
        SHOULD be access-controlled and SHOULD NOT be committed to
        version control when it contains sensitive workflow instructions.
      </t>
    </section>

    <section numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>

  </middle>

  <back>

    <references>
      <name>References</name>

      <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"
              fullname="S. Bradner"/>
            <date year="1997" month="March"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
        </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"
              fullname="B. Leiba"/>
            <date year="2017" month="May"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
        </reference>

      </references>

      <references>
        <name>Informative References</name>

        <reference anchor="ECOLANG"
          target="https://arxiv.org/abs/2505.06904">
          <front>
            <title>EcoLANG: Towards Efficient Agent
            Communication via Evolved Language</title>
            <author surname="Mou" initials="Y."/>
            <date year="2025" month="May"/>
          </front>
          <refcontent>arXiv:2505.06904</refcontent>
        </reference>

        <reference anchor="MCP"
          target="https://modelcontextprotocol.io/">
          <front>
            <title>Model Context Protocol</title>
            <author>
              <organization>Anthropic</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>

        <reference anchor="A2A"
          target="https://google.github.io/A2A/">
          <front>
            <title>Agent-to-Agent Protocol</title>
            <author>
              <organization>Google</organization>
            </author>
            <date year="2025"/>
          </front>
        </reference>

        <reference anchor="AACP-SDK"
          target="https://github.com/MackayAndrew/aacp">
          <front>
            <title>AACP Python SDK</title>
            <author initials="A." surname="Mackay"
              fullname="Andrew Mackay"/>
            <date year="2026"/>
          </front>
          <refcontent>
            Available at https://pypi.org/project/aacp/
          </refcontent>
        </reference>

        <reference anchor="AACP-LAB"
          target="https://github.com/MackayAndrew/aacp-lab">
          <front>
            <title>AACP Multi-Agent Lab</title>
            <author initials="A." surname="Mackay"
              fullname="Andrew Mackay"/>
            <date year="2026"/>
          </front>
          <refcontent>
            Four-model payroll workflow validation.
            Q1 FY2026 payroll close with Excel output.
          </refcontent>
        </reference>

      </references>
    </references>

  </back>
</rfc>
