<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<rfc ipr="trust200902"
     category="exp"
     submissionType="independent"
     docName="draft-gaikwad-south-authorization-00"
     version="3">

  <front>
    <title abbrev="SOUTH">SOUTH: Stochastic Authorization for Agent and Service Requests</title>

    <author fullname="Madhava Gaikwad" initials="M." surname="Gaikwad">
      <organization>Independent Researcher </organization>
      <address>
        <email>gaikwad.madhav@gmail.com</email>
      </address>
    </author>

    <date year="2025" month="November" day="28"/> 

    <abstract>
      <t>SOUTH defines an authorization protocol for evaluating requests
        issued by users, services, or autonomous agents. SOUTH allows a
        server to return a deterministic decision or an allow decision
        that is issued with a probability determined by local policy.
        This enables servers to incorporate uncertainty, contextual
        information, and load conditions into authorization decisions.
      </t>
      <t>
        SOUTH is transport independent and can be composed with existing
        authentication mechanisms such as OAuth, OpenID Connect, mutual
        TLS, or DPoP. This document describes the request and response
        objects, decision semantics, and an HTTP binding for
        interoperable deployment.
      </t>
    </abstract>
  </front>

  <middle>

    <section anchor="intro" numbered="true">


      <name>Introduction</name>
      <t>
        Systems that act on behalf of users or other services must decide
        whether a requested operation is permitted. Traditional authorization
        mechanisms rely on deterministic evaluation of attributes, roles,
        or policy rules. These mechanisms are effective in constrained
        environments, but they do not represent uncertainty, context
        variation, or adaptive behavior that arise in modern agent driven
        systems.
      </t>

      <t>
        SOUTH defines a small authorization protocol that allows a server
        to return either a deterministic decision or a probabilistic allow
        decision. A server evaluates a structured request, computes a
        preference score, and maps this score to a decision. SOUTH also
        supports retry and defer outcomes that allow a server to signal
        transient conditions, such as load or missing context. SOUTH does
        not replace authentication or identity. Instead, it complements
        existing identity systems by defining a consistent authorization
        interface.
      </t>
      <t>
  The name SOUTH is derived from "Stochastic Auth." It reflects the
  protocol's ability to express authorization decisions that may include
  probabilistic behavior, allowing servers to map preference scores or
  contextual signals to non-deterministic outcomes when required by
  policy.
</t>
      <t>
        The protocol is transport independent. It can be used with HTTP,
        message queues, or local control interfaces. It can also be paired
        with authentication and integrity mechanisms such as OAuth based
        flows, OpenID Connect, mutual TLS, or DPoP proof of possession.
        SOUTH does not define how preference scores are computed. It defines
        the request and response structures and the semantics of decisions
        returned by a server.
      </t>

      <t>
        SOUTH can be used by user agents, machine learning agents, service
        meshes, schedulers, MTAs, SDN controllers, and similar components
        that require an explicit authorization decision for a proposed
        action. This document describes terminology, message formats,
        decision semantics, transport bindings, and operational
        considerations for interoperable use.
      </t>
    </section>

        <section anchor="terminology" numbered="true">


          <name>Terminology</name>
      <t>
        The terms defined in this section are used throughout this
        document. These definitions are specific to the SOUTH protocol.
      </t>

      <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"/> and <xref target="RFC8174"/>
    when, and only when, they appear in all capitals.
  </t>

        <dl>
          <dt>Client</dt>
          <dd>
            <t>The entity that sends a SOUTH request. A client may be a user
            agent, an automated agent, a service, a scheduler, or any
            component that requires an authorization decision for a
            proposed operation.</t>
          </dd>

          
          <dt>Server</dt>
          <dd>
            <t>The entity that evaluates a SOUTH request and returns a
            decision. A server applies local policy to determine whether
            a request should be allowed, denied, retried, or deferred.</t>
          </dd>

          
          <dt>Request</dt>
          <dd>
            <t>A structured object that describes the operation the client
            wishes to perform. A request includes an action, a target,
            and optional context that assists the server in making a
            decision.</t>
          </dd>

          
          <dt>Decision</dt>
          <dd>
            <t>The outcome returned by a SOUTH server. Decisions include
            allow, deny, retry, defer, and error. SOUTH does not assign
            meaning to application level outcomes beyond these states.</t>
          </dd>

          
          <dt>Preference Score</dt>
          <dd>
            <t>A numerical value in the interval [0, 1] that reflects how
            compatible a request is with server policy. SOUTH does not
            specify how the score is computed. The server maps the score
            to a decision.</t>
          </dd>

          
          <dt>Stochastic Allow</dt>
          <dd>
            <t>A mode where the server returns an allow decision with a
            probability derived from the preference score. The exact
            mapping is defined by server policy.</t>
          </dd>

          
          <dt>Context Attachment</dt>
          <dd>
            <t>Additional information supplied by the client or collected by
            the server that provides signals relevant to the decision.
            Examples include rate information, environmental data, recent
            behavior, or device posture. Context attachment formats are
            implementation dependent.</t>
          </dd>

          
          <dt>Integrity Binding</dt>
          <dd>
            <t>A method used to ensure that the request has not been
            modified and that the sender can prove possession of a key.
            SOUTH is transport independent and can be paired with
            mechanisms such as mutual TLS or DPoP.</t>
          </dd>
        </dl>
    </section>

        <section anchor="motivation" numbered="true">


          <name>Motivation</name>
      <t>Authorization mechanisms used in current systems are largely
        deterministic. A request is evaluated against a set of rules or
        attributes, and the server returns an allow or deny outcome.
        These mechanisms work well when policies are simple and when the
        environment is stable. Many modern deployments no longer meet
        these conditions.
      </t>

      <t>
        Agent driven systems, service meshes, serverless frameworks, and
        automated workflows issue requests whose safety depends on
        transient information such as current load, recent behavior,
        signal quality, or incomplete state. A deterministic policy
        cannot represent these conditions without either becoming overly
        restrictive or overly permissive. Systems often fall back on
        large sets of static rules that do not scale and are difficult to
        maintain.
      </t>

      <t>
        SOUTH introduces a small protocol that allows a server to encode
        preference and uncertainty directly. A server evaluates a
        structured request, computes a score, and maps this score to a
        decision. The server may return a deterministic allow or deny
        decision or may choose a probabilistic allow when the score falls
        in an uncertain range. SOUTH also supports explicit retry and
        defer outcomes so that clients can distinguish between a stable
        deny and a temporary condition.
      </t>

      <t>
        This approach provides two benefits. First, it allows a server to
        represent policies that depend on contextual or uncertain
        information without expanding the policy surface. Second, it
        gives clients clear signals about whether a denial is final or
        whether a request may succeed after obtaining more context or
        waiting for transient conditions to change.
      </t>

      <t>
        SOUTH is intended for systems that require lightweight
        authorization decisions between components that operate at high
        frequency or under shifting operational context. This aligns with zero trust principles <xref target="NIST-ZT"/>. It can be used
        by user agents, machine learning agents, schedulers, MTAs, SDN
        controllers, and other components that need explicit authorization
        semantics for proposed operations.
      </t>
    </section>

        <section anchor="design-goals" numbered="true">


          <name>Design Goals and Non-Goals</name>
      <t>
        This section states the main design goals for SOUTH and clarifies
        which problems are outside the scope of this document.
      </t>

      <section anchor="design-goals-goals" numbered="true">


        <name>Design Goals</name>
        <t>
          SOUTH is designed with the following goals.
        </t>

        <t></t>
        <ul>
            <li><strong>Simple decision interface.</strong>
              SOUTH provides a small set of decision outcomes such as
              allow, deny, retry, and defer. The protocol does not try to
              encode full policy logic on the wire. Policy remains on the
              server.</li>

            
            <li><strong>Stochastic authorization.</strong>
              SOUTH allows a server to map internal preference scores to
              probabilistic allow decisions. This supports policies that
              depend on uncertain signals or that aim to reduce
              predictability for probing clients.</li>

            
            <li><strong>Transport independence.</strong>
              SOUTH defines request and response objects that are not tied
              to one specific transport. An HTTP binding is described in
              this document, but other bindings can be defined by
              deployment specific profiles.</li>

            
            <li><strong>Compatibility with existing identity.</strong>
              SOUTH is intended to work alongside existing authentication
              and identity systems, such as OAuth based flows, OpenID
              Connect, mutual TLS, and DPoP. It does not define its own
              identity model.</li>

            
            <li><strong>Low integration cost.</strong>
              SOUTH can be called by existing components as an external
              decision service. A client can construct a request object,
              send it to a SOUTH server, and apply the returned decision
              without changes to its internal policy representation.</li>

            
            <li><strong>Clear denial semantics.</strong>
              SOUTH distinguishes between a stable deny, a temporary
              condition, and a request that should be retried or stepped
              up. This allows clients to react appropriately to
              authorization outcomes.</li>
        </ul>
      </section>

      <section anchor="design-goals-nongoals" numbered="true">


        <name>Non-Goals</name>
        <t>SOUTH does not attempt to solve the following problems.
        </t>

        <t></t>
        <ul>
            <li><strong>Authentication and identity.</strong>
              SOUTH does not define how clients or servers authenticate.
              It assumes that deployments use existing mechanisms such as
              mutual TLS, OAuth, OpenID Connect, or similar protocols.</li>

            
            <li><strong>Policy language definition.</strong>
              SOUTH does not define a policy language or a rule syntax.
              It defines only the interface for exchanging decisions.
              Policy representation and evaluation are local choices.</li>

            
            <li><strong>Data plane enforcement.</strong>
              SOUTH does not specify how decisions are enforced in data
              planes, such as packet forwarding hardware or message
              brokers. Enforcement mechanisms are outside the scope of
              this document.</li>

            
            <li><strong>Global consistency.</strong>
              SOUTH does not attempt to provide globally consistent
              authorization views across multiple servers. Any replication
              or coordination of policy state is the responsibility of the
              deployment.</li>

            
            <li><strong>End to end security proofs.</strong>
              SOUTH is a building block. It does not provide a complete
              security framework for all authorization use cases and does
              not claim end to end security guarantees by itself.</li>
        </ul>
      </section>
    </section>

        <section anchor="architecture" numbered="true">


          <name>Architecture</name>
      <t>SOUTH is designed as a decision service that can be called by
        different types of clients. The protocol defines a logical client
        role, a server role, and supporting components such as policy
        stores and identity providers. SOUTH does not constrain how these
        roles are deployed or how they are mapped to physical systems.
      </t>

      <section anchor="architecture-roles" numbered="true">


        <name>Roles</name>
        <t>
          The SOUTH architecture includes the following logical roles.
        </t>

        <t></t>
        <dl>
          <dt>Client</dt>
          <dd>
            <t>The client constructs a SOUTH request, sends it to a server,
              and applies the returned decision. Clients may be user
              agents, automated agents, application services, schedulers,
              mail transfer agents, or network controllers.</t>
          </dd>

            
          <dt>Server</dt>
          <dd>
            <t>The server receives SOUTH requests, evaluates them against
              local policy and context, and returns decisions. A server
              may be implemented as a standalone service, as a component
              within a larger system, or as a library linked into an
              application.</t>
          </dd>

            
          <dt>Policy Store</dt>
          <dd>
            <t>A policy store holds configuration and rules that the
              server uses to evaluate requests. The format and location of
              the policy store are not specified by SOUTH. A policy store
              may be a configuration file, a database, or an external
              policy engine.</t>
          </dd>

            
          <dt>Identity Provider</dt>
          <dd>
            <t>An identity provider issues credentials or tokens that
              clients use to authenticate to the server. SOUTH does not
              define identity provider behavior but assumes that servers
              can validate client identities using existing mechanisms.</t>
          </dd>
        </dl>
      </section>

      <section anchor="architecture-interaction" numbered="true">


        <name>Interaction Model</name>
        <t>The basic interaction pattern in SOUTH consists of a single
          request followed by a single response.
        </t>

        <t></t>
        <ol>
            <li>The client constructs a request object that describes the
              proposed operation. The request includes information about
              the acting subject, the action to be performed, the target
              object, and optional context.</li>
            
            <li>The client sends the request to the server using a chosen
              transport. An HTTP binding using JSON is described in this
              document. Other bindings may be defined in separate
              documents.</li>
            
            <li>The server evaluates the request according to local policy.
              The server may consult its policy store, fetch additional
              context, or apply internal scoring models.</li>
            
            <li>The server returns a response that contains a decision and
              optional metadata. The decision indicates whether the
              operation is allowed, denied, should be retried, or should
              be deferred. The response may include a probability or
              score for diagnostic or logging purposes.</li>
            
            <li>The client applies the decision. For example, a client may
              proceed with the operation, block it, queue it for later
              retry, or prompt for additional verification, depending on
              local behavior.</li>
        </ol>

        <t>SOUTH does not specify how many requests a client may send or
          how servers handle concurrent requests. These aspects are
          deployment choices. Implementations are expected to apply
          standard practices for rate limiting, timeouts, and failure
          handling.
        </t>
      </section>

      <section anchor="architecture-deployment" numbered="true">


        <name>Deployment Patterns</name>
        <t>
          SOUTH can be deployed in several patterns. This document does
          not mandate any specific topology, but the following patterns
          are expected to be common.
        </t>

        <t></t>
        <ul>
            <li><strong>Central decision service.</strong>
              A dedicated SOUTH server receives requests from many
              clients and applies shared policy. This is suitable for
              environments that want a single authorization view across
              multiple systems.</li>

            
            <li><strong>Sidecar or local proxy.</strong>
              A SOUTH server runs next to an application component and
              serves only that component. This avoids network hops but
              keeps policy evaluation separate from application logic.</li>

            
            <li><strong>Library integration.</strong>
              SOUTH evaluation is implemented as a library linked into a
              client or gateway. The wire protocol may still be used for
              audit, testing, or cross language integration, but is not
              required for every decision.</li>

            
            <li><strong>Controller integration.</strong>
              A control plane component, such as a service mesh
              controller, scheduler, or SDN controller, calls SOUTH
              during its own decision flow. The controller then programs
              local enforcement points based on the SOUTH decision.</li>
        </ul>

        <t>In all patterns, SOUTH is intended to run in the control plane
          or management plane. Enforcement in data planes, such as packet
          forwarding paths or storage engines, is outside the scope of
          the protocol. Implementations are expected to map SOUTH
          decisions to local enforcement mechanisms.
        </t>
      </section>
    </section>

        <section anchor="decision-semantics" numbered="true">


          <name>Decision Semantics</name>
      <t>
        SOUTH defines a small set of decision outcomes that a server can
        return to a client. These outcomes are intended to be stable
        across deployments so that clients can react consistently, even
        when policy and scoring logic differ between servers.
      </t>

      <section anchor="decision-semantics-overview" numbered="true">


        <name>Overview</name>
        <t>
          A SOUTH server evaluates a request and returns exactly one
          primary decision. The decision describes how the client should
          treat the requested operation. The server may include
          additional metadata, such as a numerical score or a probability
          value, but the primary decision is authoritative.
        </t>

        <t>
          This document groups decisions into four categories:
        </t>

        <t></t>
        <ul>
            <li>Allow decisions, where the server authorizes the request.</li>
            
            <li>Deny decisions, where the server does not authorize the
              request.</li>
            
            <li>Retry and defer decisions, where the server indicates that
              the request might succeed later.</li>
            
            <li>Error outcomes, where the server cannot evaluate the
              request.</li>
        </ul>
      </section>

      <section anchor="decision-semantics-deterministic" numbered="true">


        <name>Deterministic Allow and Deny</name>
        <t>In the deterministic mode, the server returns an explicit allow
          or deny decision. Clients that do not use stochastic behavior
          can treat SOUTH as a standard binary authorization protocol.
        </t>

        <t></t>
        <dl>
          <dt>allow</dt>
          <dd>
            <t>The server authorizes the requested operation. The client
              is expected to proceed, subject to any local enforcement or
              application constraints. An allow decision indicates that
              the server does not require additional checks for this
              request.</t>
          </dd>

            
          <dt>deny</dt>
          <dd>
            <t>The server does not authorize the requested operation. The
              client must not perform the operation. A deny decision
              indicates that the server regards the request as
              incompatible with current policy and that the decision is
              stable with respect to the information available.</t>
          </dd>
        </dl>

        <t>A server that does not implement stochastic behavior or retry
          semantics can restrict itself to allow and deny decisions.
        </t>
      </section>

      <section anchor="decision-semantics-stochastic" numbered="true">


        <name>Stochastic Allow</name>
        <t>
          SOUTH supports a stochastic mode where the server produces an
          allow decision based on a probability derived from its internal
          preference score. In this mode, the server evaluates the
          request, computes a score in the interval [0, 1], and maps this
          score to a probability of authorization.
        </t>

        <t>
          The exact mapping from score to probability is a matter of
          local policy. A simple example is a threshold rule where scores
          above a high threshold always allow, scores below a low
          threshold always deny, and scores in between allow with a
          probability that increases with the score.
        </t>

        <t>
          When a server uses stochastic behavior, the primary decision
          seen by the client is still allow or deny. SOUTH does not
          define a separate decision token for stochastic allow. Instead,
          the server may include an optional field that reports the
          probability or score that was used to produce the decision.
        </t>

        <t>
          From the client perspective, a stochastic allow is processed in
          the same way as a deterministic allow. The distinction is a
          server side choice that affects how often allow decisions are
          produced near the decision boundary.
        </t>
      </section>

      <section anchor="decision-semantics-retry" numbered="true">


        <name>Retry and Defer</name>
        <t>
          Some authorization outcomes are temporary. A server may be
          overloaded, may be missing required context, or may need the
          client to perform an additional step before a decision can be
          made. SOUTH models these situations through retry and defer
          outcomes.
        </t>

        <t></t>
        <dl>
          <dt>retry</dt>
          <dd>
            <t>The server cannot authorize the request at this time, but
              the client may retry after a delay. The response may
              include a hint such as a suggested retry interval. Clients
              must treat retry as a deny for the current attempt.</t>
          </dd>

            
          <dt>defer</dt>
          <dd>
            <t>The server requests that the client defer the operation and
              possibly perform an additional step, such as step up
              verification or context collection. The exact meaning of
              defer is deployment specific. Clients must not perform the
              requested operation until a later allow decision is
              obtained.</t>
          </dd>
        </dl>

        <t>Retry and defer decisions allow clients to distinguish between
          a stable policy deny and a temporary condition. This distinction
          is important in systems where repeated failures may signal
          misconfiguration, attack, or changes in policy.
        </t>
      </section>

      <section anchor="decision-semantics-error" numbered="true">


        <name>Error Semantics</name>
        <t>
          A server may be unable to evaluate a request. Causes include
          malformed input, lack of required authentication, internal
          faults, or backend unavailability. In such cases, SOUTH
          distinguishes between an authorization decision and a protocol
          or processing error.
        </t>

        <t>
          When a server returns an error, the response indicates that no
          authorization decision has been made. The client must apply its
          own failure policy. For example, a client may choose to fail
          closed and block the operation, or fail open in development
          environments where availability is more important.
        </t>

        <t>
          Implementations should distinguish clearly between deny and
          error. A deny decision is a valid authorization outcome. An
          error indicates that the server did not complete the evaluation.
        </t>
      </section>

      <section anchor="decision-semantics-idempotence" numbered="true">


        <name>Idempotence and Side Effects</name>
        <t>
          SOUTH evaluates authorization decisions only. It does not
          perform the requested operation and does not define any side
          effects beyond logging and internal accounting. Two identical
          requests sent to the same server under the same conditions may
          produce the same decision or, in stochastic mode, may produce
          different outcomes with known probabilities.
        </t>

        <t>
          Clients should treat SOUTH calls as idempotent with respect to
          system state. Any non idempotent behavior, such as consuming
          one time credentials, is a property of the surrounding system,
          not of SOUTH itself.
        </t>
      </section>
    </section>

        <section anchor="request-object" numbered="true">


          <name>Request Object</name>
      <t>
        A SOUTH request is a structured object that describes the
        operation the client wishes to perform. The request object is
        transport independent. This document uses JSON examples for
        clarity, but other encodings are possible.
      </t>

      <section anchor="request-object-fields" numbered="true">


        <name>Fields</name>
        <t>
          A request object contains the fields listed below. Fields
          marked as required MUST be present. Fields marked as optional
          MAY be omitted.
        </t>

        <t></t>
        <dl>
          <dt>request_id (optional)</dt>
          <dd>
            <t>An opaque identifier chosen by the client. When present,
              the server SHOULD copy this value into the response. The
              identifier helps clients correlate responses with
              requests.</t>
          </dd>

            
          <dt>subject (required)</dt>
          <dd>
            <t>An object that describes the actor on whose behalf the
              request is made. The subject object MUST contain at least
              an <tt>id</tt> field and MAY contain a
              <tt>type</tt> field and an
              <tt>attributes</tt> object.</t>
          </dd>

            
          <dt>action (required)</dt>
          <dd>
            <t>An object that describes the operation the client wishes to
              perform. The action object MUST contain a
              <tt>type</tt> field and MAY contain
              additional fields such as <tt>name</tt>
              and <tt>parameters</tt>.</t>
          </dd>

            
          <dt>object (required)</dt>
          <dd>
            <t>An object that describes the target of the operation. The
              object MUST contain at least an <tt>id</tt>
              or <tt>type</tt> field and MAY contain
              an <tt>attributes</tt> object.</t>
          </dd>

            
          <dt>context (optional)</dt>
          <dd>
            <t>An object that carries additional information about the
              environment, such as network location, device posture,
              rates, or time. The structure of the context object is
              deployment specific.</t>
          </dd>

            
          <dt>signals (optional)</dt>
          <dd>
            <t>An object that holds pre computed scores or hints from
              other modules, such as anomaly detectors or rate limiters.
              SOUTH does not define specific signal names.</t>
          </dd>

            
          <dt>extensions (optional)</dt>
          <dd>
            <t>An object reserved for deployment specific fields that are
              not covered by the core model. Extensions MUST NOT change
              the meaning of the core fields.</t>
          </dd>
        </dl>
      </section>

      <section anchor="request-object-subject" numbered="true">


        <name>Subject</name>
        <t>The subject object describes who or what is acting. A minimal
          subject object contains only an identifier. Richer deployments
          may include type and attributes. The following JSON examples
          are illustrative.
        </t>

        <figure anchor="fig-request-subject-basic">
            <name>Basic subject object</name>
            <sourcecode type="json">
{
  "subject": {
    "id": "user-1234"
  }
}
            </sourcecode>
          </figure>

        <figure anchor="fig-request-subject-extended">
            <name>Extended subject object</name>
            <sourcecode type="json">
{
  "subject": {
    "id": "service-api-gateway",
    "type": "service",
    "attributes": {
      "tenant": "tenant-42",
      "roles": ["gateway", "frontend"],
      "auth_method": "mtls"
    }
  }
}
            </sourcecode>
          </figure>
      </section>

      <section anchor="request-object-action" numbered="true">


        <name>Action</name>
        <t>
          The action object describes the requested operation. The
          <tt>type</tt> field identifies the general
          category. The <tt>name</tt> and
          <tt>parameters</tt> fields allow further
          refinement.
        </t>

        <figure anchor="fig-request-action">
            <name>Example action objects</name>
            <sourcecode type="json">
{
  "action": {
    "type": "tool.invoke",
    "name": "database_query",
    "parameters": {
      "query": "SELECT * FROM customers WHERE id = ?"
    }
  }
}
            </sourcecode>
          </figure>

        <t>
          Deployment profiles SHOULD define allowed action types and
          their expected parameters. SOUTH itself does not interpret
          action semantics.
        </t>
      </section>

      <section anchor="request-object-object" numbered="true">


        <name>Object</name>
        <t>
          The object describes the target resource. The identification
          scheme is deployment specific. The object MAY be a logical
          resource such as a table, an API endpoint, a queue, a file, a
          node, or a service.
        </t>

        <figure anchor="fig-request-object-example">
            <name>Example object objects</name>
            <sourcecode type="json">
{
  "object": {
    "id": "customers-table",
    "type": "database.table",
    "attributes": {
      "sensitivity": "high",
      "owner": "finance-team"
    }
  }
}
            </sourcecode>
          </figure>
      </section>

      <section anchor="request-object-context" numbered="true">


        <name>Context and Signals</name>
        <t>
          The context and signals fields allow a client to supply
          additional information that may be relevant for policy
          evaluation. The structure of these fields is not fixed by
          SOUTH. Deployments may define profiles that describe common
          attributes.
        </t>

        <figure anchor="fig-request-context">
            <name>Example context and signals</name>
            <sourcecode type="json">
{
  "context": {
    "ip": "198.51.100.23",
    "location": "region-1",
    "time": "2025-11-27T10:34:12Z",
    "user_agent": "example-client/1.0"
  },
  "signals": {
    "anomaly_score": 0.41,
    "recent_failures": 2
  }
}
            </sourcecode>
          </figure>

        <t>
          Servers MAY ignore unknown context or signal fields. Clients
          SHOULD NOT rely on any specific field being honored unless the
          deployment defines a shared profile.
        </t>
      </section>

      <section anchor="request-object-complete" numbered="true">


        <name>Complete Request Example</name>
        <t>
          The following example shows a complete SOUTH request object in
          JSON form. Line breaks and spacing are for readability.
        </t>

        <figure anchor="fig-request-complete">
            <name>Complete SOUTH request example</name>
            <sourcecode type="json">
{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "subject": {
    "id": "user-1234",
    "type": "user",
    "attributes": {
      "tenant": "tenant-42",
      "roles": ["reader"]
    }
  },
  "action": {
    "type": "tool.invoke",
    "name": "database_query",
    "parameters": {
      "query": "SELECT * FROM customers WHERE id = ?"
    }
  },
  "object": {
    "id": "customers-table",
    "type": "database.table",
    "attributes": {
      "sensitivity": "high"
    }
  },
  "context": {
    "ip": "198.51.100.23",
    "location": "region-1",
    "time": "2025-11-27T10:34:12Z"
  },
  "signals": {
    "anomaly_score": 0.41
  },
  "extensions": {
    "trace_id": "abc123"
  }
}
            </sourcecode>
          </figure>
      </section>
    </section>
 
        <section anchor="response-object" numbered="true">

 
          <name>Response Object</name>
      <t>
        A SOUTH response is a structured object that carries the server
        decision and optional metadata. The response object is transport
        independent. This document uses JSON examples for clarity, but
        other encodings are possible.
      </t>

      <section anchor="response-object-fields" numbered="true">


        <name>Fields</name>
        <t>
          A response object contains the fields listed below. Fields
          marked as required MUST be present. Fields marked as optional
          MAY be omitted.
        </t>

        <t></t>
        <dl>
          <dt>request_id (optional)</dt>
          <dd>
            <t>An opaque identifier copied from the request. When present,
              this value MUST match the <tt>request_id</tt>
              in the corresponding request. It allows the client to
              correlate responses with requests.</t>
          </dd>

            
          <dt>decision (required)</dt>
          <dd>
            <t>A string that indicates the primary outcome of the
              evaluation. Valid values are
              <tt>"allow"</tt>,
              <tt>"deny"</tt>,
              <tt>"retry"</tt>,
              <tt>"defer"</tt>, and
              <tt>"error"</tt>.</t>
          </dd>

            
          <dt>score (optional)</dt>
          <dd>
            <t>A numerical value in the interval [0, 1] that represents
              the internal preference score used by the server. This
              field is intended for diagnostics and logging. Clients MUST
              NOT rely on a specific interpretation of this value unless
              agreed in a deployment profile.</t>
          </dd>

            
          <dt>probability (optional)</dt>
          <dd>
            <t>A numerical value in the interval [0, 1] that represents
              the probability used when the server applies stochastic
              behavior to produce an allow decision. This field MAY be
              present even when the decision is deny, to indicate the
              probability threshold that was not met.</t>
          </dd>

            
          <dt>reason (optional)</dt>
          <dd>
            <t>A short, human readable string that describes the decision
              at a coarse level, such as <tt>"policy"</tt>,
              <tt>"rate_limit"</tt>, or
              <tt>"missing_context"</tt>. The reason
              is not intended to expose internal policy details.</t>
          </dd>

            
          <dt>details (optional)</dt>
          <dd>
            <t>An object that carries structured diagnostic information.
              The format of the details object is deployment specific.</t>
          </dd>

            
          <dt>retry_after (optional)</dt>
          <dd>
            <t>A hint that indicates when the client MAY retry the
              request. This field is meaningful when the decision is
              <tt>"retry"</tt> or
              <tt>"defer"</tt>. The value MAY be a
              number of seconds or a timestamp string, depending on the
              deployment profile.</t>
          </dd>

            
          <dt>error_code (optional)</dt>
          <dd>
            <t>A machine readable string that indicates the type of error
              when the decision is <tt>"error"</tt>.
              Example values include
              <tt>"invalid_request"</tt>,
              <tt>"unauthenticated"</tt>, and
              <tt>"server_error"</tt>.</t>
          </dd>

            
          <dt>extensions (optional)</dt>
          <dd>
            <t>An object reserved for deployment specific fields that are
              not covered by the core model. Extensions MUST NOT change
              the meaning of the decision field.</t>
          </dd>
        </dl>
      </section>

      <section anchor="response-object-allow" numbered="true">


        <name>Allow Responses</name>
        <t>When the server authorizes the operation, it returns a
          response with decision set to <tt>"allow"</tt>.
          The server MAY include score and probability fields to expose
          internal evaluation metrics.
        </t>

        <figure anchor="fig-response-allow-deterministic">
            <name>Deterministic allow response</name>
            <sourcecode type="json">
{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "decision": "allow",
  "reason": "policy",
  "score": 0.98
}
            </sourcecode>
          </figure>

        <figure anchor="fig-response-allow-stochastic">
            <name>Stochastic allow response</name>
            <sourcecode type="json">
{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "decision": "allow",
  "reason": "boundary_region",
  "score": 0.62,
  "probability": 0.55
}
            </sourcecode>
          </figure>

        <t>
          From the client perspective, a stochastic allow is treated in
          the same way as a deterministic allow. The probability field
          is optional metadata that may be logged or used for audit.
        </t>
      </section>

      <section anchor="response-object-deny" numbered="true">


        <name>Deny Responses</name>
        <t>
          When the server does not authorize the operation, and the
          decision is considered stable with respect to current policy
          and context, it returns decision
          <tt>"deny"</tt>.
        </t>

        <figure anchor="fig-response-deny">
            <name>Deny response</name>
            <sourcecode type="json">
{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "decision": "deny",
  "reason": "policy",
  "score": 0.12
}
            </sourcecode>
          </figure>

        <t>
          Clients MUST NOT perform the requested operation after a deny
          decision. The server MAY still include score and probability
          fields for diagnostic purposes, but these values do not change
          the meaning of the deny outcome.
        </t>
      </section>

      <section anchor="response-object-retry" numbered="true">


        <name>Retry and Defer Responses</name>
        <t>
          When the server cannot authorize the request at this time, but
          the outcome may change later, it can return a decision of
          <tt>"retry"</tt> or
          <tt>"defer"</tt>.
        </t>

        <figure anchor="fig-response-retry">
            <name>Retry response with hint</name>
            <sourcecode type="json">
{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "decision": "retry",
  "reason": "load",
  "retry_after": 30
}
            </sourcecode>
          </figure>

        <figure anchor="fig-response-defer">
            <name>Defer response with step up hint</name>
            <sourcecode type="json">
{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "decision": "defer",
  "reason": "missing_context",
  "details": {
    "required_factor": "stronger_auth"
  }
}
            </sourcecode>
          </figure>

        <t>
          Clients MUST treat retry and defer as not authorized for the
          current attempt. The client MAY retry later or perform the
          indicated step, depending on local logic and deployment
          guidance.
        </t>
      </section>

      <section anchor="response-object-error" numbered="true">


        <name>Error Responses</name>
        <t>
          When the server cannot process the request, it returns a
          decision of <tt>"error"</tt>. In this case
          no authorization decision has been made. The client MUST apply
          its own failure handling policy.
        </t>

        <figure anchor="fig-response-error">
            <name>Error response</name>
            <sourcecode type="json">
{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "decision": "error",
  "error_code": "invalid_request",
  "reason": "malformed_subject"
}
            </sourcecode>
          </figure>

        <t>
          Deployments SHOULD document how clients are expected to behave
          on error responses. For example, some environments may require
          fail closed behavior, while others may accept fail open in
          development or testing stages.
        </t>
      </section>

      <section anchor="response-object-correlation" numbered="true">


        <name>Correlation and Logging</name>
        <t>
          Implementations SHOULD log request and response pairs for
          audit, debugging, and incident analysis. The
          <tt>request_id</tt> field enables simple
          correlation. Deployments may also use external correlation
          identifiers conveyed in the extensions field.
        </t>

        <t>
          SOUTH does not define log formats or retention policies.
          Operators are responsible for applying local security and
          privacy requirements to any stored decision data.
        </t>
      </section>
    </section>

        <section anchor="wire-protocol" numbered="true">


          <name>Wire Protocol</name>
      <t>
        SOUTH defines a logical exchange between a client and a server:
        the client sends a request object and receives a response object.
        The protocol is transport independent. This document specifies a
        concrete HTTP binding that uses JSON as the serialization format.
      </t>

      <section anchor="wire-protocol-model" numbered="true">


        <name>Transport Independent Model</name>
        <t>
          In the abstract model, a client constructs a request object as
          described in <xref target="request-object"/>, sends it
          to a server, and receives a response object as described in
          Section <xref target="response-object"/>. The binding between
          these objects and any underlying transport is left to
          deployment profiles.
        </t>

        <t>
          The following properties are expected of any SOUTH transport
          binding.
        </t>

        <t></t>
        <ul>
            <li>The binding MUST preserve the request object and response
              object without modification, except for encoding.</li>
            
            <li>The binding MUST provide a way to carry authentication and
              integrity information for the client and server.</li>
            
            <li>The binding SHOULD support request correlation, for
              example by propagating the <tt>request_id</tt>.</li>
            
            <li>The binding SHOULD allow clients to distinguish between
              authorization decisions and transport or protocol errors.</li>
        </ul>
      </section>

      <section anchor="wire-protocol-http" numbered="true">


        <name>HTTP Binding</name>
        <t>This section specifies an HTTP binding for SOUTH following HTTP semantics <xref target="RFC9110"/>. Other
          bindings may be defined in separate documents. The HTTP
          binding uses JSON encoding for request and response bodies.
        </t>

        <t>
          Clients send SOUTH requests as HTTP POST messages to a server
          controlled endpoint. The choice of path is a deployment
          concern. A common pattern is a path such as
          <tt>/south/decision</tt>.
        </t>

        <t>
          A typical HTTP request has the following form.
        </t>

        <figure anchor="fig-http-request" >
            <name>Example HTTP request</name>
            <sourcecode type="http-message">
POST /south/decision HTTP/1.1
Host: auth.example.com
Content-Type: application/json
Accept: application/json
Authorization: Bearer eyJhbGciOi...

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "subject": {
    "id": "user-1234",
    "type": "user"
  },
  "action": {
    "type": "tool.invoke",
    "name": "database_query"
  },
  "object": {
    "id": "customers-table",
    "type": "database.table"
  }
}
            </sourcecode>
          </figure>

        <t>
          The server responds with a JSON encoded SOUTH response object.
        </t>

        <figure anchor="fig-http-response">
            <name>Example HTTP response</name>
            <sourcecode type="http-message">
HTTP/1.1 200 OK
Content-Type: application/json

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "decision": "allow",
  "reason": "policy",
  "score": 0.94
}
            </sourcecode>
          </figure>

        <t>
          Clients and servers MAY use HTTP authentication mechanisms or
          carry credentials in headers, such as OAuth bearer tokens or
          DPoP proofs. SOUTH does not define any specific authentication
          scheme.
        </t>
      </section>

      <section anchor="wire-protocol-status-codes" numbered="true">


        <name>HTTP Status Codes</name>
        <t>
          In the HTTP binding, the HTTP status code and the SOUTH
          decision field carry different information. The HTTP status
          code reflects the result of transport and parsing. The
          decision field reflects the authorization outcome.
        </t>

        <t>
          Servers using the HTTP binding SHOULD follow these guidelines.
        </t>

        <t></t>
        <dl>
          <dt>200 OK</dt>
          <dd>
            <t>The request was successfully processed and a SOUTH response
              object is present in the body. The decision field indicates
              the authorization outcome, such as allow, deny, retry,
              defer, or error.</t>
          </dd>

            
          <dt>400 Bad Request</dt>
          <dd>
            <t>The HTTP message could not be parsed or the body could not
              be decoded as a SOUTH request object. In this case, the
              server MAY return an error response body, but clients
              cannot rely on its presence.</t>
          </dd>

            
          <dt>401 Unauthorized / 403 Forbidden</dt>
          <dd>
            <t>The client failed authentication or is not permitted to
              call the SOUTH endpoint. The server MAY omit a SOUTH
              response object in this case.</t>
          </dd>

            
          <dt>500 Internal Server Error and 5xx</dt>
          <dd>
            <t>The server encountered an internal error. A SOUTH response
              object MAY be returned, but clients MUST treat the
              condition as a transport or processing failure, not as an
              explicit authorization decision.</t>
          </dd>
        </dl>

        <t>
          When the server returns 200 OK, clients SHOULD expect a valid
          SOUTH response object and MUST interpret the decision field as
          authoritative. When the server returns non 2xx status codes,
          clients MUST apply local failure handling policies.
        </t>
      </section>

      <section anchor="wire-protocol-timeouts" numbered="true">


        <name>Timeouts and Retries</name>
        <t>
          Timeouts and connection failures are transport level events,
          not SOUTH decisions. When a client does not receive a response
          within its configured timeout, the client MUST treat the
          attempt as if no decision was obtained.
        </t>

        <t>
          Clients MAY retry the SOUTH request, subject to local rate and
          backoff policies. Retry behavior on transport failure is
          separate from retry behavior signaled by a SOUTH decision with
          value <tt>"retry"</tt>. A server generated
          retry decision is explicit in the response body and may include
          a retry_after hint.
        </t>

        <t>
          Deployments SHOULD document how clients distinguish between
          these cases and how many retries are permitted before treating
          the failure as persistent.
        </t>
      </section>

      <section anchor="wire-protocol-idempotence" numbered="true">


        <name>Idempotence and Caching</name>
        <t>
          SOUTH requests are intended to be idempotent with respect to
          server policy state. Sending the same request multiple times
          SHOULD NOT by itself change the policy decision, although
          stochastic behavior may cause different outcomes near the
          decision boundary.
        </t>

        <t>
          Clients and intermediaries MAY cache SOUTH responses when
          allowed by deployment policy. Caching policies are out of
          scope for this document. Any caching mechanism MUST ensure that
          sensitive data in responses is handled according to local
          security and privacy requirements.
        </t>
      </section>
    </section>

   
        <section anchor="operational-modes" numbered="true">


   
          <name>Operational Modes</name>
      <t>
        SOUTH is intended as a small decision protocol that can be reused
        across different environments. This section describes several
        operational modes. These examples are illustrative and do not
        constrain implementations.
      </t>

      <section anchor="operational-modes-agents" numbered="true">


        <name>Agent and Tool Authorization</name>
        <t>
          In agent based deployments, a language model or agent runtime
          orchestrates tool calls, API invocations, or system level
          actions on behalf of a user. Before executing a tool call, the
          agent runtime can call a SOUTH server to obtain an explicit
          authorization decision for the proposed action.
        </t>

        <t>
          A typical flow is:
        </t>

        <t></t>
        <ol>
            <li>The agent plans to call a tool or service, such as a
              database, filesystem, or external API.</li>
            
            <li>The agent runtime constructs a SOUTH request that encodes
              the user identity as the subject, the tool invocation as
              the action, and the target resource as the object. The
              context may include agent identifiers, chain identifiers,
              and environment details.</li>
            
            <li>The SOUTH server evaluates the request using local policy,
              recent behavior, and any connected signals, and returns a
              decision.</li>
            
            <li>The agent runtime executes the tool call only if the
              decision is allow. For deny, retry, or defer, the runtime
              may adjust the plan, ask for user confirmation, or fail the
              step according to local rules.</li>
        </ol>

        <t>This mode separates alignment of model outputs from alignment
          of actions executed in the environment. The agent may generate
          many candidate plans, but only those approved by SOUTH are
          executed.
        </t>
      </section>

      <section anchor="operational-modes-mesh" numbered="true">


        <name>Service to Service and Mesh Gateways</name>
        <t>
          In microservice and service mesh environments <xref target="SERVICE-MESH"/>, services call
          each other over RPC or HTTP. Gateways and sidecars often
          enforce authorization policies for incoming and outgoing calls.
          SOUTH can be used as an external decision service in this
          setting.
        </t>

        <t>
          A sidecar or gateway can:
        </t>

        <t></t>
        <ol>
            <li>Extract subject information from mutual TLS, tokens, or
              local identities.</li>
            
            <li>Map the requested method and path to an action and object.</li>
            
            <li>Construct a SOUTH request with optional context such as
              zone, workload identity, or rate information.</li>
            
            <li>Call the SOUTH server and apply the returned decision to
              allow or block the upstream call.</li>
        </ol>

        <t>This mode centralizes authorization policy while keeping
          enforcement at gateways and sidecars.
        </t>
      </section>

      <section anchor="operational-modes-mta" numbered="true">


        <name>Mail Transfer Agents</name>
        <t>
          Mail transfer agents (MTAs) often need to decide whether to
          accept, relay, or reject a message based on sender identity,
          recipient, content classification, and reputation signals.
          SOUTH can be used as an authorization step between MTAs.
        </t>

        <t>
          In one deployment model:
        </t>

        <t></t>
        <ol>
            <li>When an incoming SMTP transaction reaches a receiving MTA,
              the MTA builds a SOUTH request capturing envelope sender,
              envelope recipient, client IP, authentication status, and
              local reputation scores as signals.</li>
            
            <li>The MTA calls a SOUTH server and receives a decision such
              as allow, deny, or defer.</li>
            
            <li>The MTA maps allow to message acceptance, deny to
              rejection, and defer to temporary failure codes such as
              4xx.</li>
        </ol>

        <t>This mode lets operators encode complex spam and abuse policies
          outside the MTA core logic while keeping SMTP behavior
          standard.
        </t>
      </section>

      <section anchor="operational-modes-sdn" numbered="true">


        <name>SDN Controllers and NFV Service Chaining</name>
        <t>
          Software defined networking (SDN) controllers and network
          function virtualization (NFV) platforms often compute flow
          rules and service chains in a control plane, then program
          enforcement points such as switches or virtual functions. SOUTH
          can be used as an external decision function for these control
          plane actions.
        </t>

        <t>
          A controller can:
        </t>

        <t></t>
        <ol>
            <li>Construct a SOUTH request where the subject is the control
              application or tenant, the action is a flow or service
              chain installation, and the object is the target path or
              chain.</li>
            
            <li>Include context such as current load, link health, and
              security posture.</li>
            
            <li>Call the SOUTH server to decide whether the proposed flow
              or chain is allowed.</li>
            
            <li>Install the flow rules only when the decision is allow. For
              deny, retry, or defer, the controller may choose alternate
              paths or delay provisioning.</li>
        </ol>

        <t>In this mode, SOUTH does not operate on individual packets. It
          governs control plane actions that change forwarding behavior.
        </t>
      </section>

      <section anchor="operational-modes-kubernetes" numbered="true">


        <name>Kubernetes Admission and Scheduling</name>
        <t>
          In Kubernetes and similar orchestrators, controllers admit and
          schedule workloads based on policies and cluster state. SOUTH
          can be used as an external decision point in admission <xref target="K8S-ADMISSION"/> webhooks or scheduler <xref target="K8S-SCHEDULER"/> extensions.
        </t>

        <t>
          Possible patterns include:
        </t>

        <t></t>
        <ul>
            <li>An admission webhook builds a SOUTH request for each
              incoming object, such as a Pod or Job, with the subject as
              the user or service account, the action as create or
              update, and the object as the resource. A deny decision
              maps to a failed admission.</li>
            
            <li>A scheduler plugin calls SOUTH before binding a Pod to a
              node, using context such as node labels, taints, and
              current load as part of the request. A deny or defer
              decision can cause the scheduler to consider different
              nodes or queue the Pod.</li>
        </ul>

        <t>This mode allows operators to centralize certain policies that
          govern placement and resource access, while leaving Kubernetes
          semantics intact.
        </t>
      </section>

      <section anchor="operational-modes-library" numbered="true">


        <name>Library and Local Mode</name>
        <t>
          While SOUTH is defined as a wire protocol, some deployments may
          embed the decision logic as a library within an application or
          gateway. In these cases, the application constructs the same
          request and response objects but calls a local function instead
          of sending messages over the network.
        </t>

        <t>
          Library mode can be useful for low latency paths or for
          environments that later plan to move to a remote SOUTH server.
          The wire format defined in this document still provides value
          by giving a stable schema for testing, logging, and future
          interoperability.
        </t>
      </section>
    </section>
 
        <section anchor="security-considerations" numbered="true">

 
          <name>Security Considerations</name>
      <t>
        SOUTH is an authorization decision protocol. It does not replace
        transport security, authentication, or application specific
        checks. Incorrect deployment or interpretation can weaken system
        security. This section highlights key considerations.
      </t>

      <section anchor="sec-authentication-integrity" numbered="true">


        <name>Authentication and Integrity</name>
        <t>
          SOUTH assumes that both client and server identities are
          established by the surrounding transport and authentication
          mechanisms. The protocol does not define its own authentication
          scheme.
        </t>

        <t>
          Deployments SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Use a secure transport such as TLS to protect SOUTH
              requests and responses from eavesdropping and tampering.</li>
            
            <li>Authenticate clients and servers using appropriate
              mechanisms, such as mutual TLS, bearer tokens, or DPoP
              proofs, depending on the environment.</li>
            
            <li>Bind subject information in the request to authenticated
              identities, so that a client cannot claim a different
              subject than the one established at the transport layer.</li>
        </ul>

        <t>If authentication or integrity is not enforced, an attacker may
          inject SOUTH requests, spoof subjects, or alter response
          decisions in transit.
        </t>
      </section>

      <section anchor="sec-fail-open-closed" numbered="true">


        <name>Fail Open and Fail Closed Behavior</name>
        <t>
          SOUTH separates authorization decisions from transport and
          processing errors. Clients must decide how to behave when no
          valid SOUTH response is available.
        </t>

        <t>
          In security sensitive environments, clients SHOULD fail closed
          when:
        </t>

        <t></t>
        <ul>
            <li>No response is received within a timeout.</li>
            
            <li>The HTTP status code is not 2xx.</li>
            
            <li>The response body cannot be parsed as a SOUTH response
              object.</li>
        </ul>

        <t>Failing open in these situations can allow unauthorized
          actions when the SOUTH server is unavailable or under attack.
          Any decision to fail open SHOULD be limited to controlled
          contexts such as development or explicit emergency recovery
          procedures.
        </t>
      </section>

      <section anchor="sec-stochastic" numbered="true">


        <name>Stochastic Decisions and Probing</name>
        <t>
          SOUTH allows stochastic behavior near the decision boundary.
          While this can reduce predictability, it also introduces
          considerations for probing and analysis by an attacker.
        </t>

        <t>
          An adversary who can send many similar requests and observe
          allow or deny outcomes may estimate the underlying score
          function or probability mapping. This can reveal where
          decision boundaries lie and may help the attacker craft more
          effective requests.
        </t>

        <t>
          Deployments SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Rate limit requests that reach the SOUTH server, especially
              near sensitive resources.</li>
            
            <li>Monitor for repeated probing patterns and adjust policy or
              block abusive clients.</li>
            
            <li>Consider limiting the precision of exported scores and
              probabilities, or omitting them entirely in high risk
              environments.</li>
        </ul>
      </section>

      <section anchor="sec-logging-policy-leakage" numbered="true">


        <name>Logging and Policy Leakage</name>
        <t>SOUTH requests and responses can contain sensitive information,
          including subject identifiers, resource names, and diagnostic
          reasons. Logs that capture this data may reveal internal
          structure, policy rules, or usage patterns to unauthorized
          parties.
        </t>

        <t>
          Operators SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Apply access control and retention policies to SOUTH logs.</li>
            
            <li>Avoid exposing detailed decision reasons or raw request
              objects to low privilege users or external systems.</li>
            
            <li>Consider redacting or aggregating fields that might reveal
              sensitive policy details or user behavior.</li>
        </ul>

        <t>In agent deployments, prompts and tool parameters may appear in
          action or object fields. These can be sensitive and require the
          same care as application logs that contain prompts or user
          inputs.
        </t>
      </section>

      <section anchor="sec-dependency-and-bypass" numbered="true">


        <name>Dependency and Bypass Risks</name>
        <t>
          SOUTH is only effective when its decisions are enforced. If
          some code paths or tools bypass SOUTH, then policy enforcement
          becomes incomplete.
        </t>

        <t>
          Deployments SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Identify which actions and tools must be guarded by SOUTH
              and ensure that all corresponding paths call the SOUTH
              server or library consistently.</li>
            
            <li>Ensure that enforcement points, such as gateways, sidecars,
              or agent runtimes, cannot be bypassed by direct access to
              back end systems.</li>
            
            <li>Protect configuration that defines which actions require
              SOUTH decisions, to prevent downgrades.</li>
        </ul>

        <t>If attackers can reach underlying resources without going
          through SOUTH controlled enforcement points, the protocol
          provides no protection for those paths.
        </t>
      </section>

      <section anchor="sec-dos" numbered="true">


        <name>Denial of Service</name>
        <t>
          SOUTH servers can become a central dependency. If a SOUTH
          server is unavailable or overloaded, clients may be unable to
          obtain decisions and may block or fail open, depending on
          configuration.
        </t>

        <t>
          An attacker may try to exhaust SOUTH server capacity by sending
          a large number of requests. To mitigate this risk,
          deployments SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Apply rate limiting and admission controls to SOUTH
              endpoints.</li>
            
            <li>Use resource isolation and scaling mechanisms appropriate
              for critical infrastructure components.</li>
            
            <li>Define clear client behavior when SOUTH is unavailable,
              with a bias toward fail closed in sensitive environments.</li>
        </ul>
      </section>

      <section anchor="sec-caching-and-replay" numbered="true">


        <name>Caching and Replay</name>
        <t>Caching SOUTH responses can reduce load and latency, but it
          introduces risks if cached decisions are reused beyond their
          valid context.
        </t>

        <t>
          Deployments that use caching SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Scope caches to specific subjects, objects, and actions,
              so that decisions are not applied across unrelated
              contexts.</li>
            
            <li>Use appropriate lifetimes for cached entries, especially
              when policy or context can change quickly.</li>
            
            <li>Protect any cache keys or stored responses against
              tampering and unauthorized access.</li>
        </ul>

        <t>Attackers who can replay old responses in place of fresh
          decisions may bypass updated policies. Binding cached entries
          to request attributes and transport layer security is
          recommended.
        </t>
      </section>

      <section anchor="sec-agent-specific" numbered="true">


        <name>Agent Specific Considerations</name>
        <t>
          When SOUTH is used in agent frameworks, an agent runtime may
          generate many candidate actions in response to a single user
          prompt. SOUTH decisions influence which of these actions are
          executed in the environment.
        </t>

        <t>
          Operators SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Ensure that all environment changing actions, such as
              writes, deployments, and external calls, are covered by
              SOUTH or equivalent controls.</li>
            
            <li>Treat user prompts and agent generated plans as
              untrusted inputs and rely on SOUTH decisions to filter
              dangerous actions.</li>
            
            <li>Consider additional rate and scope constraints for agents
              that can generate many tool calls in a short time.</li>
        </ul>

        <t>SOUTH does not guarantee that an agent will choose the best or
          safest plan. It only decides whether a particular requested
          action is within policy. Other safety layers remain necessary.
        </t>
      </section>
    </section>

        <section anchor="privacy-considerations" numbered="true">


          <name>Privacy Considerations</name>
      <t>
        SOUTH requests and responses can contain personal data and other
        sensitive information. This section outlines privacy related
        considerations. It does not replace local legal or regulatory
        obligations.
      </t>

      <section anchor="privacy-data-classes" numbered="true">


        <name>Data Types in SOUTH Messages</name>
        <t>
          A SOUTH request may carry subject identifiers, tenant
          identifiers, resource identifiers, locations, timestamps,
          device attributes, anomaly scores, and other contextual
          signals. In agent deployments, action and object fields may
          also contain parts of prompts, tool parameters, or derived
          user data.
        </t>

        <t>
          A SOUTH response may contain reasons, error codes, and other
          diagnostics that reveal aspects of policy or user behavior.
        </t>

        <t>
          Operators SHOULD treat SOUTH messages and logs as sensitive
          data. They can reveal:
        </t>

        <t></t>
        <ul>
            <li>Which users access which resources, at what times, and
              from which locations.</li>
            
            <li>The structure of internal resources such as tables,
              endpoints, or tools.</li>
            
            <li>Behavioral patterns, including anomaly scores and recent
              failures.</li>
        </ul>
      </section>

      <section anchor="privacy-minimization" numbered="true">


        <name>Data Minimization</name>
        <t>SOUTH defines a flexible schema for requests. Deployments
          SHOULD apply data minimization principles when populating
          fields.
        </t>

        <t>
          In particular, clients SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Avoid sending full prompts or large payloads in the
              action or object fields when a compact identifier would
              suffice.</li>
            
            <li>Restrict subject attributes to those needed for policy
              evaluation, rather than copying entire user records.</li>
            
            <li>Limit context and signal fields to information that has
              clear value for the decision.</li>
        </ul>

        <t>Servers SHOULD discourage deployments that place unnecessary
          personal data into SOUTH messages and SHOULD document which
          fields are essential for common policies.
        </t>
      </section>

      <section anchor="privacy-retention" numbered="true">


        <name>Retention and Access Control for Logs</name>
        <t>
          SOUTH implementations often log requests and responses for
          debugging, incident analysis, and compliance. Such logs can
          form a detailed record of user and agent behavior.
        </t>

        <t>
          Operators SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Apply access controls to logs so that only authorized
              personnel and systems can view them.</li>
            
            <li>Define and enforce retention periods that are consistent
              with local policy and regulation.</li>
            
            <li>Consider pseudonymization or anonymization of identifiers
              when full fidelity is not needed.</li>
            
            <li>Avoid exporting raw SOUTH logs to third parties unless
              appropriate agreements and safeguards are in place.</li>
        </ul>
      </section>

      <section anchor="privacy-agent-context" numbered="true">


        <name>Agent Context and Prompt Data</name>
        <t>When SOUTH is used with agents, the boundary between policy
          data and user content can be blurred. Tools may carry pieces
          of prompts, documents, or messages in their parameters. If
          these are copied into SOUTH requests, the authorization
          layer may receive more user data than necessary.
        </t>

        <t>
          To reduce risk, agent runtimes SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Represent tools and resources using stable identifiers
              where possible, rather than embedding full content.</li>
            
            <li>Keep free form user text out of SOUTH messages unless
              the policy explicitly depends on it.</li>
            
            <li>Treat any prompt fragments or document snippets that do
              enter SOUTH requests as sensitive and protect them in
              storage and transit.</li>
        </ul>

        <t>Policy authors SHOULD design rules that depend on coarse
          attributes or classifications rather than raw user content
          when possible.
        </t>
      </section>

      <section anchor="privacy-metadata" numbered="true">


        <name>Metadata and Inference Risks</name>
        <t>
          Even when raw content is not present, metadata can support
          inference about users and organizations. For example, a
          sequence of SOUTH requests may reveal:
        </t>

        <t></t>
        <ul>
            <li>Work schedules and time zones of specific users.</li>
            
            <li>Which internal projects or datasets are active.</li>
            
            <li>Which resources are considered sensitive or high value.</li>
        </ul>

        <t>Operators SHOULD consider these inference risks when deciding
          where SOUTH messages and logs are stored and who can access
          them. In some cases, aggregating or sampling logs may be
          preferable to storing full detail.
        </t>
      </section>

      <section anchor="privacy-cross-border" numbered="true">


        <name>Cross Border Transfers and Third Parties</name>
        <t>
          In some deployments, SOUTH servers may run in different
          regions or under different administrative domains than the
          calling services. This can create cross border data flows.
        </t>

        <t>
          Operators SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Verify that sending SOUTH requests to remote regions or
              third party providers is compatible with local data
              protection rules.</li>
            
            <li>Limit which fields are sent across boundaries, and prefer
              identifiers over raw content when possible.</li>
            
            <li>Ensure that contracts or agreements with third parties
              cover the handling of SOUTH messages and logs.</li>
        </ul>
      </section>

      <section anchor="privacy-user-rights" numbered="true">


        <name>User Rights and Transparency</name>
        <t>In some jurisdictions, users have rights to access, correct,
          or delete personal data. SOUTH by itself does not define any
          mechanisms to support these rights.
        </t>

        <t>
          Deployments that use SOUTH in systems with user facing
          obligations SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Treat SOUTH logs and configuration as part of the overall
              data inventory.</li>
            
            <li>Ensure that user facing documentation describes how
              authorization and decision logs are used.</li>
            
            <li>Provide procedures to locate and handle personal data that
              appears in SOUTH messages when required by law or policy.</li>
        </ul>
      </section>

      <section anchor="privacy-minimizing-extensions" numbered="true">


        <name>Extensions and Profiles</name>
        <t>The extensions field in SOUTH requests and responses allows
          deployments to add custom data. Unconstrained use of
          extensions can introduce privacy risks.
        </t>

        <t>
          Profiles that define extensions SHOULD:
        </t>

        <t></t>
        <ul>
            <li>Document the purpose and data types of each extension
              clearly.</li>
            
            <li>Avoid placing raw user content into extensions when
              derived attributes would suffice.</li>
            
            <li>Apply the same security and privacy controls to extension
              fields as to core fields.</li>
        </ul>

        <t>Operators SHOULD periodically review extensions and remove
          those that are no longer necessary.
        </t>
      </section>
    </section>

  <section anchor="iana-considerations" numbered="true">
  <name>IANA Considerations</name>

  <t>
    This document registers a new media type for SOUTH request and
    response objects encoded in JSON. The registration follows the
    guidelines in <xref target="RFC6838"/>.
  </t>

  <section anchor="iana-media-type" numbered="true">


    <name>application/south+json Media Type</name>
    <t>
      The following media type registration is for the JSON encoding of
      SOUTH messages.
    </t>

    <dl>

        <dt>Type name:</dt>
      <dd><t>application</t></dd>
        <dt>Subtype name:</dt>
      <dd><t>south+json</t></dd>
        <dt>Required parameters:</dt>
      <dd><t>None</t></dd>
        <dt>Optional parameters:</dt>
      <dd><t>None</t></dd>
        <dt>Encoding considerations:</dt>
      <dd><t>Must be encoded as UTF-8. See <xref target="RFC8259"/>.</t></dd>
        <dt>Security considerations:</dt>
      <dd><t>See the Security Considerations section of this document.</t></dd>
        <dt>Interoperability considerations:</dt>
      <dd><t>None known.</t></dd>
        <dt>Published specification:</dt>
      <dd><t>This document.</t></dd>
        <dt>Applications that use this media type:</dt>
      <dd><t>SOUTH-aware clients and servers, agent frameworks, service
          meshes, authorization middleboxes, and schedulers requiring
          structured authorization decisions.</t></dd>
        <dt>Additional information:</dt>
      <dd><t>None.</t></dd>
        <dt>Person &amp; email address to contact for further information:</dt>
      <dd><t>Madhava Gaikwad &lt;gaikwad.madhav@gmail.com&gt;</t></dd>
        <dt>Intended usage:</dt>
      <dd><t>Common</t></dd>
        <dt>Restrictions on usage:</dt>
      <dd><t>None</t></dd>
        <dt>Author:</dt>
      <dd><t>See Author section of this document.</t></dd>
        <dt>Change controller:</dt>
      <dd><t>IESG &lt;iesg@ietf.org&gt;, or as designated by future
          standardization work.</t></dd>
      
    </dl>

  </section>

</section>

  </middle>

  <back>

        <references anchor="normative-references">


          <name>Normative References</name>

<reference anchor="RFC6838" target="https://www.rfc-editor.org/rfc/rfc6838">
  <front>
    <title>Media Type Specifications and Registration Procedures</title>
    <author fullname="Ned Freed"/>
    <date month="January" year="2013"/>
  </front>
</reference>

<reference anchor="RFC8259" target="https://www.rfc-editor.org/rfc/rfc8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="Tim Bray"/>
    <date month="December" year="2017"/>
  </front>
</reference>

      <reference anchor="RFC9110" target="https://www.rfc-editor.org/rfc/rfc9110">
        <front>
          <title>HTTP Semantics</title>
          <author><organization/></author>
          <date/>
        </front>
        <seriesInfo name="RFC" value="9110"/>
      </reference>

      <reference anchor="RFC8446" target="https://www.rfc-editor.org/rfc/rfc8446">
        <front>
          <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
          <author><organization/></author>
          <date/>
        </front>
        <seriesInfo name="RFC" value="8446"/>
      </reference>

      <reference anchor="RFC6749" target="https://www.rfc-editor.org/rfc/rfc6749">
        <front>
          <title>The OAuth 2.0 Authorization Framework</title>
          <author><organization/></author>
          <date/>
        </front>
        <seriesInfo name="RFC" value="6749"/>
      </reference>

      <reference anchor="RFC9449" target="https://www.rfc-editor.org/rfc/rfc9449">
        <front>
          <title>Demonstrating Proof-of-Possession at the Application Layer (DPoP)</title>
          <author><organization/></author>
          <date/>
        </front>
        <seriesInfo name="RFC" value="9449"/>
      </reference>
    </references>

    <references anchor="informative-references">


      <name>Informative References</name>
      <reference anchor="NIST-ZT" target="https://csrc.nist.gov/publications/detail/sp/800-207/final">
        <front>
          <title>Zero Trust Architecture</title>
          <author><organization/></author>
          <date/>
        </front>
        <seriesInfo name="NIST Special Publication" value="800-207"/>
      </reference>

      <reference anchor="K8S-ADMISSION" target="https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/">
        <front>
          <title>Kubernetes Admission Controllers</title>
          <author><organization/></author>
          <date/>
        </front>
        <seriesInfo name="Kubernetes Documentation" value="Admission Controllers"/>
      </reference>

      <reference anchor="K8S-SCHEDULER" target="https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/">
        <front>
          <title>Kubernetes Scheduler</title>
          <author><organization/></author>
          <date/>
        </front>
        <seriesInfo name="Kubernetes Documentation" value="Scheduler"/>
      </reference>

      <reference anchor="SERVICE-MESH" target="https://istio.io/latest/docs/">
        <front>
          <title>Istio Service Mesh Documentation</title>
          <author><organization/></author>
          <date/>
        </front>
        <seriesInfo name="Istio Documentation" value="Overview"/>
      </reference>

      <reference anchor="RFC2119" target="https://www.rfc-editor.org/rfc/rfc2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="Scott Bradner"/>
    <date month="March" year="1997"/>
  </front>
</reference>

<reference anchor="RFC8174" target="https://www.rfc-editor.org/rfc/rfc8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="Barry Leiba"/>
    <date month="May" year="2017"/>
  </front>
</reference>

    </references>

        <section anchor="appendix-examples" numbered="true">


          <name>Example Flows</name>
      <t>
        This appendix provides example SOUTH message sequences for
        several deployment scenarios. These examples are illustrative.
        They do not constrain implementations.
      </t>

      <section anchor="appendix-examples-agent" numbered="true">


        <name>Agent Tool Invocation</name>
        <t>
          In this flow a language model based agent wishes to call a
          database tool on behalf of a user. The agent runtime consults
          SOUTH before making the tool call.
        </t>

        <t>
          Step 1: the user submits a prompt to the agent. The agent
          decides that it needs to read a customer record and plans a
          tool invocation such as <tt>database_query</tt>.
        </t>

        <t>
          Step 2: the agent runtime constructs a SOUTH request. The
          subject is the user, the action is the tool invocation, the
          object is the target table, and the context includes agent
          related information.
        </t>

        <figure anchor="fig-example-agent-request">
            <name>Agent tool invocation SOUTH request</name>
            <sourcecode type="json">
{
  "request_id": "req-001",
  "subject": {
    "id": "user-1234",
    "type": "user",
    "attributes": {
      "tenant": "tenant-42",
      "roles": ["reader"]
    }
  },
  "action": {
    "type": "tool.invoke",
    "name": "database_query",
    "parameters": {
      "operation": "select",
      "resource": "customers-table"
    }
  },
  "object": {
    "id": "customers-table",
    "type": "database.table"
  },
  "context": {
    "agent_id": "agent-runtime-1",
    "chain_id": "plan-abc",
    "ip": "198.51.100.23"
  }
}
            </sourcecode>
          </figure>

        <t>
          Step 3: the SOUTH server evaluates the request and returns a
          response that allows the action.
        </t>

        <figure anchor="fig-example-agent-response">
            <name>Agent tool invocation SOUTH response</name>
            <sourcecode type="json">
{
  "request_id": "req-001",
  "decision": "allow",
  "reason": "policy",
  "score": 0.92
}
            </sourcecode>
          </figure>

        <t>
          Step 4: the agent runtime proceeds with the database tool
          call. If the decision had been deny or retry, the runtime
          would select a different plan or ask the user for guidance.
        </t>
      </section>

      <section anchor="appendix-examples-mesh" numbered="true">


        <name>Service Mesh Gateway</name>
        <t>
          In this flow a service mesh sidecar consults SOUTH before
          forwarding an HTTP call from service A to service B.
        </t>

        <t>
          Step 1: service A sends an HTTP request to service B. The
          request passes through a sidecar proxy.
        </t>

        <t>
          Step 2: the sidecar constructs a SOUTH request. The subject is
          the identity of service A, the action encodes the HTTP method,
          and the object identifies the upstream service and path.
        </t>

        <figure anchor="fig-example-mesh-request">
            <name>Service mesh SOUTH request</name>
            <sourcecode type="json">
{
  "request_id": "mesh-123",
  "subject": {
    "id": "service-A",
    "type": "service",
    "attributes": {
      "namespace": "payments"
    }
  },
  "action": {
    "type": "http.call",
    "name": "GET",
    "parameters": {
      "path": "/v1/charges"
    }
  },
  "object": {
    "id": "service-B",
    "type": "service",
    "attributes": {
      "namespace": "billing"
    }
  },
  "context": {
    "ip": "10.0.0.5",
    "zone": "zone-1"
  }
}
            </sourcecode>
          </figure>

        <t>
          Step 3: the SOUTH server returns a deny decision. The sidecar
          returns an HTTP error to service A and does not forward the
          request to service B.
        </t>

        <figure anchor="fig-example-mesh-response">
            <name>Service mesh SOUTH response</name>
            <sourcecode type="json">
{
  "request_id": "mesh-123",
  "decision": "deny",
  "reason": "policy",
  "score": 0.08
}
            </sourcecode>
          </figure>
      </section>

      <section anchor="appendix-examples-mta" numbered="true">


        <name>Mail Transfer Agent</name>
        <t>
          In this flow an incoming SMTP connection triggers a SOUTH
          check before message acceptance.
        </t>

        <t>
          Step 1: a sending MTA connects to a receiving MTA and issues
          an SMTP transaction with MAIL FROM and RCPT TO commands.
        </t>

        <t>
          Step 2: before accepting the message body, the receiving MTA
          constructs a SOUTH request. The subject reflects the sending
          host and authenticated identity, the object is the recipient,
          and the signals include local reputation scores.
        </t>

        <figure anchor="fig-example-mta-request">
            <name>MTA SOUTH request</name>
            <sourcecode type="json">
{
  "request_id": "mta-42",
  "subject": {
    "id": "smtp-client-1",
    "type": "mta",
    "attributes": {
      "ip": "203.0.113.5",
      "helo": "mail.example.org"
    }
  },
  "action": {
    "type": "smtp.accept",
    "name": "deliver"
  },
  "object": {
    "id": "user@example.net",
    "type": "mailbox"
  },
  "signals": {
    "reputation_score": 0.21,
    "spf_pass": false
  }
}
            </sourcecode>
          </figure>

        <t>
          Step 3: the SOUTH server returns a defer decision. The MTA
          responds with a temporary failure code and may try again later
          or drop the connection according to local policy.
        </t>
      </section>
    </section>

        <section anchor="appendix-signing" numbered="true">


          <name>Signing Profiles</name>
      <t>
        SOUTH does not define its own authentication or signing format.
        This appendix sketches profiles that combine SOUTH with existing
        mechanisms. These descriptions are informative.
      </t>

      <section anchor="appendix-signing-mtls" numbered="true">


        <name>Mutual TLS Profile</name>
        <t>
          In the mutual TLS profile, client and server authentication
          rely on TLS <xref target="RFC8446"/>. The client presents a
          certificate and the server maps the certificate to a client
          identity. The SOUTH request includes a subject that is derived
          from this identity.
        </t>

        <t>
          Properties:
        </t>

        <t></t>
        <ul>
            <li>Integrity and confidentiality are provided by the TLS
              session.</li>
            
            <li>The subject in the SOUTH request is bound to the
              certificate presented on the connection.</li>
            
            <li>No additional signatures are required in the body.</li>
        </ul>

        <t>This profile is suitable inside data centers or service mesh
          environments where mutual TLS is already deployed.
        </t>
      </section>

      <section anchor="appendix-signing-oauth" numbered="true">


        <name>OAuth 2.0 and DPoP Profile</name>
        <t>
          In this profile, the client authenticates to the SOUTH server
          using OAuth 2.0 bearer tokens <xref target="RFC6749"/> and may
          use DPoP <xref target="RFC9449"/> for proof of possession.
        </t>

        <t>
          A typical flow is:
        </t>

        <t></t>
        <ol>
            <li>The client obtains an access token from an authorization
              server, with a subject identifier and optional scopes.</li>
            
            <li>The client sends SOUTH requests over HTTPS, including the
              token in an Authorization header and optional DPoP proof.</li>
            
            <li>The SOUTH server validates the token and proof, then uses
              the subject and scopes as part of policy evaluation.</li>
        </ol>

        <t>The SOUTH subject should reflect the identity in the access
          token. Additional attributes may be derived from token claims.
        </t>
      </section>

      <section anchor="appendix-signing-body" numbered="true">


        <name>Signed Request Bodies</name>
        <t>
          Some deployments may require explicit integrity protection for
          the SOUTH request body, separate from the transport. One
          option is to use a JSON based signature format that covers the
          serialized request object.
        </t>

        <t>
          A simple pattern is:
        </t>

        <t></t>
        <ol>
            <li>Serialize the SOUTH request object as JSON.</li>
            
            <li>Compute a signature over the JSON representation using a
              key associated with the client.</li>
            
            <li>Attach the signature and key identifier in the
              <tt>extensions</tt> field or a separate
              header that is understood by the SOUTH server.</li>
        </ol>

        <t>The server verifies the signature before evaluating policy.
          The exact signature format, key management, and canonical
          serialization rules are deployment specific and out of scope
          for this document.
        </t>
      </section>

      <section anchor="appendix-signing-agent" numbered="true">


        <name>Agent and User Binding</name>
        <t>
          In agent scenarios, a SOUTH request may represent a combined
          decision for a user and an agent runtime. One deployment model
          uses two layers of proof.
        </t>

        <t></t>
        <ul>
            <li>The outer transport authenticates the agent runtime
              itself, for example through mutual TLS or a client
              credential token.</li>
            
            <li>The inner subject reflects the user identity, which is
              carried in a user token or session credential.</li>
        </ul>

        <t>The SOUTH server can validate both identities and apply policy
          that depends on the combination. For example, some tools may
          only be allowed when a specific agent acts on behalf of a
          given user group.
        </t>
      </section>
    </section>
        <section anchor="appendix-rate" numbered="true">

          <name>Rate and Load Aware Policies</name>
      <t>
        SOUTH is compatible with rate and load sensitive decision logic.
        This appendix outlines patterns for encoding such policies in
        the request and response objects.
      </t>

      <section anchor="appendix-rate-signals" numbered="true">


        <name>Rate and Load Signals</name>
        <t>
          Rate and load information can appear in the
          <tt>context</tt> and
          <tt>signals</tt> fields of the SOUTH
          request. The following fields are common examples.
        </t>

        <t></t>
        <ul>
            <li>Per subject request rate over a recent window.</li>
            
            <li>Per resource or per tenant request rate.</li>
            
            <li>Current load on a target service or cluster.</li>
            
            <li>Anomaly or burst scores from external detectors.</li>
        </ul>

        <t>The exact schema for these fields is deployment specific. A
          profile can define standard names such as
          <tt>subject_rate</tt> or
          <tt>service_load</tt>.
        </t>
      </section>

      <section anchor="appendix-rate-decisions" numbered="true">


        <name>Decisions for Throttling and Shedding</name>
        <t>
          Rate and load aware policies can use SOUTH decisions to
          control throttling and shedding.
        </t>

        <t>
          Typical patterns include:
        </t>

        <t></t>
        <ul>
            <li><tt>allow</tt> when rates and load are
              below thresholds.</li>
            
            <li><tt>deny</tt> when a request clearly
              exceeds policy or is part of an abusive pattern.</li>
            
            <li><tt>retry</tt> when the policy suggests
              that the operation may succeed later, for example under
              transient load.</li>
            
            <li><tt>defer</tt> when the system prefers
              queued or delayed execution rather than immediate failure.</li>
        </ul>

        <t>The <tt>reason</tt> field and optional
          <tt>retry_after</tt> extension can give
          further guidance to clients. For example, a rate limited
          decision may suggest a backoff period.
        </t>
      </section>

      <section anchor="appendix-rate-agent" numbered="true">


        <name>Agent Specific Rate Policies</name>
        <t>
          Agents can generate many actions in a short time. SOUTH can
          help enforce limits that prevent unbounded tool use or
          external calls.
        </t>

        <t>
          Examples include:
        </t>

        <t></t>
        <ul>
            <li>Per user and per agent caps on tool calls per minute.</li>
            
            <li>Budgets for external API calls or high cost operations.</li>
            
            <li>Step up requirements when an agent exceeds typical
              behavior, such as additional user confirmation.</li>
        </ul>

        <t>
          These policies are expressed as functions of the rate related
          signals in the SOUTH request. The SOUTH response then guides
          how the agent runtime adapts its plan.
        </t>
      </section>

      <section anchor="appendix-rate-fairness" numbered="true">


        <name>Fairness and Multi Tenant Settings</name>
        <t>
          In multi tenant environments, rate and load policies affect
          fairness. SOUTH can help implement per tenant and per group
          quotas that prevent a single tenant from consuming a
          disproportionate share of capacity.
        </t>

        <t>
          A SOUTH server can:
        </t>

        <t></t>
        <ol>
            <li>Track usage counters per tenant or group.</li>
            
            <li>Include current quota status in the decision logic.</li>
            
            <li>Return deny or defer decisions when quotas are exceeded.</li>
        </ol>

        <t>
          The protocol itself does not enforce quotas, but it provides a
          structured place to apply quota aware decisions and to signal
          these decisions back to clients.
        </t>
      </section>
    </section>

  </back>

</rfc>
