<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-jurkovikj-httpapi-agentic-state-02" category="bcp" consensus="true" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="Agentic State Transfer">HTTP Profile for Conditional Updates to Shared Resource State (Agentic State Transfer)</title>
    <seriesInfo name="Internet-Draft" value="draft-jurkovikj-httpapi-agentic-state-02"/>
    <author initials="A." surname="Jurkovikj" fullname="Antun Jurkovikj">
      <organization/>
      <address>
        <email>antunjurkovic@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="27"/>
    <area>Web and Internet Transport</area>
    <keyword>HTTP, concurrency, ETag, state management</keyword>
    <abstract>
      <?line 18?>

<t>HTTP applications frequently expose one logical object through several
representations or resources. Ordinary HTTP entity tags identify selected
representations; they do not, by themselves, provide a conditional-update
mechanism spanning different request targets.</t>
      <t>This document specifies Agentic State Transfer (AST), an HTTP profile for
preventing lost updates to shared application state. AST Core requires a
client to mutate the State-Bearing Resource using the strong ETag of its
State-Bearing Representation and the standard <tt>If-Match</tt> field. AST Semantic
uses <tt>Semantic-ETag</tt> and <tt>If-Semantic-Match</tt> when a protected mutation targets
a different resource or representation in the same concurrency domain. The
profile also defines state discovery, atomic compare-and-commit behavior,
conflict handling, deferred processing, caching constraints, and security
requirements.</t>
    </abstract>
  </front>
  <middle>
    <?line 35?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>A single application object is often visible through several HTTP resources or
representations. A content-management system might provide an HTML page, a
JSON state resource, a Markdown editor, and a form handler, all backed by the
same database object. Multiple human and automated clients can construct
updates from different views of that object.</t>
      <t>HTTP already provides optimistic concurrency control through <tt>ETag</tt> and
<tt>If-Match</tt> <xref target="RFC9110"/>. Those fields work when the validator was obtained from a
selected representation of the same target resource later modified by the
client. Problems arise when an application treats an ETag obtained from one
resource as though it were an <tt>If-Match</tt> condition on a different resource.
That changes the target scope of <tt>If-Match</tt> and is not standard HTTP semantics.</t>
      <t>AST defines two conformant deployment modes:</t>
      <ul spacing="normal">
        <li>
          <t><strong>AST Core</strong> uses only existing HTTP conditional request fields. Every
protected mutation targets the State-Bearing Resource and uses the strong
ETag of the State-Bearing Representation selected at that target.</t>
        </li>
        <li>
          <t><strong>AST Semantic</strong> uses the Semantic Validator extension
<xref target="I-D.jurkovikj-http-semantic-validator"/>. A protected mutation can target a
projected or otherwise different resource, provided the target positively
advertises enforcement of <tt>If-Semantic-Match</tt> for the same concurrency
domain.</t>
        </li>
      </ul>
      <t>Both modes require atomic compare-and-commit behavior. They differ only in
which validator and precondition can safely cross representation or resource
boundaries.</t>
      <section anchor="the-lost-update-problem">
        <name>The Lost-Update Problem</name>
        <t>Consider an article exposed as HTML at <tt>/article/123</tt> and as complete JSON state
at <tt>/api/article/123</tt>.</t>
        <ol spacing="normal" type="1"><li>
            <t>Client A reads one view and changes the article.</t>
          </li>
          <li>
            <t>Client B constructs a different change from an older view.</t>
          </li>
          <li>
            <t>Client B submits its change without a version-specific precondition.</t>
          </li>
          <li>
            <t>The server applies Client B's stale update and overwrites part or all of
Client A's work.</t>
          </li>
        </ol>
        <t>AST prevents this outcome by requiring a validator that identifies the state
against which the mutation was constructed and by requiring the comparison and
state transition to occur as one atomic operation.</t>
      </section>
      <section anchor="scope">
        <name>Scope</name>
        <t>AST specifies:</t>
        <ul spacing="normal">
          <li>
            <t>designation and discovery of a State-Bearing Resource and Representation;</t>
          </li>
          <li>
            <t>AST Core use of <tt>ETag</tt>, <tt>If-Match</tt>, <tt>412</tt>, and <tt>428</tt>;</t>
          </li>
          <li>
            <t>AST Semantic use of <tt>Semantic-ETag</tt> and <tt>If-Semantic-Match</tt>;</t>
          </li>
          <li>
            <t>atomicity across all writers in one concurrency domain;</t>
          </li>
          <li>
            <t>response behavior, conflict handling, deferred processing, and creation;</t>
          </li>
          <li>
            <t>caching, content negotiation, integrity, and security constraints; and</t>
          </li>
          <li>
            <t>registration of a link relation for state discovery.</t>
          </li>
        </ul>
        <t>AST does not define an application data model, patch format, merge algorithm,
authentication scheme, authorization policy, database transaction mechanism,
or non-HTTP binding.</t>
      </section>
    </section>
    <section anchor="conventions-and-terminology">
      <name>Conventions and Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<dl>
        <dt><strong>Canonical Resource State (CRS)</strong></dt>
        <dd>
          <t>The authoritative application state whose concurrent modification is
protected by AST. The CRS includes every value whose change could make a
mutation constructed against an earlier state unsafe.</t>
        </dd>
        <dt><strong>Concurrency domain</strong></dt>
        <dd>
          <t>The complete set of CRS values and write paths serialized by one AST
precondition. A concurrency domain can be scoped by resource, tenant,
principal, language, workflow, or another application boundary.</t>
        </dd>
        <dt><strong>State-Bearing Representation (SBR)</strong></dt>
        <dd>
          <t>A selected representation that exposes the complete CRS needed to construct
and reconcile protected mutations. Its ordinary strong ETag validates that
selected representation.</t>
        </dd>
        <dt><strong>State-Bearing Resource</strong></dt>
        <dd>
          <t>The HTTP target resource from which the SBR is selected. AST Core mutations
target this resource.</t>
        </dd>
        <dt><strong>Projected Representation</strong></dt>
        <dd>
          <t>A representation derived from the CRS but not designated as the SBR. It can
omit, transform, summarize, render, or otherwise project state.</t>
        </dd>
        <dt><strong>Projected Resource</strong></dt>
        <dd>
          <t>A target resource that provides a Projected Representation or accepts an
application-specific action related to the same CRS.</t>
        </dd>
        <dt><strong>Protected mutation</strong></dt>
        <dd>
          <t>A state-changing request for which an AST profile requires a version-specific
precondition.</t>
        </dd>
        <dt><strong>Version-specific precondition</strong></dt>
        <dd>
          <t>An <tt>If-Match</tt> or <tt>If-Semantic-Match</tt> value containing at least one explicit
validator that identifies a state observed by the client. A wildcard-only
condition is not version-specific.</t>
        </dd>
      </dl>
    </section>
    <section anchor="resource-and-state-model">
      <name>Resource and State Model</name>
      <t>For each AST concurrency domain, an origin server <bcp14>MUST</bcp14> designate one canonical
State-Bearing Resource. That resource selects one SBR that exposes the
complete CRS needed for conflict reconciliation. Additional aliases <bcp14>MAY</bcp14>
redirect to the canonical State-Bearing Resource, but clients and projected
resources need one unambiguous state target.</t>
      <t>A deployment can use either:</t>
      <ul spacing="normal">
        <li>
          <t>a dedicated State-Bearing Resource, such as <tt>/api/article/123</tt>; or</t>
        </li>
        <li>
          <t>one URI with content negotiation, provided a request can unambiguously select
the SBR for both retrieval and precondition evaluation.</t>
        </li>
      </ul>
      <t>A dedicated State-Bearing Resource is <bcp14>RECOMMENDED</bcp14> because it avoids ambiguity
about representation selection on unsafe requests.</t>
      <t>A TCT M-URL <xref target="I-D.jurkovikj-collab-tunnel"/> is a Projected Resource by default.
It is an AST SBR only when the origin explicitly designates it as such, it
losslessly exposes the complete CRS, and it implements all requirements of the
chosen AST mode.</t>
      <section anchor="concurrency-domain-completeness">
        <name>Concurrency-Domain Completeness</name>
        <t>The concurrency domain <bcp14>MUST</bcp14> include all state whose change could invalidate a
client's intended mutation. It also <bcp14>MUST</bcp14> include state relevant to the
applicable authorization and integrity decisions. If one request atomically
modifies several otherwise independent objects, the server <bcp14>MUST</bcp14> either:</t>
        <ul spacing="normal">
          <li>
            <t>protect a composite concurrency domain that covers all of them; or</t>
          </li>
          <li>
            <t>use an application transaction mechanism that prevents partial or stale
commits with equivalent safety.</t>
          </li>
        </ul>
        <t>Different principals or audiences <bcp14>MUST</bcp14> use separate domains when they do not
observe exactly the same mutation-relevant CRS.</t>
      </section>
    </section>
    <section anchor="ast-core-profile">
      <name>AST Core Profile</name>
      <t>AST Core is the existing-HTTP-fields deployment mode. It does not change the
meaning of <tt>ETag</tt> or <tt>If-Match</tt>.</t>
      <section anchor="sbr-validator">
        <name>SBR Validator</name>
        <t>The SBR <bcp14>MUST</bcp14> have a strong ETag as defined by <xref target="RFC9110"/>. That ETag validates
the exact selected SBR representation. It <bcp14>MUST</bcp14> change whenever the SBR
representation data changes.</t>
        <t>Every CRS change in the concurrency domain <bcp14>MUST</bcp14> produce SBR representation data
with a different strong ETag before or atomically with publication of the
changed state. The reverse is not required: serializer, schema, profile, or
representation metadata changes can require a new strong ETag even when the
application regards the CRS as semantically equivalent.</t>
        <t>A Projected Representation <bcp14>MAY</bcp14> have its own ETag. The SBR ETag <bcp14>MUST NOT</bcp14> be
reused as a Projected Representation's ETag unless the selected representation
data are identical and all ordinary HTTP strong-validator requirements are
satisfied.</t>
      </section>
      <section anchor="stable-sbr-variant">
        <name>Stable SBR Variant</name>
        <t>A protected AST Core mutation <bcp14>MUST</bcp14> be evaluated against one unambiguously
selected SBR variant.</t>
        <t>The <bcp14>RECOMMENDED</bcp14> deployment is a dedicated SBR URI that serves one media type
without <tt>Content-Encoding</tt> and includes <tt>Cache-Control: no-transform</tt>. If
content negotiation is used at the State-Bearing Resource:</t>
        <ul spacing="normal">
          <li>
            <t>the client <bcp14>MUST</bcp14> send the request fields needed to select the SBR;</t>
          </li>
          <li>
            <t>the server <bcp14>MUST</bcp14> evaluate <tt>If-Match</tt> against that selected SBR;</t>
          </li>
          <li>
            <t>the same selection rules <bcp14>MUST</bcp14> apply when the validator is retrieved and when
the mutation is submitted; and</t>
          </li>
          <li>
            <t><tt>Vary</tt> <bcp14>MUST</bcp14> list every request field used for selection.</t>
          </li>
        </ul>
        <t>An AST Core deployment <bcp14>MUST NOT</bcp14> accept an ETag of one content-coded variant as
an <tt>If-Match</tt> condition on a different selected variant. A deployment that
needs representation-independent validation across codings <bcp14>SHOULD</bcp14> implement
AST Semantic or expose a dedicated identity-coded State-Bearing Resource.</t>
      </section>
      <section anchor="core-write-requirement">
        <name>Core Write Requirement</name>
        <t>A protected AST Core mutation:</t>
        <ol spacing="normal" type="1"><li>
            <t><bcp14>MUST</bcp14> target the State-Bearing Resource;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> select the SBR;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> contain <tt>If-Match</tt> with at least one explicit strong entity-tag; and</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> be compared with the current selected SBR using the strong comparison
function defined by <xref target="RFC9110"/>.</t>
          </li>
        </ol>
        <t>An SBR ETag obtained from one URI <bcp14>MUST NOT</bcp14> be reinterpreted as an <tt>If-Match</tt>
condition on another target URI.</t>
        <t>A client does not need to retrieve the SBR immediately before every mutation,
but it <bcp14>MUST</bcp14> possess the SBR ETag for the state against which the mutation was
constructed. The precondition determines whether that belief remains current.</t>
      </section>
      <section anchor="core-projected-resource-behavior">
        <name>Core Projected-Resource Behavior</name>
        <t>A Projected Resource that does not implement AST Semantic <bcp14>MUST NOT</bcp14> accept a CRS
mutation by treating the SBR ETag as an <tt>If-Match</tt> condition on the projected
target.</t>
        <t>When such a resource does not support the unsafe method, it <bcp14>SHOULD</bcp14> respond with
<tt>405 Method Not Allowed</tt>, <bcp14>MUST</bcp14> include an <tt>Allow</tt> field as required by
<xref target="RFC9110"/>, and <bcp14>SHOULD</bcp14> include a <tt>concurrency-state</tt> link to the
State-Bearing Resource:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD
Link: </api/article/123>; rel="concurrency-state"; type="application/json"
]]></sourcecode>
      </section>
    </section>
    <section anchor="ast-semantic-profile">
      <name>AST Semantic Profile</name>
      <t>AST Semantic extends the profile with the fields defined by
<xref target="I-D.jurkovikj-http-semantic-validator"/>. It is intended for protected
mutations whose request target is not the State-Bearing Resource or whose
selected representation is not the SBR.</t>
      <section anchor="semantic-validator-exposure">
        <name>Semantic Validator Exposure</name>
        <t>Every resource from which a client is expected to construct a semantic-mode
mutation <bcp14>SHOULD</bcp14> expose <tt>Semantic-ETag</tt>. Resources in the same concurrency
domain <bcp14>MUST</bcp14> expose an equal current semantic validator when they represent the
same mutation-relevant CRS.</t>
        <t>Ordinary ETags remain representation-specific:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: text/html
ETag: "html-v52"
Semantic-ETag: "article-state-v7"
Link: </api/article/123>; rel="concurrency-state"; type="application/json"
]]></sourcecode>
        <t>The State-Bearing Resource can expose both its ordinary ETag and the same
<tt>Semantic-ETag</tt>:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
ETag: "json-v18"
Semantic-ETag: "article-state-v7"
]]></sourcecode>
      </section>
      <section anchor="semantic-write-requirement">
        <name>Semantic Write Requirement</name>
        <t>A protected AST Semantic mutation:</t>
        <ol spacing="normal" type="1"><li>
            <t><bcp14>MUST</bcp14> target a resource and request method for which AST Semantic
enforcement is positively advertised;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> contain <tt>If-Semantic-Match</tt> with at least one explicit semantic
validator;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> be evaluated in the concurrency domain advertised for that target; and</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> satisfy the comparison, capability, and atomicity requirements of
<xref target="I-D.jurkovikj-http-semantic-validator"/>.</t>
          </li>
        </ol>
        <t>A wildcard-only <tt>If-Semantic-Match</tt> value does not satisfy AST's
version-specific precondition requirement.</t>
        <t>A request <bcp14>MAY</bcp14> also contain ordinary <tt>If-Match</tt>. When it does, both the
representation precondition and semantic precondition <bcp14>MUST</bcp14> succeed.</t>
      </section>
      <section anchor="capability-advertisement">
        <name>Capability Advertisement</name>
        <t>Because an unaware HTTP server can ignore an extension request field, a client
<bcp14>MUST NOT</bcp14> rely on <tt>If-Semantic-Match</tt> unless it has positive knowledge,
specific to the target resource and request method, that the target enforces
AST Semantic.</t>
        <t>A conforming AST Semantic deployment <bcp14>MUST</bcp14> make enforcement discoverable for
each protected target resource and mutation method. It <bcp14>MUST</bcp14> advertise AST
Semantic participation using a <tt>profile</tt> link relation or application
documentation that is equally explicit. The <tt>profile</tt> link is <bcp14>RECOMMENDED</bcp14>:</t>
        <sourcecode type="http"><![CDATA[
Link: <https://www.ietf.org/archive/id/draft-jurkovikj-httpapi-agentic-state-02.html#ast-semantic-profile>; rel="profile"
]]></sourcecode>
        <t>The profile URI above identifies this exact Internet-Draft revision. Clients
<bcp14>MUST NOT</bcp14> assume that a versionless Datatracker URI or a different draft
revision is equivalent. A future RFC will define stable RFC-based profile
identifiers.</t>
        <t>The <tt>profile</tt> link identifies AST Semantic participation but does not by
itself enumerate request methods. Method coverage <bcp14>MUST</bcp14> be defined by
resource-and-method-specific documentation or another explicit discovery
mechanism. A client <bcp14>MUST NOT</bcp14> infer enforcement for another method, resource,
or origin from one profile link.</t>
        <t>AST Core can be advertised similarly:</t>
        <sourcecode type="http"><![CDATA[
Link: <https://www.ietf.org/archive/id/draft-jurkovikj-httpapi-agentic-state-02.html#ast-core-profile>; rel="profile"
]]></sourcecode>
        <t>A <tt>profile</tt> media-type parameter is not defined for <tt>application/json</tt> by this
document and <bcp14>MUST NOT</bcp14> be used as a substitute for the link relation unless the
selected media type separately defines such a parameter.</t>
      </section>
    </section>
    <section anchor="safe-mutation-processing">
      <name>Safe Mutation Processing</name>
      <t>This section applies to both AST modes. "Required precondition" means
<tt>If-Match</tt> in AST Core and <tt>If-Semantic-Match</tt> in AST Semantic.</t>
      <section anchor="missing-or-inadequate-preconditions">
        <name>Missing or Inadequate Preconditions</name>
        <t>For a protected mutation of an existing resource, the server <bcp14>MUST NOT</bcp14> apply the
request unless it contains the required version-specific precondition.</t>
        <t>After authentication, authorization, request syntax, media-type, and other
normal validation checks:</t>
        <ul spacing="normal">
          <li>
            <t>an absent required precondition <bcp14>MUST</bcp14> produce <tt>428 Precondition Required</tt>
              <xref target="RFC6585"/>;</t>
          </li>
          <li>
            <t>a wildcard-only value, or a value containing no explicit validator suitable
for the selected AST mode, <bcp14>MUST</bcp14> also produce <tt>428</tt>; and</t>
          </li>
          <li>
            <t>a syntactically valid version-specific condition that does not match <bcp14>MUST</bcp14>
produce <tt>412 Precondition Failed</tt>.</t>
          </li>
        </ul>
        <t>The <tt>400 Bad Request</tt> fallback formerly permitted by this profile is not
conformant. A <tt>428</tt> response <bcp14>SHOULD</bcp14> use Problem Details <xref target="RFC9457"/> and explain
which field is required.</t>
      </section>
      <section anchor="atomic-compare-and-commit">
        <name>Atomic Compare-and-Commit</name>
        <t>After normal request validation, evaluation of the required validator,
application of the state transition, and publication of the resulting
validator <bcp14>MUST</bcp14> occur atomically with respect to every operation capable of
changing the same concurrency domain.</t>
        <t>This requirement applies to HTTP handlers, background workers, migrations,
administrator interfaces, message consumers, scheduled jobs, and other write
paths. Two concurrent requests <bcp14>MUST NOT</bcp14> both compare successfully against the
same old validator and then both commit conflicting transitions.</t>
        <t>The server <bcp14>MAY</bcp14> implement this requirement with a database compare-and-swap,
transactional version column, serializable transaction, lock, version vector,
or another mechanism with equivalent behavior.</t>
      </section>
      <section anchor="successful-responses">
        <name>Successful Responses</name>
        <t>In AST Core, a successful response can carry the new ordinary ETag only when
that ETag correctly describes the selected representation of the target
resource under <xref target="RFC9110"/>. Typical patterns are:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 204 No Content
ETag: "json-v19"
]]></sourcecode>
        <t>or:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
ETag: "json-v19"

{"id":123,"status":"draft"}
]]></sourcecode>
        <t>For <tt>PUT</tt>, a server <bcp14>MUST</bcp14> follow the RFC 9110 restriction on sending validators
when the received representation was transformed before storage. If a valid
new ETag cannot be returned, the client retrieves it with a subsequent <tt>GET</tt> or
<tt>HEAD</tt>.</t>
        <t>In AST Semantic, a successful state-changing response <bcp14>SHOULD</bcp14> include the new
<tt>Semantic-ETag</tt> when a current state remains and the principal is authorized to
observe it:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 204 No Content
Semantic-ETag: "article-state-v8"
Link: </api/article/123>; rel="concurrency-state"; type="application/json"
]]></sourcecode>
        <t>If the response contains a Projected Representation, its ordinary <tt>ETag</tt> <bcp14>MUST</bcp14>
validate that projection, while <tt>Semantic-ETag</tt> carries the semantic validator.</t>
        <t>A server <bcp14>MAY</bcp14> use <tt>303 See Other</tt> to direct the client to retrieve the current
SBR. <tt>Content-Location</tt> does not rebind an ordinary <tt>ETag</tt> to another
resource, and AST does not define a <tt>state-etag</tt> Link parameter.</t>
      </section>
      <section anchor="conflict-responses">
        <name>Conflict Responses</name>
        <t>A <tt>412 Precondition Failed</tt> response <bcp14>SHOULD</bcp14> identify the State-Bearing Resource
using <tt>rel="concurrency-state"</tt>. Subject to authorization and disclosure
policy:</t>
        <ul spacing="normal">
          <li>
            <t>AST Core <bcp14>MAY</bcp14> include the current SBR <tt>ETag</tt> when it correctly identifies the
current selected representation of the target; and</t>
          </li>
          <li>
            <t>AST Semantic <bcp14>SHOULD</bcp14> include the current <tt>Semantic-ETag</tt>.</t>
          </li>
        </ul>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 412 Precondition Failed
Content-Type: application/problem+json
Semantic-ETag: "article-state-v9"
Link: </api/article/123>; rel="concurrency-state"; type="application/json"

{
  "type": "https://example.com/problems/precondition-failed",
  "title": "Precondition failed",
  "status": 412,
  "detail": "The resource changed after the client constructed its update."
}
]]></sourcecode>
        <t>A validator returned with <tt>412</tt> is advisory and can become stale immediately.
A client <bcp14>MUST NOT</bcp14> retry solely by replacing its supplied validator with that
value. It <bcp14>MUST</bcp14> first retrieve or otherwise validate the current state and
reconcile its intended mutation, unless the operation specification explicitly
guarantees that blind retry is safe.</t>
      </section>
      <section anchor="conflict-resolution">
        <name>Conflict Resolution</name>
        <t>After <tt>412</tt>, a client can:</t>
        <ul spacing="normal">
          <li>
            <t>retrieve the current SBR and reapply its intent;</t>
          </li>
          <li>
            <t>perform a three-way merge when application semantics make that safe;</t>
          </li>
          <li>
            <t>request human or policy-engine intervention; or</t>
          </li>
          <li>
            <t>abandon the mutation.</t>
          </li>
        </ul>
        <t>AST does not define merge semantics. A server <bcp14>MAY</bcp14> include authorized conflict
context in a Problem Details response, but clients <bcp14>MUST</bcp14> treat it as untrusted
and potentially stale.</t>
      </section>
      <section anchor="deferred-processing">
        <name>Deferred Processing</name>
        <t>A precondition checked only when <tt>202 Accepted</tt> is emitted does not protect a
state transition committed later. A server performing deferred processing
<bcp14>MUST</bcp14> do at least one of the following:</t>
        <ul spacing="normal">
          <li>
            <t>commit the CRS transition before returning <tt>202</tt>, deferring only external
side effects;</t>
          </li>
          <li>
            <t>reserve or fence the matched version until commit; or</t>
          </li>
          <li>
            <t>re-evaluate the expected validator atomically when the deferred transition
commits.</t>
          </li>
        </ul>
        <t>A commit-time mismatch <bcp14>MUST</bcp14> prevent the CRS mutation. The operation's status
resource or equivalent completion channel <bcp14>MUST</bcp14> report a failed-precondition
outcome. The original <tt>202</tt> response cannot be retrospectively changed to
<tt>412</tt>.</t>
      </section>
      <section anchor="resource-creation">
        <name>Resource Creation</name>
        <t>The version-specific precondition requirement applies to mutations of existing
concurrency domains. Common creation patterns include:</t>
        <ul spacing="normal">
          <li>
            <t><tt>POST</tt> to a collection resource, with the new resource URI and initial
validator returned on success; and</t>
          </li>
          <li>
            <t><tt>PUT</tt> with <tt>If-None-Match: *</tt> to create a resource only when no current
representation exists at the target URI.</t>
          </li>
        </ul>
        <t>Once created, later protected mutations use AST Core or AST Semantic as
advertised. AST does not define an idempotency-key field or replay store;
applications can use a separately specified idempotency mechanism.</t>
      </section>
    </section>
    <section anchor="read-and-cache-behavior">
      <name>Read and Cache Behavior</name>
      <section anchor="reading-the-sbr">
        <name>Reading the SBR</name>
        <t>The State-Bearing Resource <bcp14>MUST</bcp14> support <tt>GET</tt>. It <bcp14>SHOULD</bcp14> support <tt>HEAD</tt> when
the implementation can provide metadata consistent with the corresponding
<tt>GET</tt>.</t>
        <t>AST Core clients use ordinary <tt>If-None-Match</tt> against the State-Bearing
Resource. A server returns <tt>304 Not Modified</tt> only when the standard HTTP
precondition evaluates as specified by <xref target="RFC9110"/>. When the corresponding
<tt>200</tt> response would contain <tt>ETag</tt>, the <tt>304</tt> response <bcp14>MUST</bcp14> contain the same
current ETag as required by HTTP.</t>
        <sourcecode type="http"><![CDATA[
GET /api/article/123 HTTP/1.1
Accept: application/json
If-None-Match: "json-v18"

HTTP/1.1 304 Not Modified
ETag: "json-v18"
]]></sourcecode>
        <t>Semantic equivalence alone never authorizes a <tt>304</tt>; AST Semantic does not
change cache revalidation semantics.</t>
      </section>
      <section anchor="reading-projections">
        <name>Reading Projections</name>
        <t>Projected Representations use normal HTTP cache validators. A projection's
ETag <bcp14>MUST NOT</bcp14> be sent as <tt>If-Match</tt> to the State-Bearing Resource unless it is
also, under ordinary HTTP semantics, a current validator of the selected SBR.</t>
        <t>AST Semantic projections can expose <tt>Semantic-ETag</tt> for logical-state
observation, but caches continue to use ordinary ETags and standard freshness
rules.</t>
      </section>
      <section anchor="vary-and-content-negotiation">
        <name>Vary and Content Negotiation</name>
        <t>A response <bcp14>MUST</bcp14> include <tt>Vary</tt> for every request field used to select its
representation, including <tt>Accept</tt>, <tt>Accept-Language</tt>, or <tt>Accept-Encoding</tt> as
applicable <xref target="RFC9111"/>. AST does not create a new cache key and does not waive
ordinary content-negotiation requirements.</t>
        <t>Range requests do not change validator scope. An origin <bcp14>MAY</bcp14> decline range
support for operational reasons, but AST does not require <tt>Accept-Ranges:
none</tt> merely because an SBR is JSON.</t>
      </section>
    </section>
    <section anchor="validator-construction">
      <name>Validator Construction</name>
      <section anchor="representation-etags">
        <name>Representation ETags</name>
        <t>An SBR ETag can be generated using a content hash, a representation revision,
or another mechanism satisfying strong-validator requirements. A revision
counter used as a strong ETag <bcp14>MUST</bcp14> change whenever the selected SBR
representation data changes, including changes caused by serializers, schema
profiles, or emitted fields.</t>
        <t>If a content hash is used, it <bcp14>MUST</bcp14> be computed over the exact representation
data validated by the ETag. For a deterministic JSON SBR, an implementation
<bcp14>MAY</bcp14> use JCS <xref target="RFC8785"/>, but AST does not require JCS when another method satisfies
HTTP strong-validator semantics.</t>
      </section>
      <section anchor="semantic-validators">
        <name>Semantic Validators</name>
        <t>AST Semantic validator construction follows
<xref target="I-D.jurkovikj-http-semantic-validator"/>. It is independent of the selected
representation's bytes and can therefore remain equal across media types or
content codings when they belong to the same concurrency domain.</t>
      </section>
      <section anchor="stored-validators">
        <name>Stored Validators</name>
        <t>Storing a validator beside the CRS is permitted, but the storage update alone
does not establish conformance. The compare, transition, and validator
publication <bcp14>MUST</bcp14> be one atomic operation as described above.</t>
      </section>
    </section>
    <section anchor="discovery-and-linking">
      <name>Discovery and Linking</name>
      <section anchor="the-concurrency-state-link-relation">
        <name>The <tt>concurrency-state</tt> Link Relation</name>
        <t>A Projected Resource <bcp14>SHOULD</bcp14> include a <tt>concurrency-state</tt> link to the
canonical State-Bearing Resource:</t>
        <sourcecode type="http"><![CDATA[
Link: </api/article/123>; rel="concurrency-state"; type="application/json"
]]></sourcecode>
        <t>The link target identifies the resource from which a client can retrieve the
complete state needed to understand and reconcile protected mutations. The
link itself does not transfer a validator and does not change the target scope
of <tt>If-Match</tt>.</t>
        <t>The <tt>type</tt> target attribute <bcp14>SHOULD</bcp14> identify the expected SBR media type. A
client <bcp14>MUST</bcp14> still process the target's actual response according to HTTP and
<bcp14>MUST</bcp14> obtain its ordinary ETag from the target in AST Core.</t>
      </section>
      <section anchor="same-origin-default">
        <name>Same-Origin Default</name>
        <t>Clients <bcp14>SHOULD</bcp14> follow <tt>concurrency-state</tt> links automatically only when the
target is same-origin. Following a cross-origin <tt>concurrency-state</tt> link
requires explicit client policy covering trust, redirects, DNS rebinding,
private-network destinations, TLS identity, and credential handling.</t>
        <t>A client <bcp14>MUST NOT</bcp14> automatically forward <tt>Authorization</tt>, cookies, client
certificates, or other ambient credentials to a newly discovered authority
solely because it appears in a <tt>concurrency-state</tt> link.</t>
      </section>
      <section anchor="alternate-representations">
        <name>Alternate Representations</name>
        <t>The registered <tt>alternate</tt> relation <bcp14>MAY</bcp14> be used for navigation among other
representations. An <tt>alternate</tt> link does not imply AST participation or
concurrency semantics.</t>
      </section>
    </section>
    <section anchor="integrity-and-transport">
      <name>Integrity and Transport</name>
      <t>ETags and semantic validators are not content-integrity or authentication
mechanisms. When payload integrity is required, a sender can use Digest Fields
<xref target="RFC9530"/>. When message authentication is required, an application can use an
appropriate authentication or signature mechanism.</t>
      <t>Request digest validation is independent of AST precondition evaluation. A
server performs authentication, authorization, request syntax and digest
validation, and other normal checks before the atomic AST compare-and-commit
step.</t>
    </section>
    <section anchor="non-ast-resources-and-fallback">
      <name>Non-AST Resources and Fallback</name>
      <t>A server <bcp14>MAY</bcp14> implement AST for only part of an API. Clients <bcp14>MUST NOT</bcp14> infer AST
support for one resource from support on another resource at the same origin.</t>
      <t>A client that cannot establish AST Core or AST Semantic support <bcp14>MUST NOT</bcp14> assume
that a mutation is protected. It can use application documentation, decline
the mutation, or use another application-specific safety mechanism.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="authorization-and-state-scope">
        <name>Authorization and State Scope</name>
        <t>The SBR can expose more information than a rendered projection. A server <bcp14>MUST</bcp14>
apply authorization appropriate to the complete state and <bcp14>MUST NOT</bcp14> expose
fields merely because the user can access a redacted projection.</t>
        <t>Different authorization views require different concurrency or semantic
equivalence domains unless they expose exactly the same mutation-relevant CRS.
Authentication and authorization checks <bcp14>MUST</bcp14> precede disclosure of current
validators or conflict state.</t>
      </section>
      <section anchor="cross-resource-and-cross-origin-confusion">
        <name>Cross-Resource and Cross-Origin Confusion</name>
        <t>An ordinary ETag from one target resource cannot be treated as an <tt>If-Match</tt>
condition on another. AST Semantic permits cross-resource validation only
through an explicitly advertised semantic equivalence domain and
<tt>If-Semantic-Match</tt>.</t>
        <t>Cross-origin discovery can create SSRF, credential-forwarding, redirect, and
trust-boundary risks. Same-origin discovery is the default; clients need an
explicit cross-origin policy.</t>
      </section>
      <section anchor="atomicity">
        <name>Atomicity</name>
        <t>Failure to serialize every writer in a concurrency domain defeats AST's lost-
update guarantee. Operators <bcp14>MUST</bcp14> audit non-HTTP write paths and distributed
components, not only the public request handler.</t>
      </section>
      <section anchor="validator-disclosure-and-tracking">
        <name>Validator Disclosure and Tracking</name>
        <t>Validators can reveal update frequency, correlate views, or expose internal
revision identifiers. Servers <bcp14>SHOULD</bcp14> use opaque or privacy-preserving
construction and separate domains when correlation is sensitive. Validators
<bcp14>MUST NOT</bcp14> be treated as authorization tokens.</t>
      </section>
      <section anchor="blind-retry">
        <name>Blind Retry</name>
        <t>A new validator does not prove that a stale operation remains semantically
valid. Clients that blindly retry after <tt>412</tt> can overwrite intervening
changes despite using a current validator. The mandatory reconciliation rule
reduces this risk.</t>
      </section>
      <section anchor="transformation-and-intermediaries">
        <name>Transformation and Intermediaries</name>
        <t>Intermediaries can transform, compress, strip, or rewrite representation
metadata. AST Core deployments <bcp14>SHOULD</bcp14> use a dedicated identity-coded SBR with
<tt>Cache-Control: no-transform</tt>. AST Semantic separates representation ETags
from semantic state, but clients still require end-to-end assurance that the
origin enforces the semantic precondition.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to register the following relation in the "Link Relation
Types" registry established by <xref target="RFC8288"/>.</t>
      <ul spacing="normal">
        <li>
          <t>Relation Name: concurrency-state</t>
        </li>
        <li>
          <t>Description: Refers to the resource that provides the complete authoritative
state used to understand and reconcile conditional updates to the context
resource.</t>
        </li>
        <li>
          <t>Reference: this document</t>
        </li>
        <li>
          <t>Notes: The target can expose an ordinary ETag for AST Core and a
<tt>Semantic-ETag</tt> for AST Semantic. The relation does not change the scope or
meaning of <tt>If-Match</tt>.</t>
        </li>
      </ul>
      <t>Before registration, an implementation that needs an extension relation type
<bcp14>SHOULD</bcp14> use a URI under a namespace it controls. A mutable Datatracker document
URL is not a permanent extension-relation namespace.</t>
    </section>
    <section anchor="conformance-summary">
      <name>Conformance Summary</name>
      <section anchor="ast-core-server">
        <name>AST Core Server</name>
        <t>An AST Core server:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> designate one canonical State-Bearing Resource per concurrency domain;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> expose a strong ETag for the selected SBR;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> require a version-specific <tt>If-Match</tt> on every protected mutation;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> ensure that the mutation targets and selects the SBR;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> return <tt>428</tt> when the required version-specific condition is absent and
<tt>412</tt> when it is false;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> atomically compare, transition, and publish the new validator; and</t>
          </li>
          <li>
            <t><bcp14>MUST NOT</bcp14> reinterpret an SBR ETag as an <tt>If-Match</tt> condition on another target
resource.</t>
          </li>
        </ul>
      </section>
      <section anchor="ast-semantic-server">
        <name>AST Semantic Server</name>
        <t>An AST Semantic server additionally:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> implement <xref target="I-D.jurkovikj-http-semantic-validator"/>;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> positively advertise enforcement for each protected target and
mutation method;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> require a version-specific <tt>If-Semantic-Match</tt> for cross-representation
or cross-resource protected mutations;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> use one complete concurrency domain for equal semantic validators; and</t>
          </li>
          <li>
            <t><bcp14>SHOULD</bcp14> return the resulting <tt>Semantic-ETag</tt> after a successful transition.</t>
          </li>
        </ul>
      </section>
      <section anchor="ast-client">
        <name>AST Client</name>
        <t>An AST client:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> possess the validator for the state against which its mutation was
constructed;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> use <tt>If-Match</tt> only at the SBR target in AST Core;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> use <tt>If-Semantic-Match</tt> only after positive capability discovery in AST
Semantic;</t>
          </li>
          <li>
            <t><bcp14>MUST NOT</bcp14> use wildcard-only conditions as AST version evidence; and</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> reconcile state after <tt>412</tt> rather than blindly substituting a returned
validator.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="changes-since-01">
      <name>Changes Since <tt>-01</tt></name>
      <t>This revision:</t>
      <ul spacing="normal">
        <li>
          <t>separates AST Core and AST Semantic conformance modes;</t>
        </li>
        <li>
          <t>restricts AST Core <tt>If-Match</tt> to the selected SBR at the request target;</t>
        </li>
        <li>
          <t>integrates <tt>Semantic-ETag</tt> and <tt>If-Semantic-Match</tt> for cross-resource writes;</t>
        </li>
        <li>
          <t>requires resource-and-method-specific capability signaling for semantic
preconditions;</t>
        </li>
        <li>
          <t>requires <tt>428</tt> rather than a <tt>400</tt> fallback;</t>
        </li>
        <li>
          <t>rejects wildcard-only conditions as AST version evidence;</t>
        </li>
        <li>
          <t>requires atomic compare-and-commit across every writer;</t>
        </li>
        <li>
          <t>corrects deferred <tt>202</tt> processing;</t>
        </li>
        <li>
          <t>removes the <tt>state-etag</tt> Link parameter and the <tt>204</tt> plus
<tt>Content-Location</tt> ETag pattern;</t>
        </li>
        <li>
          <t>names the state-discovery relation <tt>concurrency-state</tt>;</t>
        </li>
        <li>
          <t>prohibits blind retry based only on a validator returned with <tt>412</tt>;</t>
        </li>
        <li>
          <t>distinguishes semantic validators from ordinary cache validators and digest
fields;</t>
        </li>
        <li>
          <t>makes same-origin <tt>concurrency-state</tt> discovery the default; and</t>
        </li>
        <li>
          <t>clarifies that a TCT M-URL is a projection unless explicitly designated as a
complete AST SBR.</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="I-D.jurkovikj-http-semantic-validator">
          <front>
            <title>Semantic Validators for HTTP</title>
            <author fullname="Antun Jurkovikj" initials="A." surname="Jurkovikj">
         </author>
            <date day="27" month="July" year="2026"/>
            <abstract>
              <t>   This document defines the Semantic-ETag HTTP response field and the
   If-Semantic-Match HTTP request field.  Unlike the standard ETag
   field, which identifies a selected representation, Semantic-ETag
   identifies a server-defined semantic state within an explicitly
   scoped semantic equivalence domain.  If-Semantic-Match enables origin
   servers to perform representation-independent optimistic concurrency
   control when different HTTP resources or representations expose the
   same logical state.

   This document does not update or replace the semantics of ETag, If-
   Match, or HTTP cache validation defined by RFC 9110.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jurkovikj-http-semantic-validator-01"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC6585">
          <front>
            <title>Additional HTTP Status Codes</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>This document specifies additional HyperText Transfer Protocol (HTTP) status codes for a variety of common situations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6585"/>
          <seriesInfo name="DOI" value="10.17487/RFC6585"/>
        </reference>
        <reference anchor="RFC9457">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <author fullname="S. Dalal" initials="S." surname="Dalal"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
              <t>This document obsoletes RFC 7807.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9457"/>
          <seriesInfo name="DOI" value="10.17487/RFC9457"/>
        </reference>
        <reference anchor="RFC9111">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="RFC8288">
          <front>
            <title>Web Linking</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This specification defines a model for the relationships between resources on the Web ("links") and the type of those relationships ("link relation types").</t>
              <t>It also defines the serialisation of such links in HTTP headers with the Link header field.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8288"/>
          <seriesInfo name="DOI" value="10.17487/RFC8288"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.jurkovikj-collab-tunnel">
          <front>
            <title>The Collaboration Content Transfer (TCT) Protocol</title>
            <author fullname="Antun Jurkovikj" initials="A." surname="Jurkovikj">
         </author>
            <date day="12" month="May" year="2026"/>
            <abstract>
              <t>   This document specifies the Collaboration Content Transfer (TCT)
   Protocol, an HTTP-based method for efficient, verifiable delivery of
   web content to automated agents.  TCT defines a JSON envelope that
   encapsulates resource content in negotiated text-based formats (such
   as Markdown or plain text) together with canonical metadata.  It uses
   bidirectional URL discovery between human-facing and machine-facing
   URLs, JSON sitemaps, strong ETag validators, and conditional requests
   to reduce bandwidth while preserving semantic structure and canonical
   identity.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jurkovikj-collab-tunnel-02"/>
        </reference>
        <reference anchor="RFC8785">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>
            <author fullname="A. Rundgren" initials="A." surname="Rundgren"/>
            <author fullname="B. Jordan" initials="B." surname="Jordan"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>Cryptographic operations like hashing and signing need the data to be expressed in an invariant format so that the operations are reliably repeatable. One way to address this is to create a canonical representation of the data. Canonicalization also permits data to be exchanged in its original form on the "wire" while cryptographic operations performed on the canonicalized counterpart of the data in the producer and consumer endpoints generate consistent results.</t>
              <t>This document describes the JSON Canonicalization Scheme (JCS). This specification defines how to create a canonical representation of JSON data by building on the strict serialization methods for JSON primitives defined by ECMAScript, constraining JSON data to the Internet JSON (I-JSON) subset, and by using deterministic property sorting.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8785"/>
          <seriesInfo name="DOI" value="10.17487/RFC8785"/>
        </reference>
        <reference anchor="RFC9530">
          <front>
            <title>Digest Fields</title>
            <author fullname="R. Polli" initials="R." surname="Polli"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
              <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9530"/>
          <seriesInfo name="DOI" value="10.17487/RFC9530"/>
        </reference>
      </references>
    </references>
    <?line 782?>

<section anchor="appendix-a-ast-core-example">
      <name>Appendix A. AST Core Example</name>
      <section anchor="read-the-sbr">
        <name>Read the SBR</name>
        <sourcecode type="http"><![CDATA[
GET /api/article/123 HTTP/1.1
Host: example.com
Accept: application/json
Accept-Encoding: identity

HTTP/1.1 200 OK
Content-Type: application/json
ETag: "json-v18"
Cache-Control: no-cache, no-transform
Link: <https://www.ietf.org/archive/id/draft-jurkovikj-httpapi-agentic-state-02.html#ast-core-profile>; rel="profile"

{"id":123,"status":"published","title":"Example"}
]]></sourcecode>
      </section>
      <section anchor="conditional-mutation">
        <name>Conditional Mutation</name>
        <sourcecode type="http"><![CDATA[
PATCH /api/article/123 HTTP/1.1
Host: example.com
Accept: application/json
Accept-Encoding: identity
Content-Type: application/merge-patch+json
If-Match: "json-v18"

{"status":"draft"}
]]></sourcecode>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 204 No Content
ETag: "json-v19"
]]></sourcecode>
      </section>
      <section anchor="projected-target-rejection">
        <name>Projected Target Rejection</name>
        <sourcecode type="http"><![CDATA[
PATCH /article/123 HTTP/1.1
Host: example.com
If-Match: "json-v18"
Content-Type: application/merge-patch+json

{"status":"draft"}
]]></sourcecode>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD
Link: </api/article/123>; rel="concurrency-state"; type="application/json"
]]></sourcecode>
      </section>
    </section>
    <section anchor="appendix-b-ast-semantic-example">
      <name>Appendix B. AST Semantic Example</name>
      <section anchor="read-a-projection">
        <name>Read a Projection</name>
        <sourcecode type="http"><![CDATA[
GET /article/123 HTTP/1.1
Host: example.com
Accept: text/html

HTTP/1.1 200 OK
Content-Type: text/html
ETag: "html-v52"
Semantic-ETag: "article-state-v7"
Link: </api/article/123>; rel="concurrency-state"; type="application/json"
Link: <https://www.ietf.org/archive/id/draft-jurkovikj-httpapi-agentic-state-02.html#ast-semantic-profile>; rel="profile"
]]></sourcecode>
      </section>
      <section anchor="conditional-mutation-through-the-projected-target">
        <name>Conditional Mutation Through the Projected Target</name>
        <sourcecode type="http"><![CDATA[
PATCH /article/123 HTTP/1.1
Host: example.com
Content-Type: application/merge-patch+json
If-Semantic-Match: "article-state-v7"

{"status":"draft"}
]]></sourcecode>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 204 No Content
Semantic-ETag: "article-state-v8"
Link: </api/article/123>; rel="concurrency-state"; type="application/json"
]]></sourcecode>
      </section>
      <section anchor="conflict">
        <name>Conflict</name>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 412 Precondition Failed
Content-Type: application/problem+json
Semantic-ETag: "article-state-v9"
Link: </api/article/123>; rel="concurrency-state"; type="application/json"

{
  "type": "https://example.com/problems/precondition-failed",
  "title": "Precondition failed",
  "status": 412,
  "detail": "Retrieve the current state and reconcile the intended change."
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="appendix-c-single-uri-core-deployment">
      <name>Appendix C. Single-URI Core Deployment</name>
      <t>A single URI can serve both HTML and the SBR by content negotiation, but the
protected mutation must unambiguously select the same SBR variant:</t>
      <sourcecode type="http"><![CDATA[
GET /article/123 HTTP/1.1
Host: example.com
Accept: application/json
Accept-Encoding: identity

HTTP/1.1 200 OK
Content-Type: application/json
ETag: "json-v18"
Vary: Accept
]]></sourcecode>
      <sourcecode type="http"><![CDATA[
PATCH /article/123 HTTP/1.1
Host: example.com
Accept: application/json
Accept-Encoding: identity
Content-Type: application/merge-patch+json
If-Match: "json-v18"

{"status":"draft"}
]]></sourcecode>
      <t>If the server cannot unambiguously select the SBR for the unsafe request, it
<bcp14>MUST NOT</bcp14> apply AST Core <tt>If-Match</tt> semantics to that request. A dedicated SBR
URI is therefore preferred.</t>
    </section>
    <section anchor="appendix-d-canonicalization-test-vector">
      <name>Appendix D. Canonicalization Test Vector</name>
      <t>For deployments that choose JCS and SHA-256 for the SBR representation:</t>
      <t>Input JSON:</t>
      <sourcecode type="json"><![CDATA[
{
  "status": "published",
  "id": 123
}
]]></sourcecode>
      <t>JCS form:</t>
      <artwork><![CDATA[
{"id":123,"status":"published"}
]]></artwork>
      <t>SHA-256 hexadecimal:</t>
      <artwork><![CDATA[
f8b47f69857655c0c84feb9427d443d92c7c0e1b443933d91891589f5eee6e51
]]></artwork>
      <t>Base64-encoded digest example:</t>
      <artwork><![CDATA[
+LR/aYV2VcDIT+uUJ9RD2Sx8DhtEOTPZGJFYn17ublE=
]]></artwork>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+196XIcR7be/3yKNPRDdzjdTQICRRKcxSBAjShzMwBpYuxw
uKurq4ESq6valVWAehScZ7nPcp/MZ82luhoiZ+QZO8I/FCJ6yco8eZbvrD2d
Tk1XdlVxYg++vbp6b9+3zaqsCrtqWnvW1MuyK5s6q+z3m2XWFc52jb28ydpi
aS8K1/RtXtjLDt6x/3Z6XdRdmcufV21Wu1XR/ubAZItFW9zCA8Y/cWCWTV5n
a9jCss1W3fTHvv3Q3JYffpzedN0m25TTjL84dfjF6aMjk8P/r5t2e2IX+cbk
Te2K2vXuxHZtX5hy09K/XHf06NEz+LjrF+vSOThJt93Ac169vPrGwGL18n9m
VVPDK9vCGTzgiT16dPT19NGT6dETA8fMTuyfi4WFT9pXdVe0ddHxxjdN25kP
xfauaZcnFkk3sbCPvG/bos63E/vyKrueWNqxXWc1HGENhzAm67ubpj0xdmr5
0Kd119f2Oz20sdYW66ysTuCp8I5QI//P1/jiLG/WxkynU5stXNdmOaxI95Zt
NlUJZIEzOrtqi//Vw9OqrS1+2jSusHBIWzXX8InKNosfi7yz3U3b9Nc31hW3
RZtVpi02bQF07GQRYIBWrtjN7Lt2WdZZu6WjWryObmu77NrZcol/rbawUAXr
FsvhSs/hUcXWLhtbN93ELrb49xo+fVu4id20cLplYTMkn7LbtCd2M+siv8nq
0q2t22R1XdbXdlmugGlgcUuHdHCQrL0uOjcz5uqmdPCcvEdSw1eKvFyVwLTj
jAcse3n1mwmQmQ+1Caxv4AC3+B14YNXAM/rA/o7ZPyI43/LMwnIgM21BOyuB
BDYzeVXiXuB7656eDmfnfUxfFFmLD/CC1Dv8Ez8AV9vAP5GHbLOyZefM8Dsx
iYk/+Xvwr6xd2vmr1fRN1uU3cwsUqJa8uUtgLCSE6R1sbq5/TvE5c1oEv+df
lgXubgp4ApKno/vlk+BjhfImS25FTkP8k+yyrHmTwPaxrMCNAWvXM3t1Uxi9
hKxyjV0Wq7KGnbIULUuXN8CrIFxZ16zhPkEYNnAZU9j5FP69Lju7KG6y27Jp
J6gVVnBDnQUOWlZAtAmuV7R4efAU4GpHL+ZZfoMkRS0CElXWnZsQLVwBOwQ2
N3KdyFTIZSh963K5rApjzBeoF9pm2ed4RGNOLa6KB4j4QyQOmLNZdUDM29KV
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

-->

</rfc>
