<?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.29 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-jurkovikj-collab-tunnel-01" category="exp" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="TCT">The Collaboration Tunnel Protocol (TCT)</title>
    <seriesInfo name="Internet-Draft" value="draft-jurkovikj-collab-tunnel-01"/>
    <author initials="A." surname="Jurkovikj" fullname="Antun Jurkovikj">
      <organization/>
      <address>
        <postal>
          <country>North Macedonia</country>
        </postal>
        <email>antunjurkovic@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="November" day="14"/>
    <abstract>
      <?line 27?>

<t>This document specifies the Collaboration Tunnel Protocol, an HTTP-based method for efficient, verifiable delivery of web content to automated agents. The protocol uses bidirectional URL discovery, template-invariant content fingerprinting with strong ETags, sitemap-first verification, and strict conditional request discipline to reduce bandwidth while preserving canonical URLs.</t>
    </abstract>
  </front>
  <middle>
    <?line 31?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Automated agents (search engines, AI crawlers, archives, monitoring tools, aggregators) increasingly consume web content at scale. Fetching and parsing full HTML pages for machine consumption is often inefficient:</t>
      <ul spacing="normal">
        <li>
          <t>Page weight is dominated by templates, navigation, ads, and scripts.</t>
        </li>
        <li>
          <t>Machine consumers typically need a stable textual representation of the core content.</t>
        </li>
        <li>
          <t>Many pages do not change frequently, but are re-fetched in full.</t>
        </li>
      </ul>
      <t>Various sites already expose JSON APIs or feeds, but:</t>
      <ul spacing="normal">
        <li>
          <t>formats differ across sites, and</t>
        </li>
        <li>
          <t>use of HTTP validators is inconsistent.</t>
        </li>
      </ul>
      <t>The Collaboration Tunnel Protocol (TCT) defines a simple, interoperable profile on top of HTTP that:</t>
      <ul spacing="normal">
        <li>
          <t>exposes a canonical JSON representation (M-URL) for selected resources;</t>
        </li>
        <li>
          <t>advertises C-URL/M-URL mappings and validators in a JSON sitemap (M-Sitemap);</t>
        </li>
        <li>
          <t>uses a single, well-defined strong ETag method for M-URLs; and</t>
        </li>
        <li>
          <t>enables "zero-fetch" behavior when content is unchanged.</t>
        </li>
      </ul>
      <t>TCT is intentionally conservative: it uses only existing HTTP mechanisms, is backward compatible with the Web, and does not define policy or licensing semantics.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals.</t>
        <ul spacing="normal">
          <li>
            <t>C-URL:
            </t>
            <ul spacing="normal">
              <li>
                <t>The canonical, human-facing URL of a resource, typically an HTML document.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>M-URL:
            </t>
            <ul spacing="normal">
              <li>
                <t>The machine-facing URL providing the TCT JSON representation of that resource.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>M-Sitemap:
            </t>
            <ul spacing="normal">
              <li>
                <t>The JSON sitemap enumerating C-URL/M-URL pairs and associated validators.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Representation:
            </t>
            <ul spacing="normal">
              <li>
                <t>As defined in <xref target="RFC9110"/>: the information in a payload, including representation metadata, that is subject to content negotiation.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Unless stated otherwise, "client" refers to an automated agent that is aware of TCT.</t>
        <section anchor="problem-statement">
          <name>Problem Statement</name>
          <t>Key inefficiencies in current automated consumption of web content include:</t>
          <ul spacing="normal">
            <li>
              <t>repeated transfer of large HTML documents whose core content has not changed;</t>
            </li>
            <li>
              <t>lack of a standard, compact, semantics-focused representation for page-like resources;</t>
            </li>
            <li>
              <t>ad hoc usage or absence of validators (ETag, Last-Modified), hindering efficient revalidation;</t>
            </li>
            <li>
              <t>difficulty for agents to reason about change detection at scale using only HTML and XML sitemaps.</t>
            </li>
          </ul>
        </section>
        <section anchor="goals-and-non-goals">
          <name>Goals and Non-Goals</name>
          <t>TCT is designed to:</t>
          <ul spacing="normal">
            <li>
              <t>reuse HTTP semantics (<xref target="RFC9110"/>, <xref target="RFC9111"/>) rather than introduce new ones;</t>
            </li>
            <li>
              <t>provide a simple, deterministic JSON representation appropriate for:
              </t>
              <ul spacing="normal">
                <li>
                  <t>search indexing,</t>
                </li>
                <li>
                  <t>content analysis,</t>
                </li>
                <li>
                  <t>retrieval-augmented generation (RAG),</t>
                </li>
                <li>
                  <t>archival and monitoring;</t>
                </li>
              </ul>
            </li>
            <li>
              <t>define discovery and validation clearly enough for interoperable clients and servers.</t>
            </li>
          </ul>
          <t>TCT explicitly does NOT:</t>
          <ul spacing="normal">
            <li>
              <t>define how content may or may not be used (policy, licensing, AI usage);</t>
            </li>
            <li>
              <t>change the semantics of resources at C-URLs;</t>
            </li>
            <li>
              <t>require new HTTP methods or status codes.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="architecture">
        <name>Architecture</name>
        <t>TCT introduces three main elements per participating origin:</t>
        <ul spacing="normal">
          <li>
            <t>C-URL:
            </t>
            <ul spacing="normal">
              <li>
                <t>The canonical resource URL for humans, often serving HTML.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>M-URL:
            </t>
            <ul spacing="normal">
              <li>
                <t>A URL providing a canonical JSON representation of the same logical resource (TCT JSON).</t>
              </li>
            </ul>
          </li>
          <li>
            <t>M-Sitemap:
            </t>
            <ul spacing="normal">
              <li>
                <t>A JSON document listing C-URLs, M-URLs, and strong validators (<tt>etag</tt> values).</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>High-level flow (informative):</t>
        <ol spacing="normal" type="1"><li>
            <t>Client performs <tt>GET /</tt> at <tt>https://example.com/</tt>.</t>
          </li>
          <li>
            <t>The origin root response includes:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>Link: &lt;/llm-pages.json&gt;; rel="index"; type="application/json"</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Client fetches <tt>/llm-pages.json</tt> (M-Sitemap).</t>
          </li>
          <li>
            <t>For each item:
            </t>
            <ul spacing="normal">
              <li>
                <t>learns <tt>(cUrl, mUrl, etag)</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Client fetches <tt>mUrl</tt> as needed:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>GET mUrl</tt>, with <tt>If-None-Match</tt> on subsequent checks.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Server responds with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>200 OK</tt> + JSON when changed;</t>
              </li>
              <li>
                <t><tt>304 Not Modified</tt> when unchanged.</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>TCT is additive and optional:</t>
        <ul spacing="normal">
          <li>
            <t>Non-TCT clients ignore TCT artifacts.</t>
          </li>
          <li>
            <t>Servers can deploy TCT gradually alongside existing content and sitemaps.</t>
          </li>
        </ul>
      </section>
      <section anchor="design-rationale-and-relation-to-existing-mechanisms">
        <name>Design Rationale and Relation to Existing Mechanisms</name>
        <t>TCT is grounded in existing mechanisms and complements several related efforts:</t>
        <section anchor="related-work">
          <name>Related Work</name>
          <t><strong>XML Sitemaps:</strong>
- Widely deployed for URL discovery (search engines, crawlers).
- Provide <tt>&lt;lastmod&gt;</tt> timestamps but do not define normative bindings between sitemap entries and HTTP validators (ETags) for endpoint representations.
- TCT builds on this model by adding structured JSON representations and strong validator integration.</t>
          <t><strong>ResourceSync:</strong>
- Developed by the Open Archives Initiative and collaborators for resource synchronization in digital libraries.
- Provides resource lists, change lists, and capability documents.
- Focus is synchronization and preservation; does not define a single, tightly integrated pattern combining:
  - per-resource JSON representation,
  - sitemap listing with validators, and
  - ETag-based zero-fetch semantics.
- TCT addresses the specific use case of efficient web content delivery to automated agents.</t>
          <t><strong>AMP (Accelerated Mobile Pages):</strong>
- Defines an HTML subset optimized for fast rendering on mobile devices.
- Provides alternate representations via <tt>&lt;link rel="amphtml"&gt;</tt>.
- TCT provides JSON (not HTML) for machine consumption, targeting crawlers and content analysis rather than human browsing.</t>
          <t><strong>Custom JSON APIs:</strong>
- Many sites expose custom JSON endpoints for content access.
- Structures, field names, and validator usage vary widely across implementations.
- TCT aims to standardize a minimal, interoperable profile suitable for broad adoption.</t>
          <t><strong>robots.txt:</strong>
- Defines crawl directives and access policies.
- TCT does not replace robots.txt; publishers MAY use both mechanisms:
  - robots.txt for crawl permissions and rate guidance, and
  - TCT for efficient content delivery.</t>
          <t><strong>RSS/Atom Feeds:</strong>
- Provide syndication of updates and content excerpts.
- Typically lack HTTP caching integration (per-item ETags, conditional requests).
- TCT can be viewed as "RSS with disciplined HTTP caching semantics."</t>
        </section>
        <section anchor="tct-design-choices">
          <name>TCT Design Choices</name>
          <t>Key design choices in TCT:</t>
          <ul spacing="normal">
            <li>
              <t>Use only existing HTTP semantics:
              </t>
              <ul spacing="normal">
                <li>
                  <t>GET, HEAD, 200, 304, ETag, Cache-Control, Link.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Use JSON as the machine representation:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Simple, widely supported, easy to parse.</t>
                </li>
                <li>
                  <t>TCT is complementary to existing HTTP content-coding and dictionary-based compression mechanisms: it reduces representation size and refetch frequency at the application layer while remaining fully compatible with compression applied to M-URL responses.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Define one strong ETag method:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Based on canonical JSON bytes of the M-URL payload.</t>
                </li>
                <li>
                  <t>Avoid ambiguous or dual hash methods.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Keep policy and energy considerations out of the core:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Those can be specified separately as informational work.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The intent is to offer an interoperable profile that is:</t>
          <ul spacing="normal">
            <li>
              <t>easy to implement,</t>
            </li>
            <li>
              <t>friendly to existing caches/CDNs, and</t>
            </li>
            <li>
              <t>precise enough for standardization.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="discovery">
        <name>Discovery</name>
        <section anchor="m-sitemap-discovery">
          <name>M-Sitemap Discovery</name>
          <t>A publisher implementing TCT MUST expose an M-Sitemap and advertise it from the origin root resource.</t>
          <t>When a client performs:</t>
          <ul spacing="normal">
            <li>
              <t><tt>GET /</tt> with <tt>Host: example.com</tt></t>
            </li>
          </ul>
          <t>and receives a successful (2xx) response (either directly or after following redirects per <xref target="RFC9110"/>), that response:</t>
          <ul spacing="normal">
            <li>
              <t>MUST include a <tt>Link</tt> header with:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>rel="index"</tt></t>
                </li>
                <li>
                  <t><tt>type="application/json"</tt></t>
                </li>
                <li>
                  <t>a target that is the M-Sitemap URL for this origin.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>Example:</t>
          <ul spacing="normal">
            <li>
              <t><tt>Link: &lt;/llm-sitemap.json&gt;; rel="index"; type="application/json"</tt></t>
            </li>
          </ul>
          <t>In this specification, a Link header field with <tt>rel="index"</tt>, <tt>type="application/json"</tt>, and a target whose content matches Section 7 identifies the TCT M-Sitemap for that origin. Other uses of <tt>rel="index"</tt> remain valid and are outside the scope of this document.</t>
          <t>Notes:</t>
          <ul spacing="normal">
            <li>
              <t><tt>/llm-sitemap.json</tt> is an example; any stable path MAY be used.</t>
            </li>
            <li>
              <t>If <tt>/</tt> redirects (e.g., <tt>301</tt> or <tt>302</tt> to <tt>/en/</tt> or <tt>/index.html</tt>), the <tt>Link</tt> header MUST appear on the final redirect target.</t>
            </li>
            <li>
              <t>Clients:
              </t>
              <ul spacing="normal">
                <li>
                  <t>SHOULD follow redirects per <xref target="RFC9110"/> before checking for TCT support.</t>
                </li>
                <li>
                  <t>MUST discover the M-Sitemap via the <tt>Link</tt> header on the final response.</t>
                </li>
                <li>
                  <t>If no such <tt>Link</tt> is present, SHOULD assume TCT is not deployed and MUST NOT guess paths.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>If multiple <tt>Link</tt> headers with <tt>rel="index"</tt> and <tt>type="application/json"</tt> are present, clients MAY choose any or load all. This document does not define multi-sitemap selection semantics; large-site sharding is left to operational conventions (see Section 9.2).</t>
            </li>
          </ul>
          <t>This specification does not define or require any <tt>/.well-known/</tt> URI.</t>
        </section>
        <section anchor="m-url-discovery-and-canonical-links">
          <name>M-URL Discovery and Canonical Links</name>
          <t>For each resource where an M-URL is provided:</t>
          <ul spacing="normal">
            <li>
              <t>The C-URL response (typically HTML) SHOULD advertise the M-URL as an alternate JSON representation:  </t>
              <t>
Either via HTML:  </t>
              <ul spacing="normal">
                <li>
                  <t><tt>&lt;link rel="alternate" type="application/json" href="https://example.com/post/llm.json"&gt;</tt></t>
                </li>
              </ul>
              <t>
Or HTTP:  </t>
              <ul spacing="normal">
                <li>
                  <t><tt>Link: &lt;https://example.com/post/llm.json&gt;; rel="alternate"; type="application/json"</tt></t>
                </li>
              </ul>
            </li>
            <li>
              <t>The M-URL response for that resource MUST include a corresponding canonical link (<xref target="RFC6596"/>):  </t>
              <ul spacing="normal">
                <li>
                  <t><tt>Link: &lt;https://example.com/post/&gt;; rel="canonical"</tt></t>
                </li>
              </ul>
            </li>
          </ul>
          <t><strong>Note on M-URL paths:</strong>
The choice of M-URL path (e.g., <tt>/post/llm.json</tt>, <tt>/post/llm/</tt>, <tt>/post.json</tt>, etc.) is not specified by this document. Publishers MAY choose any stable URL scheme that suits their architecture. Clients MUST discover M-URLs via advertised links (as shown above) and MUST NOT assume a fixed path pattern.</t>
          <t>Examples of valid M-URL patterns:
- <tt>https://example.com/post/llm.json</tt> (used in this document)
- <tt>https://example.com/post/llm/</tt> (directory-style)
- <tt>https://example.com/post.json</tt> (extension-based)</t>
          <t>This bidirectional linkage allows clients to:</t>
          <ul spacing="normal">
            <li>
              <t>verify that an M-URL is an alternate for the expected C-URL;</t>
            </li>
            <li>
              <t>detect misconfigurations when links are inconsistent; and</t>
            </li>
            <li>
              <t>ensure the <tt>canonical_url</tt> field in the M-URL JSON matches (or is consistent with) the URL advertised via <tt>rel="canonical"</tt> for the corresponding C-URL.</t>
            </li>
          </ul>
        </section>
        <section anchor="template-invariance">
          <name>Template-Invariance</name>
          <t>TCT's template-invariance property:</t>
          <ul spacing="normal">
            <li>
              <t>Changes to HTML templates, CSS, or JavaScript at the C-URL SHOULD NOT require changes to the M-URL JSON, so long as the underlying resource content has not changed.</t>
            </li>
          </ul>
          <t>This is achieved by:</t>
          <ul spacing="normal">
            <li>
              <t>treating M-URLs as distinct, canonical JSON representations of content; and</t>
            </li>
            <li>
              <t>computing strong ETags over the M-URL JSON only.</t>
            </li>
          </ul>
          <t>Template-invariance is NOT achieved by relaxing strong ETag semantics; for any given M-URL, identical strong ETags MUST imply byte-identical JSON bodies.</t>
        </section>
      </section>
      <section anchor="m-url-representation">
        <name>M-URL Representation</name>
        <t>An M-URL is an HTTP resource that serves a JSON representation of a content resource suitable for machine consumption.</t>
        <t>This specification defines the observable JSON representation at M-URLs; it does not constrain how servers derive these representations from their internal data models, templates, or storage.</t>
        <section anchor="content-type-and-encoding">
          <name>Content-Type and Encoding</name>
          <t>M-URL responses:</t>
          <ul spacing="normal">
            <li>
              <t>MUST use:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>Content-Type: application/json; charset=utf-8</tt></t>
                </li>
              </ul>
            </li>
            <li>
              <t>MUST be valid JSON as per <xref target="RFC8259"/>.</t>
            </li>
            <li>
              <t>MUST use UTF-8 without BOM.</t>
            </li>
          </ul>
        </section>
        <section anchor="required-json-fields">
          <name>Required JSON Fields</name>
          <t>The minimal M-URL JSON object for a resource MUST contain:</t>
          <ul spacing="normal">
            <li>
              <t><tt>canonical_url</tt> (string, REQUIRED)
              </t>
              <ul spacing="normal">
                <li>
                  <t>The canonical human-facing URL (C-URL).</t>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>title</tt> (string, REQUIRED)
              </t>
              <ul spacing="normal">
                <li>
                  <t>A human-readable title for the resource.</t>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>content</tt> (string, REQUIRED)
              </t>
              <ul spacing="normal">
                <li>
                  <t>Core textual content:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>plain text (no raw HTML markup);</t>
                    </li>
                    <li>
                      <t>SHOULD exclude purely template/boilerplate text.</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>hash</tt> (string, REQUIRED)
              </t>
              <ul spacing="normal">
                <li>
                  <t>A validator string of the form:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t><tt>sha256-</tt> followed by 64 lowercase hex characters,</t>
                    </li>
                    <li>
                      <t>computed as specified in Section 6.2.</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>The <tt>hash</tt> field of an M-URL representation MUST equal the strong <tt>ETag</tt> value for that representation, excluding the HTTP quoting.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>Additionally:</t>
          <ul spacing="normal">
            <li>
              <t><tt>profile</tt> (string, RECOMMENDED)
              </t>
              <ul spacing="normal">
                <li>
                  <t>TCT profile identifier, e.g., <tt>tct-1</tt>.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>Example (non-normative):</t>
          <t><tt>json
{
  "profile": "tct-1",
  "canonical_url": "https://example.com/post/",
  "title": "Article Title",
  "content": "Core article content...",
  "hash": "sha256-2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7"
}
</tt></t>
        </section>
        <section anchor="representation-stability">
          <name>Representation Stability</name>
          <t>For an M-URL implementing this specification:</t>
          <ul spacing="normal">
            <li>
              <t>For a given resource state, the JSON body MUST be deterministic.</t>
            </li>
            <li>
              <t>Any change to the JSON body bytes (including required or optional fields) MUST result in a different strong ETag (Section 6.2).</t>
            </li>
            <li>
              <t>Servers MUST NOT include per-request randomness (e.g., varying timestamps) in the TCT JSON representation.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="deterministic-json-and-strong-etags">
        <name>Deterministic JSON and Strong ETags</name>
        <section anchor="deterministic-json-serialization">
          <name>Deterministic JSON Serialization</name>
          <t>M-URL responses MUST use deterministic JSON serialization sufficient to support strong ETag semantics:</t>
          <t>Implementations SHOULD use the JSON Canonicalization Scheme (JCS) defined in <xref target="RFC8785"/>. Implementations that do not use RFC8785 MUST define and implement a canonicalization algorithm that:</t>
          <ul spacing="normal">
            <li>
              <t>produces a single, unique octet sequence for each abstract JSON value;</t>
            </li>
            <li>
              <t>applies stable ordering of object members at all levels (for example, lexicographic by code point);</t>
            </li>
            <li>
              <t>uses deterministic formatting of numbers; and</t>
            </li>
            <li>
              <t>does not introduce insignificant whitespace beyond what is necessary to delimit JSON tokens.</t>
            </li>
          </ul>
          <t>The same canonicalization algorithm MUST be used both when computing the ETag and when generating the response body.</t>
        </section>
        <section anchor="strong-etag-generation-single-method">
          <name>Strong ETag Generation (Single Method)</name>
          <t>TCT defines one mandatory method for computing ETags for M-URLs.</t>
          <t>For an M-URL representation:</t>
          <ol spacing="normal" type="1"><li>
              <t>Construct the full JSON object representing the resource, including all fields except <tt>hash</tt>.</t>
            </li>
            <li>
              <t>Canonicalize this JSON object to a UTF-8 byte sequence as per Section 6.1.</t>
            </li>
            <li>
              <t>Compute the SHA-256 digest of these bytes.</t>
            </li>
            <li>
              <t>Let $F$ be the 64-character lowercase hex encoding of this digest.</t>
            </li>
            <li>
              <t>Set:  </t>
              <ul spacing="normal">
                <li>
                  <t>HTTP <tt>ETag</tt> header:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t><tt>"sha256-</tt>$F<tt>"</tt></t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>JSON <tt>hash</tt> field:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t><tt>sha256-</tt>$F$</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t>Canonicalize the final JSON object (now including <tt>hash</tt>) using the same algorithm defined in Section 6.1, and send that canonical form as the response body.</t>
            </li>
          </ol>
          <t>Implementations MUST NOT compute the ETag over one serialization of the JSON object and send a different, non-canonical serialization on the wire.</t>
          <t>Requirements:</t>
          <ul spacing="normal">
            <li>
              <t>ETags for M-URLs:  </t>
              <ul spacing="normal">
                <li>
                  <t>MUST be strong (no <tt>W/</tt> prefix).</t>
                </li>
                <li>
                  <t>MUST be quoted-strings as in <xref target="RFC9110"/>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Two successful M-URL responses with the same strong ETag MUST have identical response body bytes.</t>
            </li>
            <li>
              <t>Any change in the response body bytes MUST cause the strong ETag to change.</t>
            </li>
          </ul>
        </section>
        <section anchor="relationship-to-template-invariance">
          <name>Relationship to Template-Invariance</name>
          <t>Strong ETags in TCT are validators for the M-URL JSON representation only.</t>
          <t>Template-invariance is achieved structurally:</t>
          <ul spacing="normal">
            <li>
              <t>M-URLs do not include HTML templates or layout.</t>
            </li>
            <li>
              <t>Changes to C-URL HTML that do not affect the M-URL JSON do not affect the strong ETag.</t>
            </li>
            <li>
              <t>For TCT-conformant M-URLs, strong ETags MUST be representation-based and MUST NOT vary per request in the absence of a change to the underlying JSON representation.</t>
            </li>
          </ul>
        </section>
        <section anchor="canonical-text-normalization-optional-for-producers">
          <name>Canonical Text Normalization (Optional for Producers)</name>
          <t>TCT does not require clients to normalize text or recompute hashes.</t>
          <t>Use of this normalization algorithm is OPTIONAL and is not required for TCT conformance by either servers or clients. It defines an additional 'TCT text normalization' profile for implementations that choose to adopt it.</t>
          <t>However, producers or validators that derive text fields (such as <tt>content</tt>) from upstream formats MAY implement the normalization algorithm defined here to ensure stable input before JSON canonicalization.</t>
          <t>If an implementation claims conformance to this normalization, it:</t>
          <ul spacing="normal">
            <li>
              <t>MUST follow the algorithm in this section; and</t>
            </li>
            <li>
              <t>MUST pass the test vectors in Appendix A.</t>
            </li>
          </ul>
          <t>Algorithm (summary):</t>
          <t>Given input string S:</t>
          <ol spacing="normal" type="1"><li>
              <t>(Optional) HTML entity decoding:
              </t>
              <ul spacing="normal">
                <li>
                  <t>If starting from HTML source, deterministically decode character references.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Unicode normalization:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Apply NFKC as defined in Unicode Standard Annex #15 (UAX15).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Case folding:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Apply Unicode case folding as defined in Unicode-CaseFolding.</t>
                </li>
                <li>
                  <t>Locale-dependent mappings MUST NOT be used.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Control characters:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Remove all Cc characters except:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>U+0009 (TAB), U+000A (LF), U+000D (CR).</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t>Whitespace collapsing:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Define set W:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>U+0020, U+0009, U+000A, U+000D.</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>Optionally treat U+00A0 as whitespace, if done consistently.</t>
                </li>
                <li>
                  <t>Replace each maximal run of W (and optional NBSP) with a single U+0020 SPACE.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Trim:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Remove leading and trailing SPACE (U+0020).</t>
                </li>
              </ul>
            </li>
          </ol>
          <t>The result is the normalized string N(S).</t>
          <t>Details, examples, and conformance language are in Appendix A.</t>
        </section>
      </section>
      <section anchor="m-sitemap-format-and-semantics">
        <name>M-Sitemap Format and Semantics</name>
        <section anchor="m-sitemap-json-structure">
          <name>M-Sitemap JSON Structure</name>
          <t>The M-Sitemap is a JSON object that lists TCT-enabled resources.</t>
          <t>Fields:</t>
          <ul spacing="normal">
            <li>
              <t><tt>version</tt> (integer, REQUIRED)
              </t>
              <ul spacing="normal">
                <li>
                  <t>M-Sitemap format version. Initial value: 1.</t>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>profile</tt> (string, RECOMMENDED)
              </t>
              <ul spacing="normal">
                <li>
                  <t>Profile identifier, e.g., <tt>tct-1</tt>.</t>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>items</tt> (array of objects, REQUIRED)
              </t>
              <ul spacing="normal">
                <li>
                  <t>Each item:      </t>
                  <ul spacing="normal">
                    <li>
                      <t><tt>cUrl</tt> (string, REQUIRED)
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Canonical URL.</t>
                        </li>
                      </ul>
                    </li>
                    <li>
                      <t><tt>mUrl</tt> (string, REQUIRED)
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>M-URL of the JSON representation.</t>
                        </li>
                      </ul>
                    </li>
                    <li>
                      <t><tt>etag</tt> (string, REQUIRED)
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Strong validator identifier, equal to the M-URL ETag value without quotes.</t>
                        </li>
                        <li>
                          <t>MUST be <tt>sha256-</tt> followed by the 64-hex digest used in Section 6.2.</t>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
          <t>Example:</t>
          <t><tt>json
{
  "version": 1,
  "profile": "tct-1",
  "items": [
    {
      "cUrl": "https://example.com/post/",
      "mUrl": "https://example.com/post/llm.json",
      "etag": "sha256-2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7"
    }
  ]
}
</tt></t>
        </section>
        <section anchor="http-response-for-m-sitemap">
          <name>HTTP Response for M-Sitemap</name>
          <t>The M-Sitemap:</t>
          <ul spacing="normal">
            <li>
              <t>MUST use:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>Content-Type: application/json; charset=utf-8</tt></t>
                </li>
              </ul>
            </li>
            <li>
              <t>SHOULD use cache directives that encourage timely revalidation, for example:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>Cache-Control: max-age=0, must-revalidate</tt>, or</t>
                </li>
                <li>
                  <t>a short max-age value appropriate to the site's update frequency.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>SHOULD include:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>Vary: Accept-Encoding</tt></t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="parity-semantics">
          <name>Parity Semantics</name>
          <t>Design intent:</t>
          <ul spacing="normal">
            <li>
              <t>M-Sitemap <tt>etag</tt> values SHOULD match the current strong ETag values of their corresponding M-URLs.</t>
            </li>
          </ul>
          <t>Requirements:</t>
          <ul spacing="normal">
            <li>
              <t>Publishers MUST compute <tt>etag</tt> values using the same algorithm as Section 6.2.</t>
            </li>
            <li>
              <t>Publishers SHOULD keep M-Sitemap <tt>etag</tt> values in sync with M-URL ETags.</t>
            </li>
            <li>
              <t>Transient mismatches (due to non-atomic updates, caches, or propagation delays) MAY occur.</t>
            </li>
          </ul>
          <t>Client behavior:</t>
          <ul spacing="normal">
            <li>
              <t>Clients SHOULD treat M-Sitemap <tt>etag</tt> as a hint for change detection.</t>
            </li>
            <li>
              <t>Clients MAY compare <tt>etag</tt> with the M-URL ETag.</t>
            </li>
            <li>
              <t>Clients MUST NOT treat mismatches alone as protocol errors.</t>
            </li>
            <li>
              <t>In case of mismatch, clients SHOULD fall back to standard conditional requests on the M-URL and treat the M-Sitemap etag as an advisory signal only.</t>
            </li>
          </ul>
          <t>Strong ETag values for M-URLs and etag values in the M-Sitemap are scoped to the origin that serves them. Clients MUST NOT assume that identical validator values observed on different origins imply identical content.</t>
        </section>
      </section>
      <section anchor="client-behavior">
        <name>Client Behavior</name>
        <section anchor="zero-fetch-optimization">
          <name>Zero-Fetch Optimization</name>
          <t>A typical TCT-aware client:</t>
          <ol spacing="normal" type="1"><li>
              <t>Fetches <tt>/</tt> and discovers the M-Sitemap via <tt>Link</tt>.</t>
            </li>
            <li>
              <t>Fetches the M-Sitemap.</t>
            </li>
            <li>
              <t>For each item <tt>(cUrl, mUrl, etag)</tt>:  </t>
              <ul spacing="normal">
                <li>
                  <t>If it has a cached ETag for <tt>mUrl</tt>:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>If cached ETag equals sitemap <tt>etag</tt>:
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>MAY skip fetching <tt>mUrl</tt> (zero-fetch).</t>
                        </li>
                      </ul>
                    </li>
                    <li>
                      <t>Otherwise:
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>SHOULD issue conditional GET:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t><tt>GET mUrl</tt></t>
                            </li>
                            <li>
                              <t><tt>If-None-Match: "sha256-..."</tt>.</t>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>If no cached ETag:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>SHOULD fetch <tt>mUrl</tt> with GET.</t>
                    </li>
                    <li>
                      <t>MAY include <tt>If-None-Match</tt> using sitemap <tt>etag</tt> as hint.</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ol>
          <t>This enables large reductions in redundant fetches.</t>
          <t>This optimization is OPTIONAL. Clients that prefer strict HTTP cache validation MAY always perform a conditional GET with If-None-Match on M-URLs instead of relying solely on M-Sitemap etag hints.</t>
        </section>
        <section anchor="conditional-requests-to-m-urls">
          <name>Conditional Requests to M-URLs</name>
          <t>M-URLs implementing TCT:</t>
          <ul spacing="normal">
            <li>
              <t>MUST support <tt>If-None-Match</tt> as defined in <xref target="RFC9110"/>.</t>
            </li>
          </ul>
          <t>Specifically:</t>
          <ul spacing="normal">
            <li>
              <t>If <tt>If-None-Match</tt> matches the current strong ETag:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Respond with <tt>304 Not Modified</tt>, no body.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Otherwise:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Respond with <tt>200 OK</tt> and the JSON representation.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>If both <tt>If-None-Match</tt> and <tt>If-Modified-Since</tt> are present:</t>
          <ul spacing="normal">
            <li>
              <t><tt>If-None-Match</tt> MUST take precedence (per <xref target="RFC9110"/>).</t>
            </li>
          </ul>
          <t>Servers SHOULD send appropriate <tt>Cache-Control</tt> directives to encourage revalidation and safe caching.</t>
        </section>
        <section anchor="use-of-head-optional">
          <name>Use of HEAD (Optional)</name>
          <t>Clients MAY use <tt>HEAD</tt> on M-URLs as an optimization:</t>
          <ul spacing="normal">
            <li>
              <t>If a HEAD response includes an <tt>ETag</tt> equal to the cached one, a GET may be skipped.</t>
            </li>
            <li>
              <t>If HEAD is unreliable, clients SHOULD fall back to conditional GET.</t>
            </li>
          </ul>
          <t>Conditional GET with <tt>If-None-Match</tt> SHOULD be considered the primary mechanism.</t>
        </section>
        <section anchor="client-validation-optional">
          <name>Client Validation (Optional)</name>
          <t>For protocol correctness:</t>
          <ul spacing="normal">
            <li>
              <t>Clients are not required to implement the text normalization algorithm or to recompute validators.</t>
            </li>
            <li>
              <t>Clients MAY treat ETags and sitemap <tt>etag</tt> values as opaque.</t>
            </li>
          </ul>
          <t>Clients MAY perform additional checks as desired, such as:</t>
          <ul spacing="normal">
            <li>
              <t>verifying that an M-URL includes <tt>rel="canonical"</tt> pointing at the expected C-URL;</t>
            </li>
            <li>
              <t>checking M-Sitemap <tt>etag</tt> vs M-URL ETag parity;</t>
            </li>
            <li>
              <t>recomputing hashes using the published algorithms.</t>
            </li>
          </ul>
          <t>Such additional checks are implementation choices and are out of scope for TCT compliance.</t>
        </section>
      </section>
      <section anchor="operational-considerations-informative">
        <name>Operational Considerations (Informative)</name>
        <section anchor="deployment-with-cdns-and-proxies">
          <name>Deployment with CDNs and Proxies</name>
          <ul spacing="normal">
            <li>
              <t>M-URLs and M-Sitemaps are ordinary cacheable JSON resources.</t>
            </li>
            <li>
              <t>CDNs and reverse proxies:
              </t>
              <ul spacing="normal">
                <li>
                  <t>MAY cache them;</t>
                </li>
                <li>
                  <t>SHOULD honor strong ETags and 304 responses.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Since ETags are based on uncompressed canonical JSON:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Downstream compression does not invalidate validators.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="large-sites-and-sharding">
          <name>Large Sites and Sharding</name>
          <t>For very large sites:</t>
          <ul spacing="normal">
            <li>
              <t>Operators MAY create multiple M-Sitemaps (e.g., per section or date).</t>
            </li>
            <li>
              <t>A primary M-Sitemap can list additional ones by convention.</t>
            </li>
            <li>
              <t>This document does not standardize a JSON sitemap index; such work may be done separately.</t>
            </li>
          </ul>
          <t>A future revision of this specification or a separate document MAY define a JSON M-Sitemap index format, analogous to the XML Sitemap Index, to provide interoperable conventions for sharding and large-site discovery.</t>
        </section>
        <section anchor="error-handling">
          <name>Error Handling</name>
          <t>Recommended behavior:</t>
          <ul spacing="normal">
            <li>
              <t>If the M-Sitemap is unavailable or invalid:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Treat TCT as temporarily unavailable.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>If an M-URL returns 4xx/5xx:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Follow normal HTTP semantics for retries/backoff.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>If the M-URL is persistently broken:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Clients MAY ignore it and rely on the C-URL HTML, if appropriate.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="backwards-compatibility">
          <name>Backwards Compatibility</name>
          <ul spacing="normal">
            <li>
              <t>TCT is purely additive:
              </t>
              <ul spacing="normal">
                <li>
                  <t>It does not alter C-URL semantics.</t>
                </li>
                <li>
                  <t>Non-participating clients see no change.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Operators can deploy TCT incrementally on selected resources.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="security-considerations">
        <name>Security Considerations</name>
        <t>TCT builds directly on HTTP; most security considerations are inherited from <xref target="RFC9110"/> and <xref target="RFC9111"/>.</t>
        <t>Key points:</t>
        <ul spacing="normal">
          <li>
            <t>HTTPS:
            </t>
            <ul spacing="normal">
              <li>
                <t>Publishers SHOULD serve M-URLs and M-Sitemaps over HTTPS.</t>
              </li>
              <li>
                <t>Clients SHOULD validate TLS as usual.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Integrity:
            </t>
            <ul spacing="normal">
              <li>
                <t>Strong ETags identify specific representations but do not authenticate servers.</t>
              </li>
              <li>
                <t>For stronger guarantees, publishers MAY use:
                </t>
                <ul spacing="normal">
                  <li>
                    <t><tt>Content-Digest</tt> headers (<xref target="RFC9530"/>); and/or</t>
                  </li>
                  <li>
                    <t>HTTP Message Signatures (<xref target="RFC9421"/>).</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>Access control:
            </t>
            <ul spacing="normal">
              <li>
                <t>If a C-URL requires authentication, its corresponding M-URL SHOULD be similarly protected.</t>
              </li>
              <li>
                <t>M-Sitemaps MUST NOT leak sensitive M-URLs or validators.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Cache poisoning:
            </t>
            <ul spacing="normal">
              <li>
                <t>Correct use of ETag and Cache-Control mitigates stale or mixed content.</t>
              </li>
              <li>
                <t>Clients MUST treat JSON as untrusted data and validate/sanitize as appropriate.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Privacy:
            </t>
            <ul spacing="normal">
              <li>
                <t>As with any sitemap, listing URLs in an M-Sitemap can reveal site structure.</t>
              </li>
              <li>
                <t>Publishers concerned about this SHOULD limit entries or restrict access.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Origin trust:
            </t>
            <ul spacing="normal">
              <li>
                <t>Clients that consume M-Sitemaps and M-URLs inherently trust the origin in the same way they trust HTML pages or XML Sitemaps from that origin. A compromised or misconfigured origin can advertise incorrect mappings; this is not a new class of attack introduced by TCT.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Intermediaries:
            </t>
            <ul spacing="normal">
              <li>
                <t>Deployments SHOULD ensure that CDNs and other intermediaries do not strip or rewrite strong ETags on M-URLs or M-Sitemaps, as doing so can interfere with correct validation and zero-fetch behavior.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="iana-considerations">
        <name>IANA Considerations</name>
        <t>This document has no IANA actions.</t>
        <t>A future revision or separate document MAY define and register:</t>
        <ul spacing="normal">
          <li>
            <t>a well-known URI for TCT M-Sitemaps; and/or</t>
          </li>
          <li>
            <t>a dedicated media type or <tt>profile</tt> parameter for TCT JSON.</t>
          </li>
        </ul>
        <t>Such registrations are intentionally out of scope for this version.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <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" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <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="RFC8259" target="https://www.rfc-editor.org/info/rfc8259" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8785" target="https://www.rfc-editor.org/info/rfc8785" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml">
          <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="RFC9110" target="https://www.rfc-editor.org/info/rfc9110" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml">
          <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="RFC9111" target="https://www.rfc-editor.org/info/rfc9111" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9111.xml">
          <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC6596" target="https://www.rfc-editor.org/info/rfc6596" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6596.xml">
          <front>
            <title>The Canonical Link Relation</title>
            <author fullname="M. Ohye" initials="M." surname="Ohye"/>
            <author fullname="J. Kupke" initials="J." surname="Kupke"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>RFC 5988 specifies a way to define relationships between links on the web. This document describes a new type of such a relationship, "canonical", to designate an Internationalized Resource Identifier (IRI) as preferred over resources with duplicative content. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6596"/>
          <seriesInfo name="DOI" value="10.17487/RFC6596"/>
        </reference>
        <reference anchor="RFC9421" target="https://www.rfc-editor.org/info/rfc9421" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9421.xml">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>
        <reference anchor="RFC9530" target="https://www.rfc-editor.org/info/rfc9530" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9530.xml">
          <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 692?>

<section anchor="appendix-a-normalization-test-vectors">
      <name>Appendix A. Normalization Test Vectors</name>
      <t>This appendix provides test vectors for implementations that claim conformance to the normalization algorithm (Section 6.4).</t>
      <t><strong>Conformance Requirement:</strong> Implementations claiming normalization support MUST produce the outputs specified below for all test inputs.</t>
      <t><strong>Test Format:</strong> Each test shows:
- Input string
- Output after each normalization step
- Final SHA-256 hash (computed over UTF-8 bytes of final output)</t>
      <section anchor="a1-basic-ascii">
        <name>A.1. Basic ASCII</name>
        <t><strong>Test 1: Simple ASCII text</strong>
- Input: <tt>"Hello World"</tt>
- After step 1 (HTML decode): <tt>"Hello World"</tt>
- After step 2 (NFKC): <tt>"Hello World"</tt>
- After step 3 (casefold): <tt>"hello world"</tt>
- After step 4 (control chars): <tt>"hello world"</tt>
- After step 5 (whitespace): <tt>"hello world"</tt>
- After step 6 (trim): <tt>"hello world"</tt>
- SHA-256: <tt>b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9</tt></t>
        <t><strong>Test 2: Leading/trailing whitespace</strong>
- Input: <tt>"  Hello World  "</tt>
- After step 1: <tt>"  Hello World  "</tt>
- After step 2: <tt>"  Hello World  "</tt>
- After step 3: <tt>"  hello world  "</tt>
- After step 4: <tt>"  hello world  "</tt>
- After step 5: <tt>" hello world "</tt>
- After step 6: <tt>"hello world"</tt>
- SHA-256: <tt>b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9</tt></t>
        <t><strong>Test 3: Multiple spaces</strong>
- Input: <tt>"Hello    World"</tt>
- After step 1: <tt>"Hello    World"</tt>
- After step 2: <tt>"Hello    World"</tt>
- After step 3: <tt>"hello    world"</tt>
- After step 4: <tt>"hello    world"</tt>
- After step 5: <tt>"hello world"</tt>
- After step 6: <tt>"hello world"</tt>
- SHA-256: <tt>b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9</tt></t>
        <section anchor="a2-html-entities">
          <name>A.2. HTML Entities</name>
          <t><strong>Test 4: Common HTML entities</strong>
- Input: <tt>"Hello &amp;amp; goodbye"</tt>
- After step 1: <tt>"Hello &amp; goodbye"</tt>
- After step 2: <tt>"Hello &amp; goodbye"</tt>
- After step 3: <tt>"hello &amp; goodbye"</tt>
- After step 4: <tt>"hello &amp; goodbye"</tt>
- After step 5: <tt>"hello &amp; goodbye"</tt>
- After step 6: <tt>"hello &amp; goodbye"</tt>
- SHA-256: <tt>da73536eaa9c427f3189de5b6371d798193e98f3c31df8bef710bba835e8c621</tt></t>
          <t><strong>Test 5: Angle brackets</strong>
- Input: <tt>"&amp;lt;tag&amp;gt;"</tt>
- After step 1: <tt>"&lt;tag&gt;"</tt>
- After step 2: <tt>"&lt;tag&gt;"</tt>
- After step 3: <tt>"&lt;tag&gt;"</tt>
- After step 4: <tt>"&lt;tag&gt;"</tt>
- After step 5: <tt>"&lt;tag&gt;"</tt>
- After step 6: <tt>"&lt;tag&gt;"</tt>
- SHA-256: <tt>c81ef880af0fcfef49e1b45c3690a1666c47d9e064b7eaead2af09bb78884dcd</tt></t>
          <t><strong>Test 6: Quotes</strong>
- Input: <tt>"&amp;quot;quoted&amp;quot;"</tt>
- After step 1: <tt>"\"quoted\""</tt>
- After step 2: <tt>"\"quoted\""</tt>
- After step 3: <tt>"\"quoted\""</tt>
- After step 4: <tt>"\"quoted\""</tt>
- After step 5: <tt>"\"quoted\""</tt>
- After step 6: <tt>"\"quoted\""</tt>
- SHA-256: <tt>272fca25899893eeb27b89583d5c81b8a4ac5af4d1e37e3909d879947303c1c5</tt></t>
        </section>
        <section anchor="a3-unicode-normalization-nfkc">
          <name>A.3. Unicode Normalization (NFKC)</name>
          <t><strong>Test 7: Composed vs decomposed é</strong>
- Input (composed): <tt>"Café"</tt> (U+00E9)
- After step 1: <tt>"Café"</tt>
- After step 2 (NFKC): <tt>"Café"</tt> (normalized to composed form)
- After step 3: <tt>"café"</tt>
- After step 4: <tt>"café"</tt>
- After step 5: <tt>"café"</tt>
- After step 6: <tt>"café"</tt>
- SHA-256: <tt>850f7dc43910ff890f8879c0ed26fe697c93a067ad93a7d50f466a7028a9bf4e</tt></t>
          <t><strong>Test 7b: Decomposed form (should produce same result)</strong>
- Input (decomposed): <tt>"Cafe\u0301"</tt> (e + combining acute)
- After step 2 (NFKC): <tt>"Café"</tt> (normalized to composed)
- Final result: Same as Test 7
- SHA-256: <tt>850f7dc43910ff890f8879c0ed26fe697c93a067ad93a7d50f466a7028a9bf4e</tt> (same as Test 7)</t>
          <t><strong>Test 8: Full-width characters</strong>
- Input: <tt>"ＨＥＬＬＯ"</tt> (full-width Latin)
- After step 1: <tt>"ＨＥＬＬＯ"</tt>
- After step 2 (NFKC): <tt>"HELLO"</tt> (converted to half-width)
- After step 3: <tt>"hello"</tt>
- After step 4: <tt>"hello"</tt>
- After step 5: <tt>"hello"</tt>
- After step 6: <tt>"hello"</tt>
- SHA-256: <tt>2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824</tt></t>
        </section>
        <section anchor="a4-case-folding-edge-cases">
          <name>A.4. Case Folding Edge Cases</name>
          <t><strong>Test 9: German sharp S</strong>
- Input: <tt>"Straße"</tt>
- After step 1: <tt>"Straße"</tt>
- After step 2: <tt>"Straße"</tt>
- After step 3 (casefold): <tt>"strasse"</tt> (ß -&gt; ss)
- After step 4: <tt>"strasse"</tt>
- After step 5: <tt>"strasse"</tt>
- After step 6: <tt>"strasse"</tt>
- SHA-256: <tt>16d96952087774fee069b7585d3991b24d90c181c09b2129b4908c35baa7f0c0</tt></t>
          <t><strong>Test 10: Turkish İ (dotted capital I)</strong>
- Input: <tt>"İstanbul"</tt>
- After step 1: <tt>"İstanbul"</tt>
- After step 2: <tt>"İstanbul"</tt>
- After step 3 (casefold): <tt>"i\u0307stanbul"</tt> (locale-independent)
- After step 4: <tt>"i\u0307stanbul"</tt>
- After step 5: <tt>"i\u0307stanbul"</tt>
- After step 6: <tt>"i\u0307stanbul"</tt>
- SHA-256: <tt>4a4df120f7d1f3c286f58651abfcec2aade892ace635f96f02b946c96e6e1f86</tt></t>
        </section>
        <section anchor="a5-control-characters">
          <name>A.5. Control Characters</name>
          <t><strong>Test 11: Embedded tab</strong>
- Input: <tt>"Hello\tWorld"</tt>
- After step 1: <tt>"Hello\tWorld"</tt>
- After step 2: <tt>"Hello\tWorld"</tt>
- After step 3: <tt>"hello\tworld"</tt>
- After step 4: <tt>"hello\tworld"</tt> (tab preserved)
- After step 5: <tt>"hello world"</tt> (tab -&gt; space)
- After step 6: <tt>"hello world"</tt>
- SHA-256: <tt>b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9</tt></t>
          <t><strong>Test 12: Embedded newline</strong>
- Input: <tt>"Hello\nWorld"</tt>
- After step 1: <tt>"Hello\nWorld"</tt>
- After step 2: <tt>"Hello\nWorld"</tt>
- After step 3: <tt>"hello\nworld"</tt>
- After step 4: <tt>"hello\nworld"</tt> (newline preserved)
- After step 5: <tt>"hello world"</tt> (newline -&gt; space)
- After step 6: <tt>"hello world"</tt>
- SHA-256: <tt>b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9</tt></t>
          <t><strong>Test 13: Control character (BEL)</strong>
- Input: <tt>"Hello\u0007World"</tt> (U+0007 = BEL)
- After step 1: <tt>"Hello\u0007World"</tt>
- After step 2: <tt>"Hello\u0007World"</tt>
- After step 3: <tt>"hello\u0007world"</tt>
- After step 4: <tt>"helloworld"</tt> (control char removed)
- After step 5: <tt>"helloworld"</tt>
- After step 6: <tt>"helloworld"</tt>
- SHA-256: <tt>936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af</tt></t>
        </section>
        <section anchor="a6-whitespace-edge-cases">
          <name>A.6. Whitespace Edge Cases</name>
          <t><strong>Test 14: Non-breaking space (NBSP)</strong>
- Input: <tt>"Hello\u00A0World"</tt> (U+00A0 = NBSP)
- After step 1: <tt>"Hello\u00A0World"</tt>
- After step 2: <tt>"Hello\u00A0World"</tt>
- After step 3: <tt>"hello\u00A0world"</tt>
- After step 4: <tt>"hello\u00A0world"</tt>
- After step 5: <tt>"hello world"</tt> (NBSP -&gt; space, if treating NBSP as whitespace)
- After step 6: <tt>"hello world"</tt>
- SHA-256: <tt>b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9</tt></t>
          <t><strong>Note:</strong> Step 5 behavior for NBSP is implementation-defined per Section 6.4 ("Optionally treat U+00A0 as whitespace, if done consistently"). This test assumes NBSP is treated as whitespace.</t>
          <t><strong>Test 15: Mixed whitespace</strong>
- Input: <tt>"Hello \t\n World"</tt>
- After step 1: <tt>"Hello \t\n World"</tt>
- After step 2: <tt>"Hello \t\n World"</tt>
- After step 3: <tt>"hello \t\n world"</tt>
- After step 4: <tt>"hello \t\n world"</tt>
- After step 5: <tt>"hello world"</tt>
- After step 6: <tt>"hello world"</tt>
- SHA-256: <tt>b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9</tt></t>
        </section>
        <section anchor="a7-empty-and-edge-cases">
          <name>A.7. Empty and Edge Cases</name>
          <t><strong>Test 16: Empty string</strong>
- Input: <tt>""</tt>
- After all steps: <tt>""</tt>
- SHA-256: <tt>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</tt></t>
          <t><strong>Test 17: Whitespace only</strong>
- Input: <tt>"   "</tt>
- After step 1: <tt>"   "</tt>
- After step 2: <tt>"   "</tt>
- After step 3: <tt>"   "</tt>
- After step 4: <tt>"   "</tt>
- After step 5: <tt>" "</tt>
- After step 6: <tt>""</tt> (trimmed)
- SHA-256: <tt>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</tt></t>
          <t><strong>Test 18: Single character</strong>
- Input: <tt>"A"</tt>
- After step 1: <tt>"A"</tt>
- After step 2: <tt>"A"</tt>
- After step 3: <tt>"a"</tt>
- After step 4: <tt>"a"</tt>
- After step 5: <tt>"a"</tt>
- After step 6: <tt>"a"</tt>
- SHA-256: <tt>ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb</tt></t>
        </section>
        <section anchor="a8-complex-real-world-examples">
          <name>A.8. Complex Real-World Examples</name>
          <t><strong>Test 19: Article excerpt</strong>
- Input: <tt>"The café's "special" offer: 50% off!"</tt>
- Expected output after normalization: <tt>the café's "special" offer: 50% off!</tt>
- SHA-256: <tt>25cdbe2315674d38ddaf1df6fe7ccd494ce89efebe8a3b5285742e57e7367545</tt></t>
          <t><strong>Test 20: Unicode mixed with entities</strong>
- Input: <tt>"Cliché &amp;amp; résumé"</tt>
- Expected output after normalization: <tt>cliché &amp; résumé</tt>
- SHA-256: <tt>7d56f360edd22f7be0bc0f126d45481df83e8afc68b83788cf37544c4ee6ce21</tt></t>
        </section>
        <section anchor="a9-implementation-notes">
          <name>A.9. Implementation Notes</name>
          <t><strong>Computing SHA-256:</strong>
- Encode the final normalized string as UTF-8 bytes
- Compute SHA-256 over those bytes
- Express result as 64 lowercase hex characters</t>
          <t><strong>Test Vector Validation:</strong>
- Implementations claiming normalization support MUST produce the SHA-256 hashes specified above
- The seven "hello world" variants (Tests 1, 2, 3, 11, 12, 14, 15) all normalize to identical output (<tt>"hello world"</tt>), demonstrating whitespace normalization equivalence
- Tests 7 and 7b demonstrate NFKC combining character handling (both produce identical hashes)</t>
        </section>
      </section>
      <section anchor="appendix-b-example-flows-informative">
        <name>Appendix B. Example Flows (Informative)</name>
        <t>This appendix illustrates TCT discovery and fetch patterns.</t>
        <section anchor="b1-initial-discovery-and-first-fetch">
          <name>B.1. Initial Discovery and First Fetch</name>
          <t><strong>Scenario:</strong> Client visits origin for the first time.</t>
          <t>```
1. Client -&gt; Server: GET / HTTP/1.1
                     Host: example.com</t>
          <ol spacing="normal" type="1"><li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  Link: &lt;/llm-pages.json&gt;; rel="index"; type="application/json"
                  Content-Type: text/html  </t>
              <artwork><![CDATA[
              [HTML body...]
]]></artwork>
            </li>
            <li>
              <t>Client -&gt; Server: GET /llm-pages.json HTTP/1.1
                  Host: example.com</t>
            </li>
            <li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  Content-Type: application/json; charset=utf-8
                  Cache-Control: max-age=0, must-revalidate  </t>
              <artwork><![CDATA[
              {
                "version": 1,
                "profile": "tct-1",
                "items": [
                  {
                    "cUrl": "https://example.com/article/",
                    "mUrl": "https://example.com/article/llm.json",
                    "etag": "sha256-abc123..."
                  }
                ]
              }
]]></artwork>
            </li>
            <li>
              <t>Client -&gt; Server: GET /article/llm.json HTTP/1.1
                  Host: example.com</t>
            </li>
            <li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  Content-Type: application/json; charset=utf-8
                  ETag: "sha256-abc123..."
                  Link: <eref target="https://example.com/article/">https://example.com/article/</eref>; rel="canonical"  </t>
              <artwork><![CDATA[
              {
                "profile": "tct-1",
                "canonical_url": "https://example.com/article/",
                "title": "Article Title",
                "content": "Article content...",
                "hash": "sha256-abc123..."
              } ```
]]></artwork>
            </li>
          </ol>
          <t><strong>Client actions after step 6:</strong>
- Stores M-URL content locally
- Caches ETag <tt>"sha256-abc123..."</tt> for future revalidation</t>
        </section>
        <section anchor="b2-zero-fetch-optimization-content-unchanged">
          <name>B.2. Zero-Fetch Optimization (Content Unchanged)</name>
          <t><strong>Scenario:</strong> Client returns after some time; content hasn't changed.</t>
          <t>```
1. Client -&gt; Server: GET /llm-pages.json HTTP/1.1
                     Host: example.com</t>
          <ol spacing="normal" type="1"><li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  Content-Type: application/json; charset=utf-8  </t>
              <artwork><![CDATA[
              {
                "version": 1,
                "items": [
                  {
                    "cUrl": "https://example.com/article/",
                    "mUrl": "https://example.com/article/llm.json",
                    "etag": "sha256-abc123..."
                  }
                ]
              }
]]></artwork>
            </li>
            <li>
              <t>Client local comparison:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Sitemap etag: "sha256-abc123..."</t>
                </li>
                <li>
                  <t>Cached ETag:  "sha256-abc123..."</t>
                </li>
                <li>
                  <t>Match! -&gt; Skip fetch entirely (zero-fetch)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Client uses locally cached content for /article/
```</t>
            </li>
          </ol>
          <t><strong>Result:</strong> Zero bytes transferred for M-URL; content known to be current.</t>
        </section>
        <section anchor="b3-conditional-request-content-unchanged">
          <name>B.3. Conditional Request (Content Unchanged)</name>
          <t><strong>Scenario:</strong> Sitemap etag differs from cache, but actual content hasn't changed.</t>
          <t>```
1. Client -&gt; Server: GET /llm-pages.json HTTP/1.1</t>
          <ol spacing="normal" type="1"><li>
              <t>Server -&gt; Client: [Sitemap shows etag: "sha256-def456..."]</t>
            </li>
            <li>
              <t>Client comparison:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Sitemap etag: "sha256-def456..." (different!)</t>
                </li>
                <li>
                  <t>Cached ETag:  "sha256-abc123..."</t>
                </li>
                <li>
                  <t>Mismatch -&gt; Must fetch, but use conditional request</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Client -&gt; Server: GET /article/llm.json HTTP/1.1
                  If-None-Match: "sha256-abc123..."</t>
            </li>
            <li>
              <t>Server -&gt; Client: HTTP/1.1 304 Not Modified
                  ETag: "sha256-abc123..."</t>
            </li>
            <li>
              <t>Client actions:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Content unchanged; uses cached copy</t>
                </li>
                <li>
                  <t>Notes: sitemap was stale/inconsistent; no protocol violation
```</t>
                </li>
              </ul>
            </li>
          </ol>
          <t><strong>Result:</strong> Small 304 response instead of full payload.</t>
        </section>
        <section anchor="b4-content-changed">
          <name>B.4. Content Changed</name>
          <t><strong>Scenario:</strong> Content has been updated.</t>
          <t>```
1. Client -&gt; Server: GET /llm-pages.json HTTP/1.1</t>
          <ol spacing="normal" type="1"><li>
              <t>Server -&gt; Client: [Sitemap shows etag: "sha256-xyz789..."]</t>
            </li>
            <li>
              <t>Client comparison:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Sitemap etag: "sha256-xyz789..." (different)</t>
                </li>
                <li>
                  <t>Cached ETag:  "sha256-abc123..."</t>
                </li>
                <li>
                  <t>Mismatch -&gt; Fetch with If-None-Match</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Client -&gt; Server: GET /article/llm.json HTTP/1.1
                  If-None-Match: "sha256-abc123..."</t>
            </li>
            <li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  Content-Type: application/json; charset=utf-8
                  ETag: "sha256-xyz789..."  </t>
              <artwork><![CDATA[
              {
                "canonical_url": "https://example.com/article/",
                "title": "Updated Title",
                "content": "Updated content...",
                "hash": "sha256-xyz789..."
              }
]]></artwork>
            </li>
            <li>
              <t>Client actions:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Replaces cached content</t>
                </li>
                <li>
                  <t>Updates cached ETag to "sha256-xyz789..."
```</t>
                </li>
              </ul>
            </li>
          </ol>
          <t><strong>Result:</strong> Full new representation received.</t>
        </section>
        <section anchor="b5-parity-mismatch-handling">
          <name>B.5. Parity Mismatch Handling</name>
          <t><strong>Scenario:</strong> Sitemap etag doesn't match actual M-URL ETag (transient inconsistency).</t>
          <t>```
1. Client -&gt; Server: GET /llm-pages.json HTTP/1.1</t>
          <ol spacing="normal" type="1"><li>
              <t>Server -&gt; Client: [Sitemap shows etag: "sha256-old999..."]</t>
            </li>
            <li>
              <t>Client -&gt; Server: GET /article/llm.json HTTP/1.1
                  If-None-Match: "sha256-old999..."</t>
            </li>
            <li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  ETag: "sha256-new000..."  &lt;- Different from sitemap!  </t>
              <artwork><![CDATA[
              [Full M-URL JSON...]
]]></artwork>
            </li>
            <li>
              <t>Client actions:  </t>
              <ul spacing="normal">
                <li>
                  <t>Accepts M-URL response (valid per HTTP)</t>
                </li>
                <li>
                  <t>Uses ETag from M-URL response ("sha256-new000...") for future revalidation</t>
                </li>
                <li>
                  <t>Notes: sitemap inconsistency tolerated; no error
```</t>
                </li>
              </ul>
            </li>
          </ol>
          <t><strong>Result:</strong> Client falls back to standard HTTP caching; no protocol failure.</t>
        </section>
        <section anchor="b6-using-head-for-efficient-freshness-check">
          <name>B.6. Using HEAD for Efficient Freshness Check</name>
          <t><strong>Scenario:</strong> Client wants to check freshness before fetching.</t>
          <t>```
1. Client -&gt; Server: HEAD /article/llm.json HTTP/1.1
                     If-None-Match: "sha256-abc123..."</t>
          <ol spacing="normal" type="1"><li>
              <t>Server -&gt; Client: HTTP/1.1 304 Not Modified
                  ETag: "sha256-abc123..."</t>
            </li>
            <li>
              <t>Client actions:  </t>
              <ul spacing="normal">
                <li>
                  <t>Content unchanged; uses cached copy</t>
                </li>
                <li>
                  <t>Avoided transferring full body</t>
                </li>
              </ul>
            </li>
          </ol>
          <t>OR (if content changed):</t>
          <ol spacing="normal" type="1"><li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  ETag: "sha256-xyz789..."
                  Content-Length: 4567</t>
            </li>
            <li>
              <t>Client -&gt; Server: GET /article/llm.json HTTP/1.1
                  If-None-Match: "sha256-abc123..."</t>
            </li>
            <li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  ETag: "sha256-xyz789..."  </t>
              <artwork><![CDATA[
              [Full M-URL JSON...] ```
]]></artwork>
            </li>
          </ol>
          <t><strong>Note:</strong> HEAD support is optional; conditional GET is the primary mechanism.</t>
        </section>
        <section anchor="b7-discovery-via-c-url">
          <name>B.7. Discovery via C-URL</name>
          <t><strong>Scenario:</strong> Client discovers M-URL directly from HTML page.</t>
          <t>```
1. Client -&gt; Server: GET /article/ HTTP/1.1</t>
          <ol spacing="normal" type="1"><li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  Link: &lt;/article/llm.json&gt;; rel="alternate"; type="application/json"
                  Content-Type: text/html  </t>
              <artwork><![CDATA[
              <!DOCTYPE html>
              <html>
              <head>
                <link rel="alternate" type="application/json"
                      href="https://example.com/article/llm.json">
              </head>
              ...
]]></artwork>
            </li>
            <li>
              <t>Client -&gt; Server: GET /article/llm.json HTTP/1.1</t>
            </li>
            <li>
              <t>Server -&gt; Client: HTTP/1.1 200 OK
                  ETag: "sha256-abc123..."
                  Link: <eref target="https://example.com/article/">https://example.com/article/</eref>; rel="canonical"  </t>
              <artwork><![CDATA[
              [M-URL JSON...]
]]></artwork>
            </li>
            <li>
              <t>Client verifies:  </t>
              <ul spacing="normal">
                <li>
                  <t>Canonical link points back to /article/ -&gt; Consistent OK
```</t>
                </li>
              </ul>
            </li>
          </ol>
          <t><strong>Result:</strong> M-URL discovered and validated without sitemap.</t>
        </section>
      </section>
      <section anchor="appendix-c-implementation-notes-informative">
        <name>Appendix C. Implementation Notes (Informative)</name>
        <t>This appendix provides guidance for implementers.</t>
        <section anchor="c1-reference-implementations">
          <name>C.1. Reference Implementations</name>
          <t><strong>Note:</strong> The following implementations are provided as informative examples. Repository URLs, package names, and deployment details may change over time and are not normative.</t>
          <t>The following implementations demonstrate TCT in production environments:</t>
          <t><strong>WordPress Plugin (PHP):</strong>
- Repository: https://github.com/antunjurkovic-collab/tct-wp-plugin
- Version: 1.0.0
- Deployment: 3 production sites (970 URLs total)
- Features:
  - Automatic M-URL generation for posts/pages
  - M-Sitemap generation and caching
  - Strong ETag computation using canonical JSON
  - Normalization algorithm implementation
- Dependencies: WordPress 6.0+, PHP 7.4+
- JSON serialization: <tt>json_encode()</tt> with <tt>JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE</tt></t>
          <t><strong>Python Validator:</strong>
- PyPI package: <tt>collab-tunnel</tt> (https://pypi.org/project/collab-tunnel/1.0.2/)
- Version: 1.0.2
- Purpose: Protocol compliance testing
- Features:
  - Validates M-URL and M-Sitemap structure
  - Tests ETag parity
  - Verifies canonical link bidirectionality
  - Runs normalization test vectors
- Usage:
  <tt>python
  from collab_tunnel import validate_origin
  results = validate_origin("https://example.com")
            </tt></t>
          <t><strong>Cloudflare Worker (Edge Proxy):</strong>
- Repository: https://github.com/antunjurkovic-collab/tct-worker
- Purpose: Demonstrates CDN integration
- Features:
  - Proxies M-URLs with proper ETag handling
  - Implements 304 Not Modified caching
  - Handles conditional requests correctly
- Deployment: Cloudflare Workers platform</t>
        </section>
        <section anchor="c2-deterministic-json-libraries">
          <name>C.2. Deterministic JSON Libraries</name>
          <t>For RFC 8785 (JSON Canonicalization Scheme) compliance:</t>
          <t><strong>Python:</strong>
            <tt>python
import canonicaljson
canonical_bytes = canonicaljson.encode_canonical_json(obj)
</tt>
- Library: <tt>pip install canonicaljson</tt>
- Docs: https://github.com/matrix-org/python-canonicaljson</t>
          <t><strong>JavaScript:</strong>
            <tt>javascript
const canonicalize = require('canonicalize');
const canonical_string = canonicalize(obj);
</tt>
- Library: <tt>npm install canonicalize</tt>
- Docs: https://github.com/cyberphone/json-canonicalization</t>
          <t><strong>Go:</strong>
            <tt>go
import "github.com/cyberphone/json-canonicalization/go/json"
canonical, _ := json.CanonicalizeJSON(input)
</tt></t>
          <t><strong>Alternative (Stable Ordering):</strong>
If not using RFC 8785, ensure:
- Object keys sorted lexicographically (at ALL nesting levels)
- No insignificant whitespace
- Consistent number formatting
- UTF-8 encoding without BOM</t>
          <t><strong>Important:</strong> Simple key-sorting helpers (e.g., <tt>Object.keys(obj).sort()</tt> in JavaScript) are <strong>insufficient</strong> for nested objects. For production implementations claiming TCT conformance, use RFC 8785 libraries or implement the full specification. The code examples in C.3 are <strong>illustrative only</strong> and may not handle all edge cases correctly.</t>
        </section>
        <section anchor="c3-sha-256-computation">
          <name>C.3. SHA-256 Computation</name>
          <t>The examples in this section are illustrative only. By themselves they do not guarantee the deterministic JSON requirements of Section 6.1 unless combined with a complete canonicalization algorithm such as RFC8785.</t>
          <t><strong>Note:</strong> The examples below are simplified for illustration. For production use, ensure proper RFC 8785 canonicalization (see C.2) before hashing.</t>
          <t><strong>Python:</strong>
```python
import hashlib
import json</t>
        </section>
      </section>
    </section>
    <section anchor="canonical-json">
      <name>Canonical JSON</name>
      <t>canonical_json = json.dumps(obj, ensure_ascii=False, sort_keys=True, separators=(',', ':'))
canonical_bytes = canonical_json.encode('utf-8')</t>
    </section>
    <section anchor="hash">
      <name>Hash</name>
      <t>sha256_hash = hashlib.sha256(canonical_bytes).hexdigest()
etag_value = f'"sha256-{sha256_hash}"'
```</t>
      <t><strong>JavaScript:</strong>
```javascript
const crypto = require('crypto');</t>
      <t>// Canonical JSON
// NOTE: This is illustrative only; for full conformance, use RFC 8785 or a complete canonicalization implementation.
const canonical_json = JSON.stringify(obj, Object.keys(obj).sort());
const canonical_bytes = Buffer.from(canonical_json, 'utf-8');</t>
      <t>// Hash
const sha256_hash = crypto.createHash('sha256').update(canonical_bytes).digest('hex');
const etag_value = <tt>"sha256-${sha256_hash}"</tt>;
```</t>
      <t><strong>PHP:</strong>
```php
// Canonical JSON
$canonical_json = json_encode($obj, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);</t>
      <t>// Hash
$sha256_hash = hash('sha256', $canonical_json);
$etag_value = '"sha256-' . $sha256_hash . '"';
```</t>
      <section anchor="c4-unicode-normalization">
        <name>C.4. Unicode Normalization</name>
        <t><strong>Python:</strong>
```python
import unicodedata</t>
      </section>
    </section>
    <section anchor="nfkc-normalization">
      <name>NFKC normalization</name>
      <t>normalized = unicodedata.normalize('NFKC', text)</t>
    </section>
    <section anchor="case-folding">
      <name>Case folding</name>
      <t>casefolded = normalized.casefold()
```</t>
      <t><strong>JavaScript:</strong>
```javascript
// NFKC normalization
const normalized = text.normalize('NFKC');</t>
      <t>// Case folding (approximation: toLowerCase with locale-independent behavior)
const casefolded = normalized.toLocaleLowerCase('en-US');
```</t>
      <t><strong>PHP:</strong>
```php
// NFKC normalization (requires intl extension)
$normalized = Normalizer::normalize($text, Normalizer::NFKC);</t>
      <t>// Case folding (mb_strtolower with UTF-8)
$casefolded = mb_strtolower($normalized, 'UTF-8');
```</t>
      <section anchor="c5-http-response-headers">
        <name>C.5. HTTP Response Headers</name>
        <t><strong>Typical headers for M-URLs:</strong></t>
        <t>A conformant M-URL response will include at least: <tt>Content-Type: application/json</tt>, <tt>ETag</tt> (strong, quoted), and <tt>Link: rel="canonical"</tt> (see Sections 5-6). Example:</t>
        <t><tt>
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
ETag: "sha256-abc123..."
Link: &lt;https://example.com/article/&gt;; rel="canonical"
Cache-Control: public, max-age=3600, must-revalidate
Vary: Accept-Encoding
</tt></t>
        <t><strong>Typical headers for M-Sitemap:</strong>
          <tt>
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Cache-Control: max-age=0, must-revalidate
# Example; a short max-age consistent with Section 7.2 MAY also be used
Vary: Accept-Encoding
</tt></t>
        <t><strong>Conditional request handling:</strong>
```
# Request with If-None-Match
GET /article/llm.json HTTP/1.1
If-None-Match: "sha256-abc123..."</t>
      </section>
    </section>
    <section anchor="response-if-unchanged">
      <name>Response if unchanged</name>
      <t>HTTP/1.1 304 Not Modified
ETag: "sha256-abc123..."
Cache-Control: public, max-age=3600, must-revalidate</t>
    </section>
    <section anchor="response-if-changed">
      <name>Response if changed</name>
      <t>HTTP/1.1 200 OK
ETag: "sha256-xyz789..."
Content-Type: application/json; charset=utf-8
[full body...]
```</t>
      <section anchor="c6-production-deployment-data">
        <name>C.6. Production Deployment Data</name>
        <t><strong>Note:</strong> The following deployment data represents a snapshot as of November 2025. Specific sites, URLs, and metrics are provided as informative examples and may change.</t>
        <t>As of November 2025, TCT is deployed on:</t>
        <t><strong>bestdemotivationalposters.com:</strong>
- 500 URLs
- 100K+ pageviews/month
- WordPress 6.4 + TCT plugin v1.0.0
- Average HTML size: 103 KB (gzipped)
- Average M-URL size: 17.7 KB (gzipped)
- Bandwidth reduction: 83%</t>
        <t><strong>wellbeing-support.com:</strong>
- 400 URLs
- Health/wellness content
- Average zero-fetch rate: 85%</t>
        <t><strong>omacedonii.com:</strong>
- 70 URLs
- Multilingual (Polish)
- Demonstrates Unicode normalization in production</t>
        <t><strong>Aggregate Results:</strong>
- Total URLs: 970
- Bandwidth reduction: 83% median
- Zero-fetch rate: 70-90% (depends on update frequency)
- Combined bandwidth elimination: ~98% in steady-state</t>
        <section anchor="c7-common-implementation-pitfalls">
          <name>C.7. Common Implementation Pitfalls</name>
          <t><strong>Pitfall 1: Non-deterministic JSON</strong>
- Problem: Random key ordering, floating-point precision issues, timestamps
- Solution: Use RFC 8785 or strict ordering; exclude per-request randomness</t>
          <t><strong>Pitfall 2: Weak ETags</strong>
- Problem: Using <tt>W/"sha256-..."</tt> instead of <tt>"sha256-..."</tt>
- Solution: Always use strong ETags for M-URLs (no W/ prefix)</t>
          <t><strong>Pitfall 3: Sitemap Staleness</strong>
- Problem: Sitemap regenerated asynchronously; race conditions cause mismatches
- Solution: Accept transient inconsistency; clients fall back to conditional GET</t>
          <t><strong>Pitfall 4: Incorrect Canonical Links</strong>
- Problem: rel="canonical" points to wrong URL or is missing
- Solution: Validate bidirectional linkage (C-URL &lt;-&gt; M-URL)</t>
          <t><strong>Pitfall 5: HTML in Content Field</strong>
- Problem: Including raw HTML tags in <tt>content</tt> field
- Solution: Extract plain text or use deterministic markup (e.g., Markdown)</t>
          <t><strong>Pitfall 6: Missing Vary: Accept-Encoding</strong>
- Problem: CDN caches gzipped and uncompressed versions with same key
- Solution: Always include <tt>Vary: Accept-Encoding</tt> header</t>
          <t><strong>Pitfall 7: Locale-Dependent Case Folding</strong>
- Problem: Turkish İ -&gt; i vs. I -&gt; ı (locale-specific)
- Solution: Use Unicode default case folding (locale-independent)</t>
        </section>
        <section anchor="c8-testing-and-validation">
          <name>C.8. Testing and Validation</name>
          <t><strong>Automated Testing:</strong>
1. Protocol compliance: Use <tt>collab-tunnel-validator</tt> PyPI package
2. Normalization: Run Appendix A test vectors
3. ETag parity: Compare sitemap etag vs. actual M-URL ETag
4. Conditional requests: Test If-None-Match with matching/non-matching ETags</t>
          <t><strong>Manual Testing:</strong>
1. Check discovery: <tt>curl -I https://example.com/</tt> (look for Link header)
2. Fetch sitemap: <tt>curl https://example.com/llm-pages.json</tt>
3. Validate M-URL: <tt>curl -H "Accept: application/json" https://example.com/article/llm.json</tt>
4. Test 304: <tt>curl -H 'If-None-Match: "sha256-..."' https://example.com/article/llm.json</tt></t>
          <t><strong>Integration Testing:</strong>
- Deploy to staging environment
- Monitor 304 response rates (should be &gt;70% after initial crawl)
- Check CDN cache hit rates
- Verify canonical link bidirectionality</t>
        </section>
        <section anchor="c9-performance-considerations">
          <name>C.9. Performance Considerations</name>
          <t><strong>Server-Side:</strong>
- Cache normalized content and ETags (don't recompute on every request)
- Generate M-Sitemap asynchronously during content updates
- Use HTTP/2 for parallel M-URL fetches
- Implement early ETag validation (before full response generation)</t>
          <t><strong>Client-Side:</strong>
- Use zero-fetch optimization when possible (sitemap comparison)
- Batch M-Sitemap fetches (don't fetch per-URL)
- Implement exponential backoff for 429/503 responses
- Cache M-URLs and ETags persistently</t>
          <t><strong>CDN/Proxy:</strong>
- Configure strong ETag preservation
- Enable compression (gzip/brotli) with Vary: Accept-Encoding
- Cache 304 responses appropriately
- Don't strip ETag headers</t>
        </section>
        <section anchor="c10-security-best-practices">
          <name>C.10. Security Best Practices</name>
          <t><strong>HTTPS:</strong>
- It is RECOMMENDED to serve M-URLs and M-Sitemap over HTTPS (see Section 10)
- Validate TLS certificates properly
- Use HSTS where appropriate</t>
          <t><strong>Access Control:</strong>
- If C-URL requires authentication, protect M-URL similarly
- Don't leak sensitive URLs in public sitemaps
- Implement rate limiting to prevent abuse</t>
          <t><strong>Content Validation:</strong>
- Treat M-URL JSON as untrusted input
- Validate/sanitize before use
- Don't execute code from content field</t>
          <t><strong>ETag Integrity:</strong>
- Use Content-Digest (RFC 9530) for additional integrity
- Consider HTTP Message Signatures (RFC 9421) for authentication
- Monitor for ETag collision attempts (though SHA-256 makes this infeasible)</t>
        </section>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to reviewers and implementers who provided feedback on earlier revisions, including those who highlighted:</t>
      <ul spacing="normal">
        <li>
          <t>the need for a single strong ETag method;</t>
        </li>
        <li>
          <t>the importance of deterministic JSON;</t>
        </li>
        <li>
          <t>the separation of protocol from policy; and</t>
        </li>
        <li>
          <t>simplification of discovery and parity semantics.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19WXMjx5nguyL0H9KU7AbaAIj7YLsdy2azpbb7mibbmhl7
QihUJchyF6rgqgIPe7V/ZZ42Yh2xETv7Pm+e/zN/Yb8rjyoAJFuS7XlY+RAI
ZGVlfvndV7bb7c8/K+My0Ufq4PxSq5MsSYJFlgdlnKXqfJOmOlHv8qzMwixR
jfOT8+bB558Fi0Wur/CRk3P4M8rCNFjBFFEeLMv27zf5x+wq/vj7dkiztUua
pt3tff5ZGJT6Istvj5S+WX/+WbzOj1SZb4qy3+3Ouv3PPys2i1VcFPD28nYN
U748PX/x+Wfwyk15meVHn3+m2opfdpzCvOpX5mXwi1J6FcTJkQrwJ1lG+N8u
8MtOmK1oSJht0hIX8CbLy0v1Ogh1lKVxgC9Js3wFO7/S+B71/sVJv9ebmc/T
3mRoP/dH7vvJdGQ+z3q9rve5d4SzxumyPu94NBvbccN+z34eDbr0TLvdVsGi
KPMgLPHv88u4UADnzUqnpSrWOoyXsS5Ued+ZtQAY6uvz83ftRVDoSK00wDFS
sCKll8s4jGG+lrrSOcwXLBKtIp3AQvNblS3VtV4AvNIS31lmCs4gg33ALMEF
fFV0FKLM2mDHpoAFLeIoznWISwkS9eH9KxXFRZjhjC1V6tU6gQnacXoV5DEc
k51+GacXOl/ncVrCJ3Udw9nA9jP4fHoeXBQtVcTweLBuL+O8KGXFIe0Z9xjh
6DikCaNYXp/rP2w0DMYlxOskTjVuI9fRJtRqAQ9dxxG85/oyTnAfutD5Fb49
DFJAiZA3UHTMgaziKEo0/vWFeglIlME8+Cb85rgGG9UodJCHl0qnF/BeWP/x
SxXmwXWic/gDfwIww6cVvKnMcnxtmWUJ/nZxkeuLAL4smipOw1wHBfyc3OLe
CsCAyrkEgA6wUt1RL3QJk8I8CI11kONDarlJEjj/16/gmws4Hzz4VYDjtEy3
JrQB9MqWMCG80OIFY6J6Bw/CK+OLy1IRFq7ilHa6uLUnCstOg6v4wpxHVMih
hHm8LhGEbSQ177UABgUkjlCGnaUaIQdnSDhY6ptyQ+dHh5KWjNqAkYjvYZZr
s32ZOL2V7UWZSjNAgssA0EktCQHSMgHcW2wAVvBgrttLBBS8L04JPHS+vwF8
zDYFYVmhggSAHt0ik8oKrX519vaNOn73EmCUqyUstaD5BD5M3fDueLnUuQrC
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
6yj/HyIcflyAzwAA

-->

</rfc>
