<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-cowles-aocl-00"
     ipr="trust200902"
     submissionType="independent"
     category="exp"
    
     xml:lang="en"
     version="3">

  <front>
    <title abbrev="AOCL">Agent Orchestration Control Layers (AOCL) Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-cowles-aocl-00"/>

    <author fullname="Adam Cowles" initials="A." surname="Cowles">
      <organization>Quox Ltd</organization>
      <address>
        <postal>
          <city>London</city>
          <country>United Kingdom</country>
        </postal>
        <email>adam@quox.ai</email>
        <uri>https://quox.ai</uri>
      </address>
    </author>

    <date/>

    <area>Applications and Real-Time</area>
    <workgroup>Independent Submission</workgroup>

    <keyword>AI agents</keyword>
    <keyword>orchestration</keyword>
    <keyword>governance</keyword>
    <keyword>control layers</keyword>
    <keyword>observability</keyword>

    <abstract>
      <t>
        Agent Orchestration Control Layers (AOCL) is a protocol that
        standardizes how an orchestrator processes incoming events by
        passing them through a layered control pipeline.  AOCL defines
        an eleven-layer taxonomy covering ingress normalization, identity
        scoping, smart routing, policy gating, plan decomposition,
        context retrieval, prompt shaping, delegation and execution,
        verification, response assembly, and audit writeback.  The
        protocol is runtime-agnostic and framework-agnostic, producing
        auditable governance traces as a first-class output.  AOCL
        supports both sequential pipeline and directed acyclic graph
        (DAG) execution modes, with explicit bypass and branch
        semantics that mandate audit records for all control-flow
        deviations.
      </t>
    </abstract>
  </front>

  <middle>

    <!-- ============================================================ -->
    <!-- Section 1: Introduction                                       -->
    <!-- ============================================================ -->
    <section anchor="introduction">
      <name>Introduction</name>

      <t>
        Autonomous AI agents are increasingly deployed in enterprise
        environments where they perform consequential actions: executing
        code, accessing databases, managing infrastructure, and
        interacting with external services.  Despite this growing
        responsibility, there is no widely adopted standard for how agent
        actions flow through identity verification, policy enforcement,
        execution delegation, and audit recording.
      </t>

      <t>
        Without a structured control pipeline, agent systems exhibit
        several governance failures: actions are taken without policy
        checks, bypass decisions are unrecorded, identity and permission
        scoping is ad-hoc, and there is no reproducible trace explaining
        why a particular action was taken or what evidence supports the
        result.
      </t>

      <t>
        The Agent Orchestration Control Layers (AOCL) protocol addresses
        these problems by defining a layered control pipeline that an
        orchestrator runs when processing any incoming event.  AOCL does
        not prescribe how agents are built, how tools execute, or how
        workers are scheduled.  Instead, it standardizes the control
        layers through which work flows, the minimum contract each layer
        MUST follow, and the audit records that MUST be emitted.
      </t>

      <t>
        AOCL is designed to be runtime-agnostic and framework-agnostic.
        It operates alongside the Agent Envelope Exchange (AEE) protocol
        <xref target="AEE"/>, using AEE envelopes as the audit and
        delegation format without requiring any changes to the AEE
        specification.  Verifiable audit trails MAY additionally be
        anchored using the VOLT protocol <xref target="VOLT"/>.
      </t>

      <t>
        The protocol defines eleven canonical layers (L0 through L10),
        a structured context bundle with seven partitions (C0 through
        C6), and two stack execution modes (pipeline and DAG).  All
        control-flow deviations, including layer bypasses and branch
        decisions, MUST produce explicit audit records.
      </t>
    </section>

    <!-- ============================================================ -->
    <!-- Section 2: Conventions and Definitions                        -->
    <!-- ============================================================ -->
    <section anchor="conventions">
      <name>Conventions and Definitions</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>

      <t>The following terms are used throughout this document:</t>

      <dl>
        <dt>Intent</dt>
        <dd>
          A triggering event that initiates AOCL processing.  Examples
          include user messages, monitoring alerts, webhook callbacks,
          API calls, and scheduled ticks.  AOCL does not constrain the
          event format, but commonly an intent arrives as an AEE
          <xref target="AEE"/> task envelope.
        </dd>

        <dt>Orchestrator</dt>
        <dd>
          The component that runs AOCL stacks.  It may be a single
          process or distributed across multiple nodes.  The orchestrator
          is responsible for layer sequencing, context propagation,
          control-flow decisions, and audit emission.
        </dd>

        <dt>Layer</dt>
        <dd>
          A named unit of control logic that takes an input state and
          produces a possibly modified state, decisions and/or actions,
          and control flags that influence routing (branch, bypass, or
          halt).  Layers can be deterministic code, LLM calls, or
          hybrids.
        </dd>

        <dt>Stack</dt>
        <dd>
          A configured sequence or graph of layers used for a class of
          tasks (e.g., "default", "realtime-alert", "deep-research").
        </dd>

        <dt>Context Bundle</dt>
        <dd>
          A structured state object passed through AOCL layers,
          partitioned into seven segments (C0 through C6) that separate
          concerns such as event metadata, identity, task definition,
          memory, policy, execution parameters, and audit requirements.
        </dd>

        <dt>Control Flags</dt>
        <dd>
          Signals emitted by a layer to influence downstream processing.
          Standard flags include halt_pipeline, require_hitl, branch_to,
          and bypass_layers.
        </dd>

        <dt>Context Delta</dt>
        <dd>
          A patch or merge delta representing changes a layer made to
          the context bundle.  Layers SHOULD emit deltas rather than
          full context copies to minimize payload size and enable
          efficient replay.
        </dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <!-- Section 3: Architecture Overview                              -->
    <!-- ============================================================ -->
    <section anchor="architecture">
      <name>Architecture Overview</name>

      <t>
        AOCL defines a control-plane architecture for agent
        orchestration.  The architecture consists of four primary
        components: layers, stacks, context bundles, and the
        orchestrator.
      </t>

      <section anchor="arch-layers">
        <name>Layers</name>
        <t>
          A layer is the fundamental unit of control logic.  Each layer
          receives an input context bundle, performs its designated
          function (normalization, policy checking, planning, etc.), and
          produces an output consisting of:
        </t>
        <ul>
          <li>A possibly modified context bundle (expressed as a delta);</li>
          <li>Zero or more decisions with coded reasons;</li>
          <li>Control flags that may alter downstream processing.</li>
        </ul>
        <t>
          Layers are intentionally opaque in their implementation.
          A layer MAY be implemented as deterministic code, an LLM
          inference call, a rules engine, a remote service invocation,
          or any combination thereof.  AOCL specifies only the input
          and output contracts, not the internal mechanism.
        </t>
      </section>

      <section anchor="arch-stacks">
        <name>Stacks</name>
        <t>
          A stack is a configured arrangement of layers for a particular
          class of work.  Stacks MAY be expressed as a sequential
          pipeline (ordered list) or as a directed acyclic graph (DAG)
          with conditional edges.  An orchestrator MAY support multiple
          named stacks and select among them based on the characteristics
          of the incoming intent.
        </t>
      </section>

      <section anchor="arch-context">
        <name>Context Bundles</name>
        <t>
          The context bundle is the shared state object that flows
          through layers.  It is partitioned into seven segments (C0
          through C6) to separate concerns and enable selective access.
          Layers SHOULD emit context deltas (patches) and
          references/digests rather than re-transmitting large objects.
          The context bundle SHOULD remain inspectable and replayable.
        </t>
      </section>

      <section anchor="arch-orchestrator">
        <name>Orchestrator Role</name>
        <t>
          The orchestrator is responsible for:
        </t>
        <ul>
          <li>Receiving incoming intents;</li>
          <li>Selecting the appropriate stack;</li>
          <li>Executing layers in the order defined by the stack;</li>
          <li>Propagating the context bundle between layers;</li>
          <li>Honoring control flags (branch, bypass, halt);</li>
          <li>Emitting audit records for every layer activation and
              control-flow decision.</li>
        </ul>
      </section>

      <section anchor="arch-scope">
        <name>Scope Boundaries</name>
        <t>
          AOCL explicitly does NOT define:
        </t>
        <ul>
          <li>How agents are built or structured internally;</li>
          <li>How tools execute or what APIs they expose;</li>
          <li>How workers are scheduled or load-balanced;</li>
          <li>Transport bindings (HTTP, WebSocket, NATS, Kafka);</li>
          <li>Cryptographic signature formats;</li>
          <li>A formal expression language for DAG edge conditions;</li>
          <li>A standardized plugin registry for layer implementation
              references.</li>
        </ul>
        <t>
          These concerns are deferred to runtime implementations or
          future revisions of this specification.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 4: Design Principles                                  -->
    <!-- ============================================================ -->
    <section anchor="principles">
      <name>Design Principles</name>

      <section anchor="principle-layered">
        <name>Layered Control</name>
        <t>
          Work flows through ordered layers with clearly separated
          responsibilities.  Each layer has a single primary concern
          (e.g., identity scoping, policy enforcement, context
          retrieval).  This separation enables independent evolution,
          testing, and replacement of individual layers without
          affecting the overall pipeline structure.
        </t>
      </section>

      <section anchor="principle-branch">
        <name>Branchable and Bypassable</name>
        <t>
          AOCL supports alternate execution paths (branches) and the
          ability to skip layers (bypasses).  However, all branch and
          bypass decisions MUST be auditable.  The orchestrator MUST
          emit explicit records documenting which layers were bypassed
          or which branch was taken, who authorized the deviation, and
          why it was permitted.
        </t>
      </section>

      <section anchor="principle-delta">
        <name>Delta-First Context</name>
        <t>
          Layers SHOULD emit context deltas (patches) and
          references/digests rather than re-transmitting entire context
          objects.  This principle keeps audit payloads small, enables
          efficient replay, and allows integrity verification through
          digest comparison.  Large data (e.g., RAG results, file
          contents) SHOULD be referenced by URI or content hash rather
          than embedded inline.
        </t>
      </section>

      <section anchor="principle-audit">
        <name>Audit-First</name>
        <t>
          AOCL is designed to produce traces that answer five
          fundamental governance questions:
        </t>
        <ol>
          <li>What happened?</li>
          <li>Why did it happen?</li>
          <li>What changed in the context?</li>
          <li>Who or what approved any bypasses or deviations?</li>
          <li>What evidence supports the result?</li>
        </ol>
        <t>
          Every layer activation, decision, and control-flow change
          MUST produce an audit record.  Observability is a first-class
          output of the protocol, not an optional add-on.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 5: Context Bundle                                     -->
    <!-- ============================================================ -->
    <section anchor="context-bundle">
      <name>Context Bundle</name>

      <t>
        The context bundle is the structured state object that flows
        through all AOCL layers.  AOCL does not mandate a single
        rigid schema, but RECOMMENDS partitioning the bundle into
        seven segments (C0 through C6) to maintain clear separation
        of concerns.
      </t>

      <section anchor="c0-event">
        <name>C0: Event</name>
        <t>
          Contains metadata about the triggering event: source
          identifier, timestamp, channel (chat, webhook, API, schedule),
          correlation IDs, and any attachments or raw input data.  This
          partition is populated during L0 (ingress normalization) and
          is generally read-only for subsequent layers.
        </t>
      </section>

      <section anchor="c1-identity">
        <name>C1: Identity and Scope</name>
        <t>
          Contains the authenticated identity context: user and/or
          organization identifiers, roles, permissions, secret scope
          boundaries, and redaction rules.  This partition is populated
          during L1 (identity scoping) and is consumed by policy and
          execution layers to enforce access control.
        </t>
      </section>

      <section anchor="c2-task">
        <name>C2: Task</name>
        <t>
          Contains the structured task definition: goal statement,
          constraints, definition of done, priority level, and any
          decomposition into sub-tasks.  This partition is refined
          during L4 (plan decomposition) and consumed during L7
          (delegation and execution).
        </t>
      </section>

      <section anchor="c3-memory">
        <name>C3: Memory and Knowledge</name>
        <t>
          Contains retrieved contextual information: memory notes,
          retrieval-augmented generation (RAG) results, file references,
          and bounded summaries.  This partition is populated during L5
          (context retrieval) and consumed during L6 (shape and
          rewrite) and L7 (delegation and execution).  Large data
          objects SHOULD be stored as references rather than inline
          values.
        </t>
      </section>

      <section anchor="c4-policy">
        <name>C4: Policy</name>
        <t>
          Contains active policy constraints: safety and compliance
          rules, allowed tool lists, model restrictions, content
          filtering requirements, and human-in-the-loop (HITL)
          thresholds.  This partition is populated during L3 (policy
          gating) and enforced throughout subsequent layers.
        </t>
      </section>

      <section anchor="c5-execution">
        <name>C5: Execution</name>
        <t>
          Contains runtime execution parameters: budgets (token limits,
          cost ceilings), timeouts, concurrency limits, the tool
          registry, model routing preferences, and execution mode
          (e.g., "restricted-readonly", "full", "analysis-only").
        </t>
      </section>

      <section anchor="c6-audit">
        <name>C6: Audit</name>
        <t>
          Contains audit configuration: log level, required evidence
          types, compliance checkpoint identifiers, and references to
          external audit sinks.  This partition governs what level of
          audit detail is emitted by each layer and what evidence
          MUST accompany the final result.
        </t>
      </section>

      <section anchor="context-bundle-serialization">
        <name>Serialization</name>
        <t>
          When serialized, the context bundle SHOULD be represented as
          a JSON <xref target="RFC8259"/> object with top-level keys
          corresponding to the partition identifiers (C0 through C6).
          The following is an illustrative example of a minimal
          context bundle:
        </t>

        <artwork type="json"><![CDATA[
{
  "C0": {
    "source": "chat",
    "ts": "2026-01-26T12:00:00Z",
    "channel": "web",
    "corr": "01AOCL_CORR_0001"
  },
  "C1": {
    "user_id": "user-42",
    "org_id": "org-7",
    "roles": ["operator"],
    "redact": ["ssn", "credit_card"]
  },
  "C2": {
    "goal": "Check backup status for production cluster",
    "priority": "high"
  },
  "C3": {},
  "C4": {
    "allowed_tools": ["tool.readonly.*"],
    "model_restrictions": []
  },
  "C5": {
    "timeout_ms": 30000,
    "max_parallel": 4,
    "mode": "restricted-readonly"
  },
  "C6": {
    "log_level": "info",
    "evidence_required": true
  }
}
]]></artwork>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 6: Layer Taxonomy                                     -->
    <!-- ============================================================ -->
    <section anchor="layer-taxonomy">
      <name>Layer Taxonomy</name>

      <t>
        AOCL defines eleven canonical layers (L0 through L10).
        Implementations are not required to use these exact names, but
        adopting the shared taxonomy makes stacks portable, debuggable,
        and interoperable across different orchestrator implementations.
      </t>

      <t>
        Each layer is described below with its canonical identifier,
        purpose, input contract, output contract, and key behaviors.
      </t>

      <section anchor="l0">
        <name>L0: ingress.normalize</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L0.ingress.normalize</dd>

          <dt>Purpose</dt>
          <dd>
            Normalize incoming events from heterogeneous sources
            (chat messages, webhooks, emails, monitoring alerts,
            scheduled ticks) into a uniform internal representation.
            Assign run identifiers and perform basic input parsing
            and validation.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            Raw event data in source-specific format.  No assumptions
            about structure or encoding.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Populated C0 (Event) partition with normalized source,
            timestamp, channel, correlation ID, and parsed attachments.
            A unique run_id MUST be generated for the processing run.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>MUST assign a unique run_id for the processing run.</li>
              <li>MUST populate C0.corr with a correlation identifier
                  (either from the incoming event or newly generated).</li>
              <li>SHOULD validate that the incoming event contains
                  sufficient data to proceed.</li>
              <li>MAY reject malformed events by setting a halt control
                  flag.</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l1">
        <name>L1: identity.scope</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L1.identity.scope</dd>

          <dt>Purpose</dt>
          <dd>
            Resolve and apply identity context, including user and
            organization identifiers, role assignments, permission
            sets, secret scope boundaries, and data redaction rules.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            C0 (Event) partition populated with source and correlation
            data.  Authentication tokens or identity assertions from
            the incoming event.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Populated C1 (Identity and Scope) partition.  Identity
            resolution failures MUST result in a halt control flag
            or a forced restricted-mode branch.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>MUST resolve the acting identity before allowing
                  downstream processing.</li>
              <li>MUST populate redaction rules so that downstream
                  layers can enforce data minimization.</li>
              <li>SHOULD NOT be bypassable in production deployments.</li>
              <li>MAY support multiple identity providers and
                  federation schemes.</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l2">
        <name>L2: route.smart</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L2.route.smart</dd>

          <dt>Purpose</dt>
          <dd>
            Deterministic fast-path router that handles pattern
            matching, cached answers, known commands, and simple
            lookups without invoking the full pipeline.  This layer
            provides an early exit for requests that do not require
            planning, context retrieval, or agent delegation.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            C0 (Event) and C1 (Identity) partitions populated.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            If a fast-path match is found: a direct response and
            halt_pipeline control flag set to true, causing the
            pipeline to skip to L9 (response assembly).  If no match:
            context passed through unmodified.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>SHOULD be fast and deterministic (no LLM calls).</li>
              <li>MAY maintain a cache of previously computed responses.</li>
              <li>MUST set halt_pipeline to true when providing a
                  direct response, to avoid unnecessary downstream
                  processing.</li>
              <li>SHOULD emit a decision record indicating whether a
                  fast-path match was found.</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l3">
        <name>L3: policy.gate</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L3.policy.gate</dd>

          <dt>Purpose</dt>
          <dd>
            Enforce safety and compliance policies.  Evaluate tool
            and model restrictions, content filtering requirements,
            and human-in-the-loop (HITL) thresholds.  This layer
            acts as the primary governance checkpoint.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            C0 (Event), C1 (Identity), and C2 (Task) partitions
            populated (C2 may be partially populated at this stage).
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Populated C4 (Policy) partition with active constraints.
            May set control flags including require_hitl, branch_to
            (e.g., restricted mode), or halt_pipeline (for policy
            violations).
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>MUST evaluate all applicable policies before
                  allowing downstream execution.</li>
              <li>MUST emit a decision record with coded reasons
                  (e.g., POLICY_ALLOW, POLICY_DENY, POLICY_RESTRICT).</li>
              <li>SHOULD NOT be bypassable in production deployments.</li>
              <li>MAY trigger HITL requirements by setting the
                  require_hitl control flag.</li>
              <li>SHOULD populate C4.allowed_tools to constrain which
                  tools the execution layer may invoke.</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l4">
        <name>L4: plan.decompose</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L4.plan.decompose</dd>

          <dt>Purpose</dt>
          <dd>
            Convert the incoming intent into structured objectives.
            Determine whether the task requires single-step or
            multi-step execution, whether multiple agents are needed,
            and what the dependency graph looks like.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            C0 (Event), C1 (Identity), C2 (Task -- partial), and
            C4 (Policy) partitions populated.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Fully populated C2 (Task) partition with structured
            objectives, sub-task decomposition (if applicable),
            dependency ordering, and a definition of done.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>SHOULD decompose complex requests into discrete,
                  independently verifiable sub-tasks.</li>
              <li>MUST respect policy constraints from C4 when
                  formulating plans (e.g., if tool execution is
                  restricted, plans MUST NOT include tool-dependent
                  steps).</li>
              <li>MAY use LLM inference to analyze intent and
                  generate plans.</li>
              <li>SHOULD emit a decision record describing the
                  decomposition strategy chosen.</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l5">
        <name>L5: context.retrieve</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L5.context.retrieve</dd>

          <dt>Purpose</dt>
          <dd>
            Retrieve relevant memory, files, and knowledge context.
            Perform retrieval-augmented generation (RAG) lookups,
            memory searches, file reads, and produce bounded summaries
            and references.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            C2 (Task) partition with structured objectives to guide
            retrieval.  C1 (Identity) partition for access control
            on retrieved data.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Populated C3 (Memory and Knowledge) partition with
            retrieved data, references, and summaries.  Large objects
            SHOULD be stored as references (URIs or content hashes)
            rather than inline values.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>MUST respect identity and permission boundaries
                  from C1 when retrieving data.</li>
              <li>SHOULD produce bounded summaries to avoid context
                  window overflow in downstream LLM calls.</li>
              <li>SHOULD emit references and digests for large
                  retrieved objects rather than embedding them inline.</li>
              <li>MAY query multiple knowledge sources (vector stores,
                  databases, file systems, APIs).</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l6">
        <name>L6: shape.rewrite</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L6.shape.rewrite</dd>

          <dt>Purpose</dt>
          <dd>
            Rewrite and structure the accumulated context into an
            operational form suitable for execution.  This may involve
            constructing AEE task envelopes, tool invocation plans,
            prompt templates, or structured schemas.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            C2 (Task), C3 (Memory), C4 (Policy), and C5 (Execution)
            partitions populated.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Operational artifacts ready for L7 delegation: structured
            task definitions, tool call specifications, prompt
            payloads, or AEE task envelopes.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>MUST apply redaction rules from C1 to any data
                  included in operational artifacts.</li>
              <li>SHOULD structure output for efficient consumption
                  by the target execution runtime.</li>
              <li>MAY apply prompt engineering, template expansion,
                  or schema mapping.</li>
              <li>SHOULD emit a decision record if the rewrite
                  significantly transforms the original intent.</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l7">
        <name>L7: delegate.execute</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L7.delegate.execute</dd>

          <dt>Purpose</dt>
          <dd>
            Delegate work to agents, tools, or external services.
            Manage dependencies between sub-tasks, enforce concurrency
            limits, and collect results.  This is the primary
            execution layer and is intentionally runtime-specific.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            Operational artifacts from L6.  C5 (Execution) partition
            with budgets, timeouts, concurrency limits, and tool
            registry.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Execution results from delegated work, including agent
            responses, tool outputs, error reports, and evidence
            artifacts.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>MUST respect budgets and timeouts from C5.</li>
              <li>MUST respect the allowed tool list from C4.</li>
              <li>MUST emit AEE task envelopes when delegating to
                  agents, preserving the correlation ID from C0.</li>
              <li>SHOULD manage concurrent sub-task execution within
                  the limits specified in C5.</li>
              <li>MUST collect and propagate errors in a structured
                  format.</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l8">
        <name>L8: verify.check</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L8.verify.check</dd>

          <dt>Purpose</dt>
          <dd>
            Perform verification, evaluation, and consistency checks
            on execution results.  Validate that evidence requirements
            are met, outputs are consistent with the task definition,
            and no policy violations occurred during execution.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            Execution results from L7.  C2 (Task) partition with
            definition of done.  C6 (Audit) partition with evidence
            requirements.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Verification verdict (pass, fail, or partial) with
            supporting evidence.  If verification fails, MAY trigger
            re-execution (loop back to L7) or halt with an error.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>MUST check that required evidence (as specified in
                  C6) is present and valid.</li>
              <li>SHOULD validate output consistency against the task
                  definition in C2.</li>
              <li>MUST emit a verification decision record with
                  pass/fail status and reasons.</li>
              <li>MAY invoke evaluation models or deterministic
                  validation logic.</li>
              <li>MAY request re-execution if results are
                  insufficient, subject to retry limits.</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l9">
        <name>L9: assemble.respond</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L9.assemble.respond</dd>

          <dt>Purpose</dt>
          <dd>
            Assemble the final response from execution results and
            verification outcomes.  Apply final redaction, tone
            adjustment, and formatting constraints before delivery
            to the requesting party.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            Verified execution results from L8 (or direct results
            from L2 in fast-path cases).  C1 (Identity) partition
            with redaction rules.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Final response payload ready for delivery.  All
            redaction rules from C1 MUST have been applied.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>MUST apply all redaction rules from C1 before
                  emitting the response.</li>
              <li>SHOULD apply tone and formatting constraints
                  appropriate to the output channel.</li>
              <li>MAY combine results from multiple sub-tasks into
                  a coherent response.</li>
              <li>MUST NOT include sensitive data that was marked
                  for redaction in C1.</li>
            </ul>
          </dd>
        </dl>
      </section>

      <section anchor="l10">
        <name>L10: audit.writeback</name>

        <dl>
          <dt>Canonical ID</dt>
          <dd>L10.audit.writeback</dd>

          <dt>Purpose</dt>
          <dd>
            Persist the complete audit trace for the processing run.
            Write back permitted memory updates (e.g., conversation
            summaries, learned facts) and emit the final run summary
            record.
          </dd>

          <dt>Input Contract</dt>
          <dd>
            Complete context bundle with all accumulated deltas.
            C6 (Audit) partition with log level and compliance
            checkpoint requirements.
          </dd>

          <dt>Output Contract</dt>
          <dd>
            Persisted audit trace (as one or more AEE event
            envelopes).  Optional memory writeback artifacts.
            An aocl.run.summary event envelope summarizing the
            complete processing run.
          </dd>

          <dt>Key Behaviors</dt>
          <dd>
            <ul>
              <li>MUST persist the audit trace to the configured
                  audit sink(s).</li>
              <li>MUST emit an aocl.run.summary envelope with
                  timing, layer count, decision summary, and
                  outcome status.</li>
              <li>SHOULD perform memory writeback only for data
                  explicitly permitted by policy (C4).</li>
              <li>MUST NOT fail silently -- audit persistence
                  failures SHOULD be reported as errors.</li>
            </ul>
          </dd>
        </dl>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 7: Stack Definition Format                            -->
    <!-- ============================================================ -->
    <section anchor="stack-format">
      <name>Stack Definition Format</name>

      <t>
        AOCL stacks define the arrangement and configuration of layers
        for a particular class of work.  Two execution modes are
        supported: pipeline mode and DAG mode.
      </t>

      <section anchor="stack-pipeline">
        <name>Pipeline Mode</name>

        <t>
          Pipeline mode arranges layers in a strict sequential order.
          Each layer executes after the previous one completes, unless
          a control flag causes a skip, branch, or halt.  This is the
          simplest execution mode and is RECOMMENDED for most use cases.
        </t>

        <t>
          A pipeline stack definition MUST include a stack_id, version,
          mode set to "pipeline", and an ordered array of layer
          entries.  Each layer entry MUST include an id and ref field,
          and MAY include an enabled flag.
        </t>

        <artwork type="json"><![CDATA[
{
  "stack_id": "default",
  "version": "0.1",
  "mode": "pipeline",
  "layers": [
    {"id": "L0.ingress.normalize", "ref": "builtin:l0.normalize",
     "enabled": true},
    {"id": "L1.identity.scope",    "ref": "builtin:l1.identity",
     "enabled": true},
    {"id": "L2.route.smart",       "ref": "builtin:l2.router",
     "enabled": true},
    {"id": "L3.policy.gate",       "ref": "builtin:l3.policy",
     "enabled": true},
    {"id": "L4.plan.decompose",    "ref": "builtin:l4.plan",
     "enabled": true},
    {"id": "L5.context.retrieve",  "ref": "builtin:l5.context",
     "enabled": true},
    {"id": "L6.shape.rewrite",     "ref": "builtin:l6.shape",
     "enabled": true},
    {"id": "L7.delegate.execute",  "ref": "builtin:l7.delegate",
     "enabled": true},
    {"id": "L8.verify.check",      "ref": "builtin:l8.verify",
     "enabled": true},
    {"id": "L9.assemble.respond",  "ref": "builtin:l9.respond",
     "enabled": true},
    {"id": "L10.audit.writeback",  "ref": "builtin:l10.audit",
     "enabled": true}
  ],
  "defaults": {
    "bypass_allowed_for_roles": ["admin"],
    "max_parallel_actions": 8,
    "timeout_ms": 60000
  }
}
]]></artwork>

        <t>
          The "ref" field is an implementation pointer (plugin ID,
          module path, container image, etc.).  AOCL does not define
          ref resolution semantics; it standardizes only the stack
          structure and layer input/output contracts.
        </t>
      </section>

      <section anchor="stack-dag">
        <name>DAG Mode</name>

        <t>
          DAG mode arranges layers as nodes in a directed acyclic
          graph with conditional edges.  This mode supports conditional
          routing, parallel branches, fast-path exits, and restricted
          execution paths.
        </t>

        <t>
          A DAG stack definition MUST include a stack_id, version,
          mode set to "dag", an array of nodes, and an array of edges.
          Each edge MUST include "from" and "to" fields, and MAY
          include a "when" condition.
        </t>

        <artwork type="json"><![CDATA[
{
  "stack_id": "default-dag",
  "version": "0.1",
  "mode": "dag",
  "nodes": [
    {"id": "L0.ingress.normalize",
     "ref": "builtin:l0.normalize"},
    {"id": "L1.identity.scope",
     "ref": "builtin:l1.identity"},
    {"id": "L2.route.smart",
     "ref": "builtin:l2.router"},
    {"id": "L3.policy.gate",
     "ref": "builtin:l3.policy"},
    {"id": "L5.context.retrieve",
     "ref": "builtin:l5.context"},
    {"id": "L7.delegate.execute",
     "ref": "builtin:l7.delegate"},
    {"id": "L9.assemble.respond",
     "ref": "builtin:l9.respond"},
    {"id": "L10.audit.writeback",
     "ref": "builtin:l10.audit"},
    {"id": "BR.realtime_alert",
     "ref": "builtin:branch.alert_fast"},
    {"id": "BR.restricted_mode",
     "ref": "builtin:branch.restricted"}
  ],
  "edges": [
    {"from": "L0.ingress.normalize",
     "to": "L1.identity.scope"},
    {"from": "L1.identity.scope",
     "to": "L2.route.smart"},
    {"from": "L2.route.smart",
     "to": "L9.assemble.respond",
     "when": "control.halt_pipeline == true"},
    {"from": "L2.route.smart",
     "to": "L3.policy.gate",
     "when": "control.halt_pipeline != true"},
    {"from": "L3.policy.gate",
     "to": "BR.restricted_mode",
     "when": "control.require_hitl == true"},
    {"from": "L3.policy.gate",
     "to": "L5.context.retrieve",
     "when": "control.require_hitl != true"},
    {"from": "L5.context.retrieve",
     "to": "L7.delegate.execute"},
    {"from": "L7.delegate.execute",
     "to": "L9.assemble.respond"},
    {"from": "L9.assemble.respond",
     "to": "L10.audit.writeback"}
  ],
  "defaults": {
    "max_parallel_actions": 8,
    "timeout_ms": 60000
  }
}
]]></artwork>

        <t>
          The "when" field is expressed as a string condition.
          In this version of the specification, implementations
          MAY treat it as simple boolean expressions over
          "context" and "control" namespaces.  A formal expression
          language is deferred to future revisions.
        </t>

        <t>
          Branch nodes (prefixed with "BR.") MAY represent sub-stacks
          that contain their own layer sequences.  The resolution of
          branch node internals is implementation-defined.
        </t>
      </section>

      <section anchor="stack-variants">
        <name>Variant Stacks</name>

        <t>
          Implementations are encouraged to define variant stacks
          tailored to specific workload classes.  The following
          variants are RECOMMENDED:
        </t>

        <dl>
          <dt>realtime-alert (Speed-First)</dt>
          <dd>
            Prioritizes latency over thoroughness.  Typical flow:
            normalize, identity, policy, delegate, respond, audit.
            Skips heavy planning and context retrieval unless
            explicitly required.
          </dd>

          <dt>deep-research (Evidence-First)</dt>
          <dd>
            Prioritizes evidence quality and verification.  Adds
            stronger context retrieval (multi-source), always-on
            verification and evaluation, and tighter evidence
            requirements in the audit partition.
          </dd>

          <dt>restricted-textonly (Safety-First)</dt>
          <dd>
            Disables tool execution entirely.  The policy gate forces
            text-only mode, and delegation becomes analysis-only or
            defers to human-in-the-loop decision making.
          </dd>
        </dl>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 8: AEE Binding                                        -->
    <!-- ============================================================ -->
    <section anchor="aee-binding">
      <name>AEE Binding</name>

      <t>
        AOCL is designed to work alongside the Agent Envelope Exchange
        (AEE) protocol <xref target="AEE"/>.  AEE standardizes the
        message envelope for agent-to-agent and human-to-agent
        exchange, providing identity, intent, and causality semantics.
        AOCL standardizes the layered control pipeline that an
        orchestrator runs to decide what happens.
      </t>

      <t>
        This binding defines how AOCL uses AEE without requiring any
        changes to the AEE envelope specification.  AOCL operates
        entirely through intent conventions and payload schemas
        within existing AEE envelope types.
      </t>

      <section anchor="aee-types">
        <name>Envelope Types Used</name>

        <t>
          AOCL uses existing AEE envelope type categories:
        </t>

        <dl>
          <dt>task</dt>
          <dd>Emitted when AOCL delegates work to an agent or
              worker.</dd>

          <dt>result</dt>
          <dd>Received when an agent or worker returns completed
              work.</dd>

          <dt>event</dt>
          <dd>Emitted when AOCL produces an audit record (layer
              enter, exit, or decision).</dd>

          <dt>stream</dt>
          <dd>Optionally emitted for incremental traces or
              long-running layer output.</dd>

          <dt>error</dt>
          <dd>Emitted when a layer or delegated work fails in a
              structured way.</dd>
        </dl>

        <t>
          AOCL does not require any new AEE type values.
        </t>
      </section>

      <section anchor="aee-intents">
        <name>Intent Namespace</name>

        <t>
          AOCL defines the following intent namespace for layer-level
          audit and control.  All intents use the "aocl." prefix:
        </t>

        <table>
          <thead>
            <tr>
              <th>Intent</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>aocl.stack.select</td>
              <td>Stack selection decision</td>
            </tr>
            <tr>
              <td>aocl.layer.enter</td>
              <td>Layer activation (entry)</td>
            </tr>
            <tr>
              <td>aocl.layer.exit</td>
              <td>Layer completion (exit)</td>
            </tr>
            <tr>
              <td>aocl.layer.decision</td>
              <td>Layer decision with coded reasons</td>
            </tr>
            <tr>
              <td>aocl.context.patch</td>
              <td>Context bundle modification (delta)</td>
            </tr>
            <tr>
              <td>aocl.control.branch</td>
              <td>Branch decision (alternate path taken)</td>
            </tr>
            <tr>
              <td>aocl.control.bypass</td>
              <td>Layer bypass decision</td>
            </tr>
            <tr>
              <td>aocl.verify.result</td>
              <td>Verification outcome</td>
            </tr>
            <tr>
              <td>aocl.run.summary</td>
              <td>Complete run summary</td>
            </tr>
          </tbody>
        </table>

        <t>
          For business-level delegation, AOCL does not impose intent
          names.  Delegated tasks use the caller's intent (e.g.,
          "ops.backup.status.check") or a derived intent convention
          appropriate to the domain.
        </t>
      </section>

      <section anchor="aee-correlation">
        <name>Correlation Strategy</name>

        <t>
          All envelopes generated during processing of a single work
          item MUST share the same "corr" (correlation) value as the
          originating request envelope.  This enables grep-able traces
          across layer events, agent tasks and results, verification
          records, and final responses.
        </t>

        <t>
          AOCL supports two reply-chaining strategies for the
          "reply_to" field:
        </t>

        <dl>
          <dt>Strategy A: Root-linked (RECOMMENDED)</dt>
          <dd>
            All AOCL layer events set reply_to to the originating
            request envelope ID.  All delegated tasks also set
            reply_to to the originating request.  This is the
            simplest strategy and is RECOMMENDED for initial
            implementations.  Ordering is inferred from timestamps.
          </dd>

          <dt>Strategy B: Span-linked</dt>
          <dd>
            Each layer event sets reply_to to the previous layer
            event, forming a strict causal chain.  Delegated tasks
            set reply_to to the layer decision event that emitted
            the task.  This strategy provides explicit causal
            ordering suitable for APM-like trace visualization,
            at the cost of more complex envelope management.
          </dd>
        </dl>

        <t>
          Implementations SHOULD choose one strategy and apply it
          consistently within a deployment.  Mixing strategies within
          a single processing run is NOT RECOMMENDED.
        </t>
      </section>

      <section anchor="aee-payloads">
        <name>Payload Patterns</name>

        <t>
          AOCL layer envelopes SHOULD NOT contain the full context
          bundle.  Instead, payloads SHOULD include only the
          following fields:
        </t>

        <dl>
          <dt>run_id</dt>
          <dd>Orchestration run identifier.</dd>

          <dt>layer</dt>
          <dd>Object containing "id" and "version" of the layer.</dd>

          <dt>decisions</dt>
          <dd>Array of objects, each with "code" and "reason"
              fields.</dd>

          <dt>delta</dt>
          <dd>Context patch or merge delta (small, not full
              context).</dd>

          <dt>refs</dt>
          <dd>Array of string references to large data objects.</dd>

          <dt>digests</dt>
          <dd>Map of digest names to digest values for integrity
              verification and replay support.</dd>

          <dt>control</dt>
          <dd>Control flags (halt_pipeline, require_hitl, branch_to,
              bypass_layers).</dd>

          <dt>timing_ms</dt>
          <dd>Optional layer execution duration for observability.</dd>
        </dl>

        <t>
          The following example shows an AOCL layer decision emitted
          as an AEE event envelope:
        </t>

        <artwork type="json"><![CDATA[
{
  "v": "1",
  "id": "01AOCL_LAYER_EVENT_0001",
  "ts": "2026-01-26T12:00:01Z",
  "type": "event",
  "from": "agent.orchestrator",
  "to": "log.aocl",
  "intent": "aocl.layer.decision",
  "corr": "01AOCL_CORR_0001",
  "reply_to": "01ORIGIN_TASK_0001",
  "trace": null,
  "priority": "normal",
  "requires": null,
  "payload": {
    "run_id": "RUN-01AOCL-0001",
    "layer": {
      "id": "L3.policy.gate",
      "version": "0.1"
    },
    "decisions": [
      {
        "code": "POLICY_ALLOW",
        "reason": "No restricted content; tools allowed: read-only"
      }
    ],
    "delta": {
      "C4.Policy.allowed_tools": ["tool.readonly.*"],
      "C5.Execution.mode": "restricted-readonly"
    },
    "refs": [],
    "digests": {
      "context_in": "sha256:abc123...",
      "context_out": "sha256:def456..."
    },
    "control": {
      "halt_pipeline": false
    }
  },
  "sig": null
}
]]></artwork>

        <t>
          The following example shows an AOCL delegation emitted as
          an AEE task envelope:
        </t>

        <artwork type="json"><![CDATA[
{
  "v": "1",
  "id": "01AOCL_DELEGATE_TASK_0001",
  "ts": "2026-01-26T12:00:03Z",
  "type": "task",
  "from": "agent.orchestrator",
  "to": "agent.backup_auditor",
  "intent": "ops.backup.status.check",
  "corr": "01AOCL_CORR_0001",
  "reply_to": "01ORIGIN_TASK_0001",
  "trace": null,
  "priority": "high",
  "requires": {
    "timeout_ms": 30000,
    "evidence": true
  },
  "payload": {
    "cluster_ref": "inv://clusters/node.lan",
    "window": "24h",
    "context_refs": [
      "mem://run/RUN-01AOCL-0001/context-snapshot"
    ]
  },
  "sig": null
}
]]></artwork>

        <t>
          Note that the "to" field is a logical sink identifier
          (e.g., "log.aocl", "agent.backup_auditor") that MAY map
          to a file, message queue topic, streaming subject, or
          any other transport endpoint.  The AOCL semantics are
          carried entirely in the intent and payload fields, while
          the AEE envelope structure remains stable and unchanged.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- Section 9: Bypass and Branch Decisions                        -->
    <!-- ============================================================ -->
    <section anchor="bypass-branch">
      <name>Bypass and Branch Decisions</name>

      <t>
        AOCL supports two forms of control-flow deviation: bypasses
        (skipping one or more layers) and branches (taking an alternate
        execution path).  Both forms are permitted but MUST be
        explicitly audited.
      </t>

      <section anchor="bypass-rules">
        <name>Bypass Requirements</name>

        <t>
          When a layer bypass is requested or applied, the orchestrator
          MUST emit an AEE event envelope with intent
          "aocl.control.bypass" containing:
        </t>

        <ul>
          <li>The identity of the requester (from C1);</li>
          <li>The list of layers that were skipped;</li>
          <li>Whether the bypass was allowed or denied;</li>
          <li>The policy or rule that permitted the bypass.</li>
        </ul>

        <t>
          Stacks SHOULD declare bypass policy in their configuration.
          The following example shows a bypass policy declaration:
        </t>

        <artwork type="json"><![CDATA[
{
  "bypass_policy": {
    "allowed_roles": ["admin"],
    "never_bypass": [
      "L1.identity.scope",
      "L3.policy.gate"
    ],
    "audit_required": true
  }
}
]]></artwork>

        <t>
          Implementations SHOULD NOT allow bypass of the identity
          layer (L1.identity.scope) or the policy layer
          (L3.policy.gate) in production deployments.  If bypass
          of these layers is permitted (e.g., in development or
          testing environments), the orchestrator MUST still emit
          a bypass audit record.
        </t>
      </section>

      <section anchor="branch-rules">
        <name>Branch Requirements</name>

        <t>
          When the orchestrator takes a branch (alternate execution
          path), it MUST emit an AEE event envelope with intent
          "aocl.control.branch" containing:
        </t>

        <ul>
          <li>The layer or node that initiated the branch;</li>
          <li>The target branch destination;</li>
          <li>The reason the branch was taken (e.g., policy
              restriction, fast-path match, HITL requirement).</li>
        </ul>

        <t>
          Branch decisions are typically emitted by the smart router
          (L2) or the policy gate (L3), but any layer MAY produce
          branch control flags if the stack configuration permits it.
        </t>
      </section>

      <section anchor="bypass-branch-audit">
        <name>Audit Completeness</name>

        <t>
          The combination of bypass and branch audit records, together
          with layer enter/exit events, MUST provide a complete and
          reconstructable picture of which layers were executed, which
          were skipped, and which alternate paths were taken for every
          processing run.  An observer with access to the audit trail
          MUST be able to reconstruct the exact execution path without
          any implicit or hidden state transitions.
        </t>
      </section>
    </section>

  


    <!-- ============================================================ -->
    <!-- Security Considerations                                       -->
    <!-- ============================================================ -->
    <section anchor="security">
      <name>Security Considerations</name>

      <t>
        AOCL is a control-plane protocol that governs how AI agent
        operations flow through identity, policy, execution, and audit
        stages.  The security properties of a deployment depend
        critically on the integrity of each layer and the
        trustworthiness of the orchestrator.  This section describes
        the primary security considerations.
      </t>

      <section anchor="sec-policy">
        <name>Policy Enforcement Integrity</name>

        <t>
          The policy gate (L3.policy.gate) is the primary governance
          checkpoint.  If an attacker can manipulate, bypass, or
          disable this layer, they can cause the orchestrator to
          execute actions that violate organizational policies.
          Implementations MUST ensure that the policy layer cannot be
          circumvented through context manipulation, layer
          reconfiguration, or control-flag injection.
        </t>

        <t>
          Policy rules SHOULD be loaded from a trusted, integrity-
          protected source.  Changes to policy configuration SHOULD
          require authenticated authorization and SHOULD themselves
          be audited.
        </t>
      </section>

      <section anchor="sec-bypass">
        <name>Bypass Audit Trail Requirements</name>

        <t>
          Layer bypasses represent a significant security-relevant
          event.  The bypass audit trail is the primary mechanism for
          detecting unauthorized control-flow deviations.
          Implementations MUST ensure that:
        </t>

        <ul>
          <li>Bypass audit records cannot be suppressed, deleted, or
              modified after emission;</li>
          <li>Bypass audit records are written to a separate, append-
              only audit sink when possible;</li>
          <li>Bypass of identity (L1) and policy (L3) layers is
              prohibited in production unless explicitly authorized
              by a privileged role and documented in the bypass
              policy configuration;</li>
          <li>All bypass records include the authenticated identity
              of the requester, not merely a self-asserted identity.</li>
        </ul>
      </section>

      <section anchor="sec-identity">
        <name>Identity Trust Model</name>

        <t>
          The identity layer (L1.identity.scope) populates the C1
          partition that all subsequent layers rely on for access
          control decisions.  If the identity layer produces incorrect
          or forged identity information, all downstream policy
          enforcement and access control becomes unreliable.
        </t>

        <t>
          Implementations MUST use authenticated identity sources
          (e.g., verified tokens, mutual TLS, signed assertions)
          rather than self-reported identity claims.  The identity
          layer SHOULD validate identity assertions against a trusted
          identity provider before populating C1.
        </t>

        <t>
          When AOCL operates in a multi-tenant environment,
          implementations MUST ensure that identity scoping prevents
          cross-tenant data access through context bundle isolation
          or equivalent mechanisms.
        </t>
      </section>

      <section anchor="sec-isolation">
        <name>Layer Isolation</name>

        <t>
          Layers SHOULD be isolated from one another to prevent a
          compromised or malfunctioning layer from corrupting the
          context bundle or control flags of other layers.  The
          orchestrator SHOULD validate context bundle modifications
          against expected schemas and reject unexpected mutations.
        </t>

        <t>
          When layers are implemented as external services or plugins,
          the orchestrator SHOULD authenticate layer implementations
          and validate their outputs.  A malicious layer implementation
          could inject false decisions, corrupt the context bundle, or
          emit misleading audit records.
        </t>

        <t>
          The delegation layer (L7.delegate.execute) poses particular
          isolation challenges because it invokes external agents and
          tools.  Implementations SHOULD sandbox delegated execution
          and validate returned results against expected schemas
          before incorporating them into the context bundle.
        </t>
      </section>

      <section anchor="sec-dos">
        <name>Denial of Service through Layer Abuse</name>

        <t>
          An attacker who can submit intents to the orchestrator may
          attempt to cause denial of service by:
        </t>

        <ul>
          <li>Submitting events that trigger expensive layers
              (e.g., large-scale context retrieval in L5 or
              unbounded delegation in L7);</li>
          <li>Crafting inputs that cause verification loops between
              L7 and L8;</li>
          <li>Exploiting DAG edge conditions to create long or
              resource-intensive execution paths;</li>
          <li>Generating excessive audit records to overwhelm the
              audit sink.</li>
        </ul>

        <t>
          Implementations SHOULD enforce resource budgets at the
          stack level (timeout_ms, max_parallel_actions) and at
          individual layer level.  The orchestrator SHOULD implement
          rate limiting on incoming intents and circuit breakers on
          layers that exhibit abnormal latency or error rates.
          Verification loops (L7 to L8 retry cycles) MUST be
          bounded by a configurable maximum retry count.
        </t>
      </section>

      <section anchor="sec-confidentiality">
        <name>Context Bundle Confidentiality</name>

        <t>
          The context bundle may contain sensitive information
          across multiple partitions: authentication credentials in
          C1, proprietary task details in C2, retrieved knowledge in
          C3, and policy rules in C4.  Implementations MUST protect
          the context bundle from unauthorized access during
          transmission between layers and at rest.
        </t>

        <t>
          When layers are distributed across network boundaries,
          the context bundle MUST be transmitted over encrypted
          channels (e.g., TLS).  When layers are implemented by
          third-party services, the orchestrator SHOULD apply
          data minimization by providing only the context partitions
          that a layer requires, rather than the full bundle.
        </t>

        <t>
          Audit records emitted as AEE envelopes contain context
          deltas that may include sensitive data.  Implementations
          SHOULD apply redaction rules from C1 to audit payloads
          before persisting them, or ensure that audit sinks have
          equivalent access protections to the data sources
          referenced in the context bundle.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- IANA Considerations                                           -->
    <!-- ============================================================ -->
    <section anchor="iana">
      <name>IANA Considerations</name>

      <t>This document has no IANA actions.</t>
    </section>

  </middle>

  <back>

    <references>
      <name>References</name>

      <references>
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml"/>
      </references>

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

        <reference anchor="AEE" target="https://github.com/AdaminX/AEE-Agent-Envelope-Exchange">
          <front>
            <title>Agent Envelope Exchange (AEE)</title>
            <author initials="A." surname="Cowles" fullname="Adam Cowles"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cowles-aee-00"/>
        </reference>

        <reference anchor="VOLT" target="https://github.com/AdaminX/VOLT-Protocol">
          <front>
            <title>Verifiable Operations Ledger and Trace (VOLT)</title>
            <author initials="A." surname="Cowles" fullname="Adam Cowles"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-cowles-volt-00"/>
        </reference>
      </references>

    </references>

    <section numbered="false">
      <name>Acknowledgements</name>
      <t>
        The author wishes to thank the early adopters and reviewers of
        the AOCL specification within the Quox ecosystem, whose feedback
        on real-world agent orchestration challenges shaped the design
        of this control-layer protocol.
      </t>
    </section>

  </back>

</rfc>