<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.31 (Ruby 4.0.1) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-krickert-pipestream-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="PipeStream">PipeStream: A Recursive Entity Streaming Protocol for Distributed Processing over QUIC</title>

    <author fullname="Kristian Rickert">
      <organization>PipeStream AI</organization>
      <address>
        <email>kristian.rickert@pipestream.ai</email>
      </address>
    </author>

    <date year="2026" month="March" day="01"/>

    <area>Applications and Real-Time</area>
    <workgroup>Individual Submission</workgroup>
    <keyword>quic</keyword> <keyword>streaming</keyword> <keyword>recursive</keyword> <keyword>distributed-processing</keyword> <keyword>scatter-gather</keyword> <keyword>consistency</keyword>

    <abstract>


<?line 84?>

<t>This document specifies PipeStream, a recursive entity streaming protocol for hierarchical task decomposition and distributed processing over QUIC transport. PipeStream enables the decomposition ("dehydration") of complex inputs into constituent entities, their transmission across distributed processing nodes, and subsequent rehydration (reassembly) at destination endpoints. The protocol's primary motivating use case is distributed document processing, but its recursive scatter-gather design is applicable to any domain requiring hierarchical decomposition of work units.</t>

<t>The protocol employs a dual-stream architecture consisting of a data stream for entity payload transmission and a control stream for tracking entity completion status and maintaining consistency. PipeStream defines four hierarchical data layers for entity representation: BlobBag for raw binary data, SemanticLayer for annotated content with metadata, ParsedData for structured extracted information, and CustomEntity for application-specific extensions.</t>

<t>PipeStream is organized into three protocol layers: Layer 0 (Core) provides basic streaming with dehydrate/rehydrate semantics; Layer 1 (Recursive) adds hierarchical scoping and digest propagation; Layer 2 (Resilience) adds yield/resume, claim checks, and completion policies. All implementations support Layer 0; Layers 1 and 2 are optional and negotiated at connection time.</t>

<t>To ensure consistency across distributed processing pipelines, PipeStream implements checkpoint blocking, whereby processing nodes synchronize at defined points before proceeding. This mechanism guarantees that all constituent parts of a dehydrated entity are successfully processed before rehydration operations commence.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-krickert-pipestream/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Individual Group mailing list (<eref target="mailto:kristian.rickert@pipestream.ai"/>).
      </t>
    </note>


  </front>

  <middle>


<?line 94?>

<section anchor="introduction"><name>Introduction</name>

<section anchor="problem-statement"><name>Problem Statement</name>

<t>Distributed processing pipelines face significant challenges when handling large, complex work units that require multiple stages of transformation, analysis, and enrichment. Traditional batch processing approaches require entire inputs to be loaded into memory, processed sequentially, and transmitted in their entirety between processing stages. This methodology introduces substantial latency, excessive memory consumption, and poor utilization of distributed computing resources.</t>

<t>Modern distributed processing workflows increasingly demand the ability to:</t>

<t><list style="symbols">
  <t>Process inputs incrementally as data becomes available</t>
  <t>Distribute processing load across heterogeneous worker nodes</t>
  <t>Maintain consistency guarantees across parallel processing paths</t>
  <t>Handle inputs of arbitrary size without memory constraints</t>
  <t>Support recursive decomposition where constituent parts may themselves be decomposed</t>
  <t>Scale from single work units to collections of millions of inputs</t>
</list></t>

<t>Current approaches based on batch processing and store-and-forward architectures are inefficient for large inputs and fail to exploit the inherent parallelism available in distributed processing environments. Furthermore, existing streaming protocols do not provide the consistency semantics required for hierarchical processing where the integrity of the rehydrated output depends on the successful processing of all constituent parts.</t>

</section>
<section anchor="applicability"><name>Applicability</name>

<t>Although PipeStream was originally motivated by distributed document processing pipelines, its recursive scatter-gather design is domain-neutral. The protocol is applicable to any workload that can be modeled as hierarchical decomposition of a root entity into sub-entities, parallel processing of those sub-entities, and deterministic reassembly of results. Example domains include:</t>

<t><list style="symbols">
  <t>Distributed document processing and content enrichment pipelines</t>
  <t>Hierarchical video transcoding and rendering (scene decomposition)</t>
  <t>Federated computation pipelines such as distributed machine learning</t>
  <t>Genomic sequencing and assembly workflows</t>
</list></t>

<t>Throughout this document, "document" is used as the canonical example of a root entity, but all protocol mechanisms apply equally to any decomposable work unit.</t>

</section>
<section anchor="pipestream-overview"><name>PipeStream Overview</name>

<t>PipeStream addresses these challenges by defining a streaming protocol that enables incremental processing with strong consistency guarantees. The protocol is built upon QUIC <xref target="RFC9000"/> transport, leveraging its native support for multiplexed streams, low-latency connection establishment, and reliable delivery semantics.</t>

<t>The fundamental innovation of PipeStream is its treatment of inputs as recursive compositions of entities. A root entity MAY be decomposed into multiple sub-entities, each of which MAY itself be further decomposed, creating a tree structure of processing tasks. This recursive decomposition enables fine-grained parallelism while the protocol's control stream mechanism ensures that all branches of the decomposition tree are tracked and synchronized.</t>

<t>PipeStream employs a dual-stream design:</t>

<t><list style="numbers" type="1">
  <t><strong>Data Stream</strong>: Carries entity payloads through the processing pipeline. Entities flow through this stream with minimal buffering, enabling low-latency incremental processing.</t>
  <t><strong>Control Stream</strong>: Carries control information tracking the status of entity decomposition and rehydration. The control stream ensures that all parts of a dehydrated entity are accounted for before rehydration proceeds.</t>
</list></t>

</section>
<section anchor="design-philosophy"><name>Design Philosophy</name>

<t>PipeStream implements a recursive scatter-gather pattern <xref target="scatter-gather"/> over QUIC streams. An input entity is "dehydrated" (scattered) at the source into constituent sub-entities, these sub-entities are transmitted and processed in parallel across distributed pipeline stages, and finally the results are "rehydrated" (gathered) at the destination to reconstitute the complete processed output. The checkpoint blocking mechanism (Section 9.3) provides barrier synchronization semantics analogous to the barrier pattern in parallel computing.</t>

<t>This approach provides several advantages:</t>

<t><list style="symbols">
  <t><strong>Incremental Processing</strong>: Processing nodes MAY begin work on early entities before the complete input has been transmitted.</t>
  <t><strong>Parallelism</strong>: Independent entities MAY be processed concurrently across multiple worker nodes.</t>
  <t><strong>Memory Efficiency</strong>: No single node is required to hold the complete input in memory.</t>
  <t><strong>Fault Isolation</strong>: Failures in processing individual entities can be detected, reported, and potentially retried without affecting other entities.</t>
  <t><strong>Consistency</strong>: The checkpoint blocking mechanism ensures that rehydration operations proceed only when all constituent parts have been successfully processed.</t>
</list></t>

</section>
<section anchor="protocol-layering"><name>Protocol Layering</name>

<t>PipeStream is organized into three protocol layers to accommodate varying deployment requirements:</t>

<texttable>
      <ttcol align='left'>Protocol Layer</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>Layer 0</c>
      <c>Core</c>
      <c>Basic streaming, dehydrate/rehydrate, checkpoint</c>
      <c>Layer 1</c>
      <c>Recursive</c>
      <c>Hierarchical scopes, digest propagation, barriers</c>
      <c>Layer 2</c>
      <c>Resilience</c>
      <c>Yield/resume, claim checks, completion policies</c>
</texttable>

<t>Implementations MUST support Layer 0. Support for Layers 1 and 2 is OPTIONAL and negotiated during connection establishment.</t>

</section>
<section anchor="scope"><name>Scope</name>

<t>This document specifies the PipeStream protocol including message formats, state machines, error handling, and the interaction between data and control streams. The document defines the four standard data layers but does not mandate specific processing semantics, which are left to application-layer specifications.</t>

</section>
</section>
<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, as shown here.</t>

<section anchor="protocol-entities"><name>Protocol Entities</name>

<dl>
  <dt><strong>Entity</strong></dt>
  <dd>
    <t>The fundamental unit of data flowing through a PipeStream pipeline. An Entity represents either a complete document or a constituent part of a decomposed document. Each Entity possesses a unique identifier within its processing scope and carries payload data in one of the four defined Layer formats. Entities are immutable once created; transformations produce new Entities rather than modifying existing ones.</t>
  </dd>
  <dt><strong>Document</strong></dt>
  <dd>
    <t>A logical unit of content or work submitted to a PipeStream pipeline for processing. A Document enters the pipeline as a single root Entity and MAY be decomposed into multiple Entities during processing. The Document is considered complete when its root Entity (or the rehydrated result of its decomposition) exits the pipeline.</t>
  </dd>
  <dt><strong>Scope</strong></dt>
  <dd>
    <t>A hierarchical namespace for Entity IDs. Each scope maintains its own Entity ID space, cursor, and Assembly Manifest. Scopes enable collections to contain documents, documents to contain parts, and parts to contain jobs, each with independent ID management. (Protocol Layer 1)</t>
  </dd>
</dl>

</section>
<section anchor="dehydration-and-rehydration"><name>Dehydration and Rehydration</name>

<dl>
  <dt><strong>Scatter-Gather</strong></dt>
  <dd>
    <t>The distributed processing pattern implemented by PipeStream. A single input is "scattered" (dehydrated) into multiple parts for parallel processing, and the results are "gathered" (rehydrated) back into a single output. PipeStream extends classical scatter-gather with recursive nesting: any scattered part may itself be scattered further.</t>
  </dd>
  <dt><strong>Dehydrate (Scatter)</strong></dt>
  <dd>
    <t>The operation of decomposing a document or Entity into multiple constituent Entities for parallel or distributed processing. When an Entity is dehydrated, the originating node MUST create an Assembly Manifest entry recording the identifiers of all resulting sub-entities. The dehydration operation is recursive; a sub-entity produced by dehydration MAY itself be dehydrated, creating a tree of decomposition. Dehydration transitions data from a solid state (a single stored record) to a fluid state (multiple in-flight entities).</t>
  </dd>
  <dt><strong>Rehydrate (Gather)</strong></dt>
  <dd>
    <t>The operation of reassembling multiple Entities back into a single composite Entity or Document. A rehydrate operation MUST NOT proceed until all constituent Entities listed in the corresponding Assembly Manifest entry have been received and processed (or handled according to the Completion Policy). Rehydration transitions data from a fluid state back to a solid state.</t>
  </dd>
  <dt><strong>Solid State</strong></dt>
  <dd>
    <t>A document or Entity that exists as a complete, stored record -- either at rest in storage or as a single root Entity entering or exiting a pipeline. Contrast with "fluid state".</t>
  </dd>
  <dt><strong>Fluid State</strong></dt>
  <dd>
    <t>A document that has been decomposed into multiple in-flight Entities being processed in parallel across distributed nodes. A document is in the fluid state between dehydration and rehydration. Contrast with "solid state".</t>
  </dd>
</dl>

</section>
<section anchor="consistency-mechanisms"><name>Consistency Mechanisms</name>

<dl>
  <dt><strong>Checkpoint</strong></dt>
  <dd>
    <t>A synchronization point in the processing pipeline where all in-flight Entities MUST reach a consistent state before processing may continue. A checkpoint is considered "satisfied" when all Assembly Manifest entries created before the checkpoint have been resolved.</t>
  </dd>
  <dt><strong>Barrier</strong></dt>
  <dd>
    <t>A synchronization point scoped to a specific subtree. Unlike checkpoints which are global, barriers block only entities dependent on a specific parent's descendants. (Protocol Layer 1)</t>
  </dd>
  <dt><strong>Control Stream</strong></dt>
  <dd>
    <t>The control stream that tracks Entity completion status throughout the processing pipeline. The Control Stream is transmitted on a dedicated QUIC stream parallel to the data streams.</t>
  </dd>
  <dt><strong>Assembly Manifest</strong></dt>
  <dd>
    <t>A data structure within the Control Stream that tracks the relationship between a composite Entity and its constituent sub-entities produced by dehydration.</t>
  </dd>
  <dt><strong>Cursor</strong></dt>
  <dd>
    <t>A pointer to the lowest unresolved Entity ID within a scope. Entity IDs behind the cursor are considered resolved and MAY be recycled. The cursor enables efficient ID space management without global coordination.</t>
  </dd>
</dl>

</section>
<section anchor="resilience-mechanisms-protocol-layer-2"><name>Resilience Mechanisms (Protocol Layer 2)</name>

<dl>
  <dt><strong>Yield</strong></dt>
  <dd>
    <t>A temporary pause in Entity processing, typically due to external dependencies (API calls, rate limiting, human approval). A yielded Entity carries a continuation token enabling resumption without reprocessing.</t>
  </dd>
  <dt><strong>Claim Check</strong></dt>
  <dd>
    <t>A detached reference to a deferred Entity that can be queried or resumed independently, potentially in a different session. Claim checks enable asynchronous processing patterns and retry queues.</t>
  </dd>
  <dt><strong>Completion Policy</strong></dt>
  <dd>
    <t>A configuration specifying how to handle partial failures during dehydration. Policies include STRICT (all must succeed), LENIENT (continue with partial results), BEST_EFFORT (complete with whatever succeeds), and QUORUM (require minimum success ratio).</t>
  </dd>
</dl>

</section>
<section anchor="data-representation"><name>Data Representation</name>

<dl>
  <dt><strong>Data Layer</strong></dt>
  <dd>
    <t>One of four defined representations for Entity payload data:
</t>

    <t><list style="numbers" type="1">
      <t><strong>BlobBag</strong>: Raw binary data with minimal metadata</t>
      <t><strong>SemanticLayer</strong>: Annotated content with structural and semantic metadata</t>
      <t><strong>ParsedData</strong>: Structured information extracted from document content</t>
      <t><strong>CustomEntity</strong>: Application-specific extension Layer</t>
    </list></t>
  </dd>
</dl>

</section>
<section anchor="additional-terms"><name>Additional Terms</name>

<dl>
  <dt><strong>Pipeline</strong></dt>
  <dd>
    <t>A configured sequence of processing stages through which Entities flow.</t>
  </dd>
  <dt><strong>Processor</strong></dt>
  <dd>
    <t>A node in the mesh that performs operations on entities (e.g., transformation, dehydration, or rehydration).</t>
  </dd>
  <dt><strong>Sink</strong></dt>
  <dd>
    <t>A terminal stage in a pipeline where rehydrated documents are persisted or delivered to an external system.</t>
  </dd>
  <dt><strong>Stage</strong></dt>
  <dd>
    <t>A single processing step within a Pipeline.</t>
  </dd>
  <dt><strong>Scope Digest</strong></dt>
  <dd>
    <t>A cryptographic summary (Merkle root) of all Entity statuses within a completed scope, propagated to parent scopes for efficient verification. (Protocol Layer 1)</t>
  </dd>
</dl>

</section>
</section>
<section anchor="protocol-layers"><name>Protocol Layers</name>

<t>PipeStream defines three protocol layers that build upon each other. This layered approach allows simple deployments to use only the core protocol while complex deployments can leverage advanced features.</t>

<section anchor="layer-0-core-protocol"><name>Layer 0: Core Protocol</name>

<t>Layer 0 provides the fundamental streaming capabilities:</t>

<t><list style="symbols">
  <t>Unified Control Frame (UCF) header (1-octet type)</t>
  <t>Status frame (16-octet base bit-packed frame)</t>
  <t>Entity frame (header + payload)</t>
  <t>Status codes: PENDING, PROCESSING, COMPLETE, FAILED, CHECKPOINT</t>
  <t>Assembly Manifest for parent-child tracking</t>
  <t>Cursor-based Entity ID recycling</t>
  <t>Single-level dehydrate/rehydrate</t>
  <t>Checkpoint blocking</t>
</list></t>

<t>All implementations MUST support Layer 0.</t>

</section>
<section anchor="layer-1-recursive-extension"><name>Layer 1: Recursive Extension</name>

<t>Layer 1 adds hierarchical processing capabilities:</t>

<t><list style="symbols">
  <t>Scoped Entity ID namespaces (collection -&gt; document -&gt; part -&gt; job)</t>
  <t>Explicit Depth tracking in status frames</t>
  <t>SCOPE_DIGEST for Merkle-based subtree completion</t>
  <t>BARRIER for subtree-scoped synchronization</t>
  <t>Nested dehydration with depth tracking</t>
</list></t>

<t>Layer 1 is OPTIONAL. Implementations advertise Layer 1 support during capability negotiation.</t>

</section>
<section anchor="layer-2-resilience-extension"><name>Layer 2: Resilience Extension</name>

<t>Layer 2 adds fault tolerance and async processing:</t>

<t><list style="symbols">
  <t>YIELDED status with continuation tokens</t>
  <t>DEFERRED status with claim checks</t>
  <t>RETRYING, SKIPPED, ABANDONED statuses</t>
  <t>Completion policies (STRICT, LENIENT, BEST_EFFORT, QUORUM)</t>
  <t>Claim check extensions and deferred processing tokens</t>
  <t>Stopping point validation</t>
</list></t>

<t>Layer 2 is OPTIONAL and requires Layer 1. Implementations advertise Layer 2 support during capability negotiation.</t>

</section>
<section anchor="capability-negotiation"><name>Capability Negotiation</name>

<t>PipeStream uses a two-tier negotiation model. The ALPN identifier (Section 11.1) identifies the base PipeStream transport mapping, while the <spanx style="verb">capabilities</spanx> structure handles dynamic resource limits and optional layer support that may vary based on endpoint configuration or real-time load.</t>

<t>During CONNECT, endpoints exchange supported capabilities using the <spanx style="verb">capabilities</spanx> structure. This message MUST be encoded using the default CBOR format for both the client's initiation and the server's response (Section 3.5).</t>

<figure><sourcecode type="cddl"><![CDATA[
serialization-format = &(
  cbor: 0,                         ; Default (IETF native)
  protobuf: 1,
)

capabilities = {
  layer0-core: bool,               ; Always true
  layer1-recursive: bool,          ; Scoped IDs, digests
  layer2-resilience: bool,         ; Yield, claim checks
  ? max-scope-depth: uint .le 7,   ; Default: 7 (8 levels, 0-7)
  ? max-entities-per-scope: uint,  ; Default: 4,294,967,294
  ? max-window-size: uint,         ; Default: 2,147,483,648 (2^31)
                                   ; (Max in-flight entities)
  ? serialization-format: serialization-format, ; Default: CBOR
  ? keepalive-timeout-ms: uint,    ; Default: 30000 (30s)
}
]]></sourcecode></figure>

<t>Peers negotiate down to common capabilities. If Layer 2 is requested but Layer 1 is not supported, Layer 2 MUST be disabled.</t>

<section anchor="version-negotiation"><name>Version Negotiation</name>

<t>PipeStream protocol versioning is carried in two places: the ALPN identifier and the Ver field in the STATUS frame (Section 6.2.1). The ALPN identifier <spanx style="verb">pipestream/1</spanx> identifies the major protocol version and the QUIC transport mapping defined in this document. The 4-bit Ver field in STATUS frames carries the value 0x1 for this specification.</t>

<t>A future major version of PipeStream (e.g., <spanx style="verb">pipestream/2</spanx>) would register a new ALPN identifier. QUIC's native ALPN negotiation during the TLS handshake provides version selection: if a client offers both <spanx style="verb">pipestream/2</spanx> and <spanx style="verb">pipestream/1</spanx> and the server supports only <spanx style="verb">pipestream/1</spanx>, the TLS handshake selects <spanx style="verb">pipestream/1</spanx> without additional round trips. This mechanism is consistent with the versioning approach used by HTTP/3 <xref target="RFC9114"/> and DNS over QUIC <xref target="RFC9250"/>.</t>

<t>Minor, backward-compatible extensions (such as new optional capability fields or new status codes within the reserved ranges) do not require a new ALPN identifier. Such extensions are negotiated through the capabilities structure or the IANA registries defined in Section 11.</t>

</section>
<section anchor="serialization-format-negotiation"><name>Serialization Format Negotiation</name>

<t>The serialization_format field determines the encoding used for all variable-length control messages (frame types 0x80-0xFF) and entity headers. Negotiation proceeds as follows:</t>

<t><list style="numbers" type="1">
  <t>Each peer advertises its preferred serialization_format in its Capabilities message.</t>
  <t>If both peers advertise the same format, that format is used.</t>
  <t>If a peer receives a Capabilities message without serialization_format, the sender is assumed to prefer CBOR <xref target="RFC8949"/>.</t>
  <t>If the resulting preferences differ, the peers MUST use CBOR <xref target="RFC8949"/> as the fallback.</t>
</list></t>

<t>The initial Capabilities exchange on a new connection MUST use the default CBOR format for both the client's initiation and the server's response. The negotiated serialization format and resource limits take effect immediately following the successful completion of this initial Capabilities exchange (one request and one response). If a peer cannot decode the initial Capabilities exchange, it MUST close the connection with PIPESTREAM_INTERNAL_ERROR (0x01).</t>

</section>
</section>
</section>
<section anchor="protocol-overview"><name>Protocol Overview</name>

<t>This section provides a high-level overview of the PipeStream protocol architecture, design principles, and operational model.</t>

<section anchor="design-goals"><name>Design Goals</name>

<section anchor="true-streaming-processing"><name>True Streaming Processing</name>

<t>PipeStream MUST enable true streaming processing where entities are transmitted and processed incrementally as they become available. Implementations MUST NOT buffer complete inputs before initiating transmission.</t>

</section>
<section anchor="recursive-decomposition"><name>Recursive Decomposition</name>

<t>The protocol MUST support recursive decomposition of entities, wherein a single input entity MAY produce zero, one, or many output entities.</t>

</section>
<section anchor="checkpoint-consistency"><name>Checkpoint Consistency</name>

<t>PipeStream MUST provide checkpoint blocking semantics to maintain processing consistency across distributed workers.</t>

</section>
<section anchor="control-and-data-plane-separation"><name>Control and Data Plane Separation</name>

<t>The protocol MUST maintain strict separation between the control plane (control stream) and the data plane (entities).</t>

</section>
<section anchor="quic-foundation"><name>QUIC Foundation</name>

<t>PipeStream MUST be implemented over QUIC <xref target="RFC9000"/> to leverage:</t>

<t><list style="symbols">
  <t>Native stream multiplexing without head-of-line blocking</t>
  <t>Built-in flow control at both connection and stream levels</t>
  <t>TLS 1.3 security by default</t>
  <t>Connection migration capabilities</t>
</list></t>

</section>
<section anchor="multi-layer-data-representation"><name>Multi-Layer Data Representation</name>

<t>The protocol MUST support four distinct data representation layers:</t>

<texttable>
      <ttcol align='left'>Layer</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0</c>
      <c>BlobBag</c>
      <c>Raw binary data with metadata</c>
      <c>1</c>
      <c>SemanticLayer</c>
      <c>Annotated content with embeddings</c>
      <c>2</c>
      <c>ParsedData</c>
      <c>Structured extracted information</c>
      <c>3</c>
      <c>CustomEntity</c>
      <c>Application-specific extension</c>
</texttable>

</section>
</section>
<section anchor="architecture-summary"><name>Architecture Summary</name>

<t>PipeStream uses a dual-stream architecture within a single QUIC connection between a Client (Producer) and Server (Consumer):</t>

<texttable>
      <ttcol align='left'>Stream</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Plane</ttcol>
      <ttcol align='left'>Content</ttcol>
      <c>Stream 0</c>
      <c>Bidirectional</c>
      <c>Control</c>
      <c>STATUS, SCOPE_DIGEST, BARRIER, GOAWAY, CAPABILITIES, CHECKPOINT</c>
      <c>Streams 2+</c>
      <c>Unidirectional</c>
      <c>Data</c>
      <c>Entity frames (Header + Payload)</c>
</texttable>

</section>
<section anchor="connection-lifecycle"><name>Connection Lifecycle</name>

<t>A PipeStream connection follows this lifecycle:</t>

<t><list style="numbers" type="1">
  <t><strong>Establishment:</strong> Client initiates QUIC connection with ALPN identifier "pipestream/1"</t>
  <t><strong>Capability Exchange:</strong> Client and server exchange supported protocol layers and limits</t>
  <t><strong>Control Stream Initialization:</strong> Client opens Stream 0 as bidirectional Control Stream</t>
  <t><strong>Entity Streaming:</strong> Entities are transmitted per Sections 5 and 6</t>
  <t><strong>Termination:</strong> Connection closes via GOAWAY-initiated graceful shutdown (Section 6.5) or QUIC CONNECTION_CLOSE</t>
</list></t>

</section>
</section>
<section anchor="quic-stream-mapping"><name>QUIC Stream Mapping</name>

<t>PipeStream leverages the native multiplexing capabilities of QUIC <xref target="RFC9000"/> to provide a clean separation between control coordination and data transmission.</t>

<section anchor="control-stream-stream-0"><name>Control Stream (Stream 0)</name>

<t>The Control Stream provides the control plane for PipeStream operations.</t>

<section anchor="stream-identification"><name>Stream Identification</name>

<t>The Control Stream MUST use QUIC Stream ID 0, which per RFC 9000 is a bidirectional, client-initiated stream.</t>

</section>
<section anchor="usage-rules"><name>Usage Rules</name>

<t><list style="numbers" type="1">
  <t>The Control Stream MUST be opened immediately upon connection establishment.</t>
  <t>Capability negotiation (Section 3.4) MUST occur on Stream 0 before any Entity Streams are opened.</t>
  <t>Stream 0 MUST NOT carry entity payload data.</t>
  <t>Implementations SHOULD assign the Control Stream a high priority to ensure timely delivery of status updates. An implementation MAY choose a different priority policy when operating in constrained environments where QUIC stream scheduling overhead must be minimized.</t>
</list></t>

</section>
<section anchor="flow-control-considerations"><name>Flow Control Considerations</name>

<t>The Control Stream carries small, bit-packed control frames. STATUS frames are 16 octets base. Implementations MUST ensure adequate flow control credits:</t>

<t><list style="symbols">
  <t>The initial MAX_STREAM_DATA for Stream 0 SHOULD be at least 8192 octets. A lower value is permissible for extremely constrained devices but risks stalling status delivery.</t>
  <t>Implementations SHOULD NOT block Entity Stream transmission due to Control Stream flow control exhaustion. In rare cases where strict ordering between control and data planes is required by the application, an implementation MAY temporarily pause entity transmission until control stream credits are replenished.</t>
</list></t>

</section>
<section anchor="heartbeat-mechanism"><name>Heartbeat Mechanism</name>

<t>QUIC already provides native transport liveness signals (for example, PING and idle timeout handling). Implementations SHOULD rely on those transport mechanisms for connection liveness.</t>

<t>PipeStream heartbeat frames are OPTIONAL and are intended for application-level responsiveness checks (for example, detecting stalled processing logic even when the transport remains healthy). When used, an endpoint sends a STATUS frame with all fields set to their heartbeat values:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>Type</c>
      <c>0x50 (STATUS)</c>
      <c>&#160;</c>
      <c>Stat</c>
      <c>0x0 (UNSPECIFIED)</c>
      <c>Heartbeat signal</c>
      <c>Entity ID</c>
      <c>0xFFFFFFFF</c>
      <c>CONNECTION_LEVEL</c>
      <c>Scope ID</c>
      <c>0x00000000</c>
      <c>Root scope</c>
      <c>Reserved</c>
      <c>0x00000000</c>
      <c>MUST be zero</c>
</texttable>

<t>The KEEPALIVE_TIMEOUT defaults to 30 seconds. Endpoints MAY negotiate a different value by including a <spanx style="verb">keepalive-timeout-ms</spanx> field (in milliseconds) in the capabilities exchange (Section 3.4); the effective timeout is the minimum of the two peers' advertised values.</t>

<t>When no status updates have been transmitted for KEEPALIVE_TIMEOUT, an endpoint MAY send a heartbeat frame. If no data is received on Stream 0 for 3 * KEEPALIVE_TIMEOUT, the endpoint SHOULD first apply transport-native liveness policy (e.g., QUIC PING); it MAY close the connection with PIPESTREAM_IDLE_TIMEOUT (0x02) when application-level inactivity policy requires it.</t>

</section>
<section anchor="transport-session-vs-application-session-context"><name>Transport Session vs. Application Session Context</name>

<t>The <spanx style="verb">session-id</spanx> segment identifies application context for detached or resumable resources (for example, Layer 2 yield/claim-check flows). PipeStream Layer 0 streaming semantics do not depend on this URI scheme.</t>

</section>
<section anchor="interaction-with-quic-flow-control-and-congestion-control"><name>Interaction with QUIC Flow Control and Congestion Control</name>

<t>PipeStream relies on the flow control and congestion control mechanisms provided by QUIC <xref target="RFC9000"/> and does not define its own transport-layer congestion control. QUIC provides flow control at both the stream level (MAX_STREAM_DATA) and the connection level (MAX_DATA). PipeStream's cursor-based backpressure (Section 9.1) operates at the application layer and is complementary to QUIC flow control:</t>

<t><list style="symbols">
  <t>QUIC flow control limits the number of bytes in flight on any given stream or connection.</t>
  <t>PipeStream backpressure limits the number of entities in flight (i.e., the number of Entity IDs between cursor and last_assigned).</t>
</list></t>

<t>When the QUIC connection-level flow control window is exhausted, new Entity Streams cannot transmit data regardless of whether PipeStream's entity window has capacity. Conversely, when PipeStream's entity window is full, no new Entity Streams are opened even if QUIC flow control credits are available. Implementations MUST respect both limits. An implementation SHOULD monitor QUIC-level flow control credit availability and avoid opening new Entity Streams when connection-level credits are below the expected entity size, to prevent head-of-line blocking across streams sharing the connection budget.</t>

</section>
</section>
<section anchor="entity-streams-streams-2"><name>Entity Streams (Streams 2+)</name>

<t>Entity Streams carry the actual entity data.</t>

<section anchor="unidirectional-data-flow"><name>Unidirectional Data Flow</name>

<t>Entity Streams MUST be unidirectional streams:</t>

<texttable>
      <ttcol align='left'>Stream Type</ttcol>
      <ttcol align='left'>Client to Server</ttcol>
      <ttcol align='left'>Server to Client</ttcol>
      <c>Client-Initiated</c>
      <c>4n + 2 (n &gt;= 0)</c>
      <c>2, 6, 10, 14, ...</c>
      <c>Server-Initiated</c>
      <c>4n + 3 (n &gt;= 0)</c>
      <c>3, 7, 11, 15, ...</c>
</texttable>

</section>
<section anchor="one-entity-per-stream"><name>One Entity Per Stream</name>

<t><list style="numbers" type="1">
  <t>Each Entity Stream MUST carry exactly one entity.</t>
  <t>The entity_id in the Entity Frame header MUST be unique within its scope.</t>
  <t>Once an entity has been completely transmitted, the sender MUST close the stream.</t>
</list></t>

</section>
</section>
<section anchor="transport-error-mapping"><name>Transport Error Mapping</name>

<t>PipeStream error signaling on Stream 0 and QUIC transport signals are complementary. Endpoints SHOULD bridge them so peers receive both transport-level and protocol-level context. An implementation MAY omit bridging when operating as a simple pass-through proxy that does not inspect entity status.</t>

<t><list style="numbers" type="1">
  <t>If an Entity Stream is aborted with <spanx style="verb">RESET_STREAM</spanx> or <spanx style="verb">STOP_SENDING</spanx>, the endpoint SHOULD emit a corresponding terminal status (<spanx style="verb">FAILED</spanx>, <spanx style="verb">ABANDONED</spanx>, or policy-driven equivalent) for that entity on Stream 0. The endpoint MAY omit the status frame only if the connection itself is being closed immediately.</t>
  <t>If PipeStream determines a terminal entity error first (for example, checksum failure or invalid frame), the endpoint SHOULD abort the affected Entity Stream with an appropriate QUIC error and emit the corresponding PipeStream status/error context on Stream 0. Aborting the stream MAY be deferred if the entity payload is still needed for diagnostic purposes.</t>
  <t>If Stream 0 is reset or becomes unusable, endpoints SHOULD treat this as a control-plane failure and close the connection with <spanx style="verb">PIPESTREAM_CONTROL_RESET (0x03)</spanx>. An endpoint that can recover control-plane state through an application-layer mechanism MAY attempt reconnection before closing.</t>
  <t>On QUIC connection termination (<spanx style="verb">CONNECTION_CLOSE</spanx>), entities without a previously observed terminal status MUST be treated as failed by local policy.</t>
</list></t>

</section>
</section>
<section anchor="frame-formats"><name>Frame Formats</name>

<t>This section defines the wire formats for PipeStream frames. All multi-octet integer fields are encoded in network byte order (big-endian).</t>

<t><strong>Forward Compatibility:</strong> All Reserved and Flags fields defined in this section MUST be set to zero when sent and MUST be ignored by receivers. This convention enables future specifications to assign meaning to currently-reserved bits without breaking deployed implementations. Receivers that encounter non-zero values in reserved fields MUST NOT treat this as an error.</t>

<section anchor="control-stream-framing-stream-0"><name>Control Stream Framing (Stream 0)</name>

<t>To support mixed content (bit-packed frames and serialized messages) on the Control Stream, PipeStream uses a Unified Control Frame (UCF) header.</t>

<section anchor="ucf-header"><name>UCF Header</name>

<t>Every message on Stream 0 MUST begin with a 1-octet Frame Type.</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Frame Class</ttcol>
      <ttcol align='left'>Length Encoding</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0x50-0x7F</c>
      <c>Fixed</c>
      <c>No length prefix</c>
      <c>Bit-packed control frames with type-defined sizes</c>
      <c>0x80-0xFF</c>
      <c>Variable</c>
      <c>4-octet Length + N</c>
      <c>Variable-size serialized control messages (encoding per Section 3.5)</c>
</texttable>

<t>For Fixed frames, the receiver determines frame size from the Frame Type value. For Variable frames, the Type is followed by a 4-octet unsigned integer (big-endian) indicating the length of the serialized message that follows. Handling of unknown frame types is specified in Section 11.2.1.</t>

<dl>
  <dt>Variable-frame Length (32 bits):</dt>
  <dd>
    <t>The payload length in octets, excluding the 1-octet Type and the 4-octet Length field. Receivers MUST reject lengths greater than 16,777,215 octets (16 MiB - 1) with PIPESTREAM_ENTITY_TOO_LARGE (0x06).</t>
  </dd>
</dl>

</section>
<section anchor="fixed-frame-sizes"><name>Fixed Frame Sizes</name>

<t>The following fixed-size frame types are defined by this document:</t>

<texttable>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Total Size</ttcol>
      <ttcol align='left'>Notes</ttcol>
      <c>0x50</c>
      <c>STATUS</c>
      <c>16 octets (base)</c>
      <c>20 octets when C=1; larger when E=1 with extension data</c>
      <c>0x54</c>
      <c>SCOPE_DIGEST</c>
      <c>72 octets</c>
      <c>Includes 32-octet Merkle root and 64-bit counters</c>
      <c>0x55</c>
      <c>BARRIER</c>
      <c>12 octets</c>
      <c>No variable extension</c>
      <c>0x56</c>
      <c>GOAWAY</c>
      <c>8 octets</c>
      <c>Graceful shutdown signal</c>
</texttable>

</section>
</section>
<section anchor="status-frames-layer-0"><name>Status Frames (Layer 0)</name>

<section anchor="status-frame-format-0x50"><name>Status Frame Format (0x50)</name>

<t>The Status Frame reports lifecycle transitions for entities. The frame is 128-bit aligned for efficient parsing on 64-bit architectures.</t>

<figure type="ascii-art"><artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Type (0x50)  |Ver(4) |Stat(4)|E|C|D(3) |   Flags (11 bits)   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Entity ID (32 bits)                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Scope ID (32 bits)                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Reserved (32 bits)                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<dl>
  <dt>Ver (4 bits):</dt>
  <dd>
    <t>Protocol version. MUST be set to 0x1 for this specification. Receivers that encounter an unsupported version MUST close the connection with PIPESTREAM_LAYER_UNSUPPORTED (0x0C).</t>
  </dd>
  <dt>Stat (4 bits):</dt>
  <dd>
    <t>Status code (see Section 6.2.2).</t>
  </dd>
  <dt>E (1 bit):</dt>
  <dd>
    <t>Extended frame flag. If set, an Extension Header (Section 6.5) MUST follow the base frame (and any cursor update).</t>
  </dd>
  <dt>C (1 bit):</dt>
  <dd>
    <t>Cursor update flag. A 4-octet cursor value follows (Section 6.2.3).</t>
  </dd>
  <dt>D (3 bits):</dt>
  <dd>
    <t>Explicit scope nesting depth (0-7). 0=Root. Layer 1.</t>
  </dd>
  <dt>Flags (11 bits):</dt>
  <dd>
    <t>Reserved for future use. MUST be zero when sent and MUST be ignored by receivers.</t>
  </dd>
  <dt>Entity ID (32 bits):</dt>
  <dd>
    <t>Unsigned integer identifying the entity.</t>
  </dd>
  <dt>Scope ID (32 bits):</dt>
  <dd>
    <t>Identifier for the scope to which this entity belongs. Expanding to 32 bits ensures uniqueness across high-frequency document sessions.</t>
  </dd>
  <dt>Reserved (32 bits):</dt>
  <dd>
    <t>Reserved for future use. MUST be zero when sent and MUST be ignored by receivers.</t>
  </dd>
</dl>

</section>
<section anchor="status-codes"><name>Status Codes</name>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Layer</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0x0</c>
      <c>UNSPECIFIED</c>
      <c>-</c>
      <c>Default / heartbeat signal</c>
      <c>0x1</c>
      <c>PENDING</c>
      <c>0</c>
      <c>Entity announced, not yet transmitting</c>
      <c>0x2</c>
      <c>PROCESSING</c>
      <c>0</c>
      <c>Entity transmission in progress</c>
      <c>0x3</c>
      <c>COMPLETE</c>
      <c>0</c>
      <c>Entity successfully processed</c>
      <c>0x4</c>
      <c>FAILED</c>
      <c>0</c>
      <c>Entity processing failed</c>
      <c>0x5</c>
      <c>CHECKPOINT</c>
      <c>0</c>
      <c>Synchronization barrier</c>
      <c>0x6</c>
      <c>DEHYDRATING</c>
      <c>0</c>
      <c>Dehydrating into children</c>
      <c>0x7</c>
      <c>REHYDRATING</c>
      <c>0</c>
      <c>Rehydrating children</c>
      <c>0x8</c>
      <c>YIELDED</c>
      <c>2</c>
      <c>Paused with continuation token</c>
      <c>0x9</c>
      <c>DEFERRED</c>
      <c>2</c>
      <c>Detached with claim check</c>
      <c>0xA</c>
      <c>RETRYING</c>
      <c>2</c>
      <c>Retry in progress</c>
      <c>0xB</c>
      <c>SKIPPED</c>
      <c>2</c>
      <c>Intentionally skipped</c>
      <c>0xC</c>
      <c>ABANDONED</c>
      <c>2</c>
      <c>Timed out</c>
</texttable>

<t>The base STATUS frame is 16 octets. When C=1, a 4-octet cursor value follows (total 20 octets). When E=1, an Extension Header follows all other STATUS fields.</t>

</section>
<section anchor="entity-status-state-machine"><name>Entity Status State Machine</name>

<t>The following table defines the complete set of valid status transitions. A receiver that observes a transition not listed in this table MUST treat the status frame as a protocol error and close the connection with PIPESTREAM_ENTITY_INVALID (0x05) as the QUIC Application Error Code.</t>

<texttable>
      <ttcol align='left'>From State</ttcol>
      <ttcol align='left'>Valid Transitions (To)</ttcol>
      <c>PENDING</c>
      <c>PROCESSING, DEHYDRATING, FAILED, SKIPPED, ABANDONED</c>
      <c>PROCESSING</c>
      <c>COMPLETE, FAILED, DEHYDRATING, CHECKPOINT, YIELDED, DEFERRED, ABANDONED</c>
      <c>DEHYDRATING</c>
      <c>REHYDRATING, FAILED, ABANDONED</c>
      <c>REHYDRATING</c>
      <c>COMPLETE, FAILED, ABANDONED</c>
      <c>CHECKPOINT</c>
      <c>PROCESSING</c>
      <c>YIELDED</c>
      <c>PROCESSING, FAILED, DEFERRED, ABANDONED</c>
      <c>DEFERRED</c>
      <c>PROCESSING, FAILED, SKIPPED, ABANDONED</c>
      <c>FAILED</c>
      <c>RETRYING, ABANDONED</c>
      <c>RETRYING</c>
      <c>PROCESSING, FAILED, ABANDONED</c>
      <c>COMPLETE</c>
      <c>(terminal -- no transitions)</c>
      <c>SKIPPED</c>
      <c>(terminal -- no transitions)</c>
      <c>ABANDONED</c>
      <c>(terminal -- no transitions)</c>
</texttable>

<t>Notes:</t>

<t><list style="numbers" type="1">
  <t>PENDING is the implicit initial state for every entity upon ID assignment.</t>
  <t>The FAILED -&gt; RETRYING transition is valid only when the entity's completion policy permits retries (max-retries &gt; 0) and the retry count has not been exhausted. If retries are not permitted or are exhausted, FAILED MUST be treated as a terminal state.</t>
  <t>Layer 2 states (YIELDED, DEFERRED, RETRYING, SKIPPED, ABANDONED) MUST NOT appear when Layer 2 has not been negotiated. A receiver operating at Layer 0 or Layer 1 that observes a Layer 2 status code MUST treat it as PIPESTREAM_LAYER_UNSUPPORTED (0x0C).</t>
  <t>The UNSPECIFIED (0x0) status is used only for heartbeat frames (Section 5.1.4) and connection-level signals. It is not a valid entity lifecycle state and MUST NOT appear in transitions for entity IDs other than 0xFFFFFFFF.</t>
</list></t>

</section>
<section anchor="cursor-update-extension"><name>Cursor Update Extension</name>

<t>When C=1, a 4-octet cursor update follows the status frame:</t>

<figure type="ascii-art"><artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  New Cursor Value (32 bits)                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<dl>
  <dt>New Cursor Value (32 bits):</dt>
  <dd>
    <t>The numeric value of the new cursor. Entities with IDs lower than this value (modulo circular ID rules) are considered resolved and their IDs MAY be recycled.</t>
  </dd>
</dl>

</section>
</section>
<section anchor="scope-digest-frame-0x54"><name>Scope Digest Frame (0x54)</name>

<t>When Protocol Layer 1 is negotiated, a scope completion is summarized:</t>

<figure type="ascii-art"><artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Type (0x54)  |  Flags (8)      |        Reserved (16)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Scope ID (32 bits)                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                   Entities Processed (64 bits)                |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                   Entities Succeeded (64 bits)                |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                    Entities Failed (64 bits)                  |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                    Entities Deferred (64 bits)                |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                    Merkle Root (256 bits)                     |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<dl>
  <dt>Flags (8 bits):</dt>
  <dd>
    <t>Reserved for future use. MUST be zero when sent and MUST be ignored by receivers.</t>
  </dd>
  <dt>Scope ID (32 bits):</dt>
  <dd>
    <t>Identifier of the scope being summarized.</t>
  </dd>
  <dt>Entities Processed (64 bits):</dt>
  <dd>
    <t>The total number of entities that were processed within the scope.</t>
  </dd>
  <dt>Entities Succeeded (64 bits):</dt>
  <dd>
    <t>The number of entities that reached a terminal success state.</t>
  </dd>
  <dt>Entities Failed (64 bits):</dt>
  <dd>
    <t>The number of entities that reached a terminal failure state.</t>
  </dd>
  <dt>Entities Deferred (64 bits):</dt>
  <dd>
    <t>The number of entities that were deferred via claim checks.</t>
  </dd>
  <dt>Merkle Root (256 bits):</dt>
  <dd>
    <t>The SHA-256 Merkle root covering all entity statuses in the scope (see Section 9.4).</t>
  </dd>
</dl>

<t>The SCOPE_DIGEST frame is 72 octets total. The Scope ID MUST match the 32-bit identifier defined in Section 6.2.1.</t>

</section>
<section anchor="barrier-frame-0x55"><name>Barrier Frame (0x55)</name>

<figure type="ascii-art"><artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Type (0x55)  |S|  Reserved (23 bits)                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Scope ID (32 bits)                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Parent Entity ID (32 bits)                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<dl>
  <dt>S (1 bit):</dt>
  <dd>
    <t>Status (0 = waiting, 1 = released).</t>
  </dd>
  <dt>Reserved (23 bits):</dt>
  <dd>
    <t>Reserved for future use. MUST be zero when sent and MUST be ignored by receivers.</t>
  </dd>
  <dt>Scope ID (32 bits):</dt>
  <dd>
    <t>Identifier for the scope to which this barrier applies.</t>
  </dd>
  <dt>Parent Entity ID (32 bits):</dt>
  <dd>
    <t>The identifier of the parent entity whose sub-tree is blocked by this barrier.</t>
  </dd>
</dl>

</section>
<section anchor="goaway-frame-0x56"><name>GOAWAY Frame (0x56)</name>

<t>The GOAWAY frame signals that the sender will not accept new entities beyond a specified Entity ID. It enables graceful shutdown: in-flight entities with IDs at or below the Last Entity ID are processed to completion, while the peer refrains from opening new Entity Streams.</t>

<figure type="ascii-art"><artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Type (0x56)  |      Reserved (24 bits)                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                   Last Entity ID (32 bits)                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<dl>
  <dt>Reserved (24 bits):</dt>
  <dd>
    <t>Reserved for future use. MUST be zero when sent and MUST be ignored by receivers.</t>
  </dd>
  <dt>Last Entity ID (32 bits):</dt>
  <dd>
    <t>The highest Entity ID that the sender will process. Entities with IDs greater than this value (per the circular ordering defined in Section 9.1) MUST NOT be sent by the peer after receiving this frame.</t>
  </dd>
</dl>

<section anchor="graceful-shutdown-procedure"><name>Graceful Shutdown Procedure</name>

<t><list style="numbers" type="1">
  <t>An endpoint wishing to shut down sends a GOAWAY frame on Stream 0 with Last Entity ID set to the highest entity it is willing to process.</t>
  <t>Upon receiving GOAWAY, the peer MUST NOT open new Entity Streams for entities with IDs above Last Entity ID. Entity Streams already open for IDs at or below Last Entity ID continue to completion.</t>
  <t>Both peers continue processing status updates on Stream 0 until all in-flight entities reach terminal state.</t>
  <t>Once all entities are resolved, either peer MAY close the QUIC connection with PIPESTREAM_NO_ERROR (0x00).</t>
  <t>If an endpoint receives an entity with an ID above the Last Entity ID after sending GOAWAY, it MUST reject it with PIPESTREAM_ENTITY_INVALID (0x05).</t>
</list></t>

<t>An endpoint MAY send multiple GOAWAY frames to progressively lower the Last Entity ID. The Last Entity ID MUST NOT increase across successive GOAWAY frames within the same connection.</t>

</section>
</section>
<section anchor="yield-and-claim-check-extensions-layer-2"><name>Yield and Claim Check Extensions (Layer 2)</name>

<t>When E=1 in a status frame, an Extension Header MUST follow.</t>

<section anchor="extension-header"><name>Extension Header</name>

<figure type="ascii-art"><artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Extension Length (32 bits)                                |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<dl>
  <dt>Extension Length (32 bits):</dt>
  <dd>
    <t>The total length of the extension data that follows this header, in octets. This allows receivers that do not support specific status extensions to skip the extension data and continue parsing the control stream.</t>
  </dd>
</dl>

<t>If E=1 is set for a Status code that does not define an extension layout in this specification (or a negotiated extension), the receiver MUST use the Extension Length to skip the data. If the length is zero or missing, the frame MUST be treated as malformed.</t>

</section>
<section anchor="yield-extension-stat-0x8"><name>Yield Extension (Stat = 0x8)</name>

<figure type="ascii-art"><artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | Yield Reason  |           Token Length (24 bits)              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                  Yield Token (variable)                       |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<dl>
  <dt>Yield Reason (8 bits):</dt>
  <dd>
    <t>The reason for yielding (see Section 6.5.1.1).</t>
  </dd>
  <dt>Token Length (24 bits):</dt>
  <dd>
    <t>The length of the Yield Token in bytes (maximum 16,777,215).</t>
  </dd>
  <dt>Yield Token (variable):</dt>
  <dd>
    <t>The opaque continuation state.</t>
  </dd>
</dl>

<section anchor="yield-reason-codes"><name>Yield Reason Codes</name>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0x1</c>
      <c>EXTERNAL_CALL</c>
      <c>Waiting on external service</c>
      <c>0x2</c>
      <c>RATE_LIMITED</c>
      <c>Voluntary throttle</c>
      <c>0x3</c>
      <c>AWAITING_SIBLING</c>
      <c>Waiting for specific sibling</c>
      <c>0x4</c>
      <c>AWAITING_APPROVAL</c>
      <c>Human/workflow gate</c>
      <c>0x5</c>
      <c>RESOURCE_BUSY</c>
      <c>Semaphore/lock</c>
      <c>0x0, 0x06-0xFF</c>
      <c>Reserved</c>
      <c>Reserved for future use</c>
</texttable>

</section>
</section>
<section anchor="claim-check-extension-stat-0x9"><name>Claim Check Extension (Stat = 0x9)</name>

<figure type="ascii-art"><artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                    Claim Check ID (64 bits)                   |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                Expiry Timestamp (64 bits, Unix micros)        |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<dl>
  <dt>Claim Check ID (64 bits):</dt>
  <dd>
    <t>A cryptographically secure random identifier for the claim.</t>
  </dd>
  <dt>Expiry Timestamp (64 bits):</dt>
  <dd>
    <t>Unix epoch timestamp in microseconds when the claim expires.</t>
  </dd>
</dl>

</section>
</section>
<section anchor="variable-length-serialized-messages-0x80-0xff"><name>Variable-Length Serialized Messages (0x80-0xFF)</name>

<t>Messages in this range are preceded by a 4-octet length field. The message body is encoded using the serialization format negotiated during capability exchange (Section 3.5). If no format was negotiated, CBOR <xref target="RFC8949"/> is the default.</t>

<texttable>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Message Name</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x80</c>
      <c>Capabilities</c>
      <c>Section 3.4</c>
      <c>0x81</c>
      <c>Checkpoint</c>
      <c>Section 9.3</c>
</texttable>

</section>
<section anchor="entity-frames"><name>Entity Frames</name>

<t>Entity frames carry the actual document entity data on Entity Streams.</t>

<section anchor="entity-frame-structure"><name>Entity Frame Structure</name>

<figure type="ascii-art"><artwork><![CDATA[
   +---------------------------+
   |    Header Length (4)      |   4 octets, big-endian uint32
   +---------------------------+
   |                           |
   |    Header (serialized)    |   Variable length
   |                           |
   +---------------------------+
   |                           |
   |    Payload                |   Variable length (per header)
   |                           |
   +---------------------------+
]]></artwork></figure>

<dl>
  <dt>Header Length (4 octets):</dt>
  <dd>
    <t>The length of the serialized EntityHeader in bytes.</t>
  </dd>
  <dt>Header (serialized):</dt>
  <dd>
    <t>The EntityHeader message encoded in the negotiated serialization format (see Section 6.7.2).</t>
  </dd>
  <dt>Payload (variable):</dt>
  <dd>
    <t>The raw entity data.</t>
  </dd>
</dl>

</section>
<section anchor="message-schema-cddl"><name>Message Schema (CDDL)</name>

<t>Normative definitions for serialized PipeStream messages use CDDL <xref target="RFC8610"/> notation. An informational Protocol Buffers equivalent is provided in Appendix D.</t>

<section anchor="entity-header"><name>Entity Header</name>

<figure><sourcecode type="cddl"><![CDATA[
entity-header = {
  entity-id: uint,               ; 32-bit on wire (STATUS frame)
  ? parent-id: uint,             ; 32-bit scope-local
  ? scope-id: uint,              ; 32-bit (Section 6.2.1)
  layer: uint .le 3,             ; Data layer 0-3
  ? content-type: tstr,          ; MIME type
  payload-length: uint,          ; 32-bit (UCF header)
  ? checksum: bstr .size 32,     ; SHA-256; SHOULD be present
  ? metadata: { * tstr => tstr },
  ? chunk-info: chunk-info,
  ? completion-policy: completion-policy, ; Layer 2
}
]]></sourcecode></figure>

</section>
<section anchor="chunk-info"><name>Chunk Info</name>

<figure><sourcecode type="cddl"><![CDATA[
chunk-info = {
  total-chunks: uint,
  chunk-index: uint,
  chunk-offset: uint,
}
]]></sourcecode></figure>

</section>
<section anchor="yield-and-deferral"><name>Yield and Deferral</name>

<figure><sourcecode type="cddl"><![CDATA[
yield-token = {
  reason: yield-reason,            ; See Appendix C for enum values
  ? continuation-state: bstr,
  ? validation: stopping-point-validation,
}

claim-check = {
  claim-id: uint,
  entity-id: uint,
  ? scope-id: uint,
  expiry-timestamp: uint,        ; Unix epoch microseconds
  ? validation: stopping-point-validation,
}
]]></sourcecode></figure>

</section>
<section anchor="support-types"><name>Support Types</name>

<figure><sourcecode type="cddl"><![CDATA[
entity-status = uint .size 1 ; Values 0x0-0xC per Section 6.2.2

stopping-point-validation = {
  ? state-checksum: bstr,        ; Hash of processing state
  ? bytes-processed: uint,       ; Progress marker
  ? children-complete: uint,
  ? children-total: uint,
  ? is-resumable: bool,
  ? checkpoint-ref: tstr,
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="checksum-algorithm"><name>Checksum Algorithm</name>

<t>PipeStream uses SHA-256 <xref target="FIPS-180-4"/> for payload integrity verification. The checksum MUST be exactly 32 octets.</t>

</section>
</section>
</section>
<section anchor="entity-model"><name>Entity Model</name>

<t>PipeStream distinguishes between the wire-level entity representation (EntityHeader, Section 6.7.2) and the application-level document envelope (PipeDoc, this section). The EntityHeader is the on-the-wire structure that prefixes every entity payload on an Entity Stream; it carries the fields needed for transport-level processing (entity-id, layer, payload-length, checksum). The PipeDoc structure is an application-layer envelope carried within the entity payload itself, providing domain-specific identification (doc_id) and ownership tracking. A PipeDoc's <spanx style="verb">entity_id</spanx> field MUST match the <spanx style="verb">entity-id</spanx> field in the enclosing EntityHeader.</t>

<section anchor="core-fields"><name>Core Fields</name>

<t>Every PipeStream entity is represented as a PipeDoc message:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Requirement</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>doc_id</c>
      <c>string</c>
      <c>REQUIRED</c>
      <c>Unique document identifier (UUID recommended)</c>
      <c>entity_id</c>
      <c>uint32</c>
      <c>REQUIRED</c>
      <c>Scope-local identifier</c>
      <c>ownership</c>
      <c>OwnershipContext</c>
      <c>OPTIONAL</c>
      <c>Multi-tenancy tracking</c>
</texttable>

</section>
<section anchor="four-data-layers"><name>Four Data Layers</name>

<t>Each PipeDoc carries entity payload in one of four data layers:</t>

<texttable>
      <ttcol align='left'>Layer</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Content</ttcol>
      <c>0</c>
      <c>BlobBag</c>
      <c>Raw binary data: original document bytes, images, attachments</c>
      <c>1</c>
      <c>SemanticLayer</c>
      <c>Annotated content: text segments with vector embeddings, NLP annotations, NER, classifications</c>
      <c>2</c>
      <c>ParsedData</c>
      <c>Structured extraction: key-value pairs, tables, structured fields</c>
      <c>3</c>
      <c>CustomEntity</c>
      <c>Extension point: domain-specific extension types</c>
</texttable>

</section>
<section anchor="cloud-agnostic-storage-reference"><name>Cloud-Agnostic Storage Reference</name>

<figure><sourcecode type="cddl"><![CDATA[
file-storage-reference = {
  provider: tstr,                ; Storage provider identifier
  bucket: tstr,                  ; Bucket/container name
  key: tstr,                     ; Object key/path
  ? region: tstr,                ; Optional region hint
  ? attrs: { * tstr => tstr },   ; Provider-specific attributes
  ? encryption: encryption-metadata,
}

encryption-metadata = {
  algorithm: tstr,               ; "AES-256-GCM", "AES-256-CBC"
  ? key-provider: tstr,          ; "aws-kms", "azure-keyvault",
                                 ; "gcp-kms", "vault"
  ? key-id: tstr,                ; Key ARN/URI/ID
  ? wrapped-key: bstr,           ; Client-side encrypted DEK
  ? iv: bstr,                    ; Initialization vector
  ? context: { * tstr => tstr }, ; Encryption context
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="protocol-operations"><name>Protocol Operations</name>

<t>This section defines the protocol-level operations that PipeStream endpoints perform during a session. These operations describe the phases of a PipeStream session lifecycle, from connection establishment through entity processing to terminal consumption.</t>

<section anchor="overview"><name>Overview</name>

<t>A PipeStream session proceeds through four sequential actions:</t>

<figure><artwork><![CDATA[
                +---------------------------------------------+
                |           PipeStream Action Flow            |
                +---------------------------------------------+
                                     |
                                     v
                +---------------------------------------------+
                |                  CONNECT                    |
                |    (Session + Capability Negotiation)       |
                +---------------------------------------------+
                                     |
                                     v
                +---------------------------------------------+
                |                   PARSE                     |
                |        (Dehydration: 1:N possible)         |
                +---------------------------------------------+
                                     |
                       +-------------+-------------+
                       v             v             v
                +-----------+ +-----------+ +-----------+
                |  PROCESS  | |  PROCESS  | |  PROCESS  |
                |   (1:1)   | |   (1:1)   | |   (N:1)   |
                +-----------+ +-----------+ +-----------+
                       |             |             |
                       +-------------+-------------+
                                     |
                                     v
                +---------------------------------------------+
                |                   SINK                      |
                |          (Terminal Consumption)             |
                +---------------------------------------------+
]]></artwork></figure>

<texttable>
      <ttcol align='left'>Phase</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Cardinality</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>1</c>
      <c>CONNECT</c>
      <c>1:1</c>
      <c>Session establishment and capability negotiation</c>
      <c>2</c>
      <c>PARSE</c>
      <c>1:N</c>
      <c>Dehydration: decompose input into entities</c>
      <c>3</c>
      <c>PROCESS</c>
      <c>1:1 or N:1</c>
      <c>Transform, rehydrate, aggregate, or pass through entities (parallel)</c>
      <c>4</c>
      <c>SINK</c>
      <c>N:1</c>
      <c>Terminal consumption: index, store, or notify</c>
</texttable>

</section>
<section anchor="connect-action"><name>CONNECT Action</name>

<t>The CONNECT action establishes the session with capability negotiation.</t>

<section anchor="alpn-identifier"><name>ALPN Identifier</name>

<t>ALPN Protocol ID: <spanx style="verb">pipestream/1</spanx></t>

</section>
<section anchor="capability-exchange"><name>Capability Exchange</name>

<t>Immediately after QUIC handshake, peers exchange Capabilities messages on Stream 0.</t>

<t>The Capabilities exchange includes serialization format negotiation (Section 3.5). The agreed-upon format applies to all subsequent variable-length serialized messages on Stream 0 and to all entity headers on Entity Streams.</t>

</section>
</section>
<section anchor="parse-action"><name>PARSE Action</name>

<t>The PARSE action performs dehydration with optional completion policy:</t>

<figure><sourcecode type="cddl"><![CDATA[
completion-policy = {
  ? mode: completion-mode,
  ? max-retries: uint,           ; Default: 3
  ? retry-delay-ms: uint,        ; Default: 1000
  ? timeout-ms: uint,            ; Default: 300000 (5 min)
  ? min-success-ratio: float32,  ; For QUORUM mode
  ? on-timeout: failure-action,
  ? on-failure: failure-action,
}

completion-mode = &(
  unspecified: 0,                ; Default; treat as STRICT
  strict: 1,                    ; All children MUST complete
  lenient: 2,                   ; Continue with partial results
  best-effort: 3,               ; Complete with whatever succeeds
  quorum: 4,                    ; Need min-success-ratio
)

failure-action = &(
  unspecified: 0,                ; Default; treat as FAIL
  fail: 1,                      ; Propagate failure up
  skip: 2,                      ; Skip, continue with siblings
  retry: 3,                     ; Retry up to max-retries
  defer: 4,                     ; Create claim check, continue
)
]]></sourcecode></figure>

</section>
<section anchor="process-action"><name>PROCESS Action</name>

<texttable>
      <ttcol align='left'>Mode</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>TRANSFORM</c>
      <c>1:1 entity transformation</c>
      <c>REHYDRATE</c>
      <c>N:1 merge of siblings from dehydration</c>
      <c>AGGREGATE</c>
      <c>N:1 with reduction function</c>
      <c>PASSTHROUGH</c>
      <c>Metadata-only modification</c>
</texttable>

</section>
<section anchor="sink-action"><name>SINK Action</name>

<texttable>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>INDEX</c>
      <c>Search engine integration (Elasticsearch, Solr, etc.)</c>
      <c>STORAGE</c>
      <c>Blob storage persistence (Object stores, Cloud storage)</c>
      <c>NOTIFICATION</c>
      <c>Webhook/messaging triggers</c>
</texttable>

</section>
</section>
<section anchor="rehydration-semantics"><name>Rehydration Semantics</name>

<section anchor="entity-id-lifecycle-and-cursor"><name>Entity ID Lifecycle and Cursor</name>

<t>Entity IDs are managed using a cursor-based circular recycling scheme within the 32-bit ID space. The ID space is divided into three logical regions relative to the current <spanx style="verb">cursor</spanx> and <spanx style="verb">last_assigned</spanx> pointers:</t>

<texttable>
      <ttcol align='left'>Region</ttcol>
      <ttcol align='left'>ID Range</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>Recyclable</c>
      <c>IDs behind <spanx style="verb">cursor</spanx></c>
      <c>Resolved entities; IDs may be reused</c>
      <c>In-flight</c>
      <c><spanx style="verb">cursor</spanx> to <spanx style="verb">last_assigned</spanx></c>
      <c>Active entities (PENDING, PROCESSING, etc.)</c>
      <c>Free</c>
      <c>Beyond <spanx style="verb">last_assigned</spanx></c>
      <c>Available for new entity assignment</c>
</texttable>

<t>The window size is computed as <spanx style="verb">(last_assigned - cursor) mod 0xFFFFFFFD</spanx>. If <spanx style="verb">window_size &gt;= max_window</spanx>, the sender MUST apply backpressure and stop assigning new IDs until the cursor advances.</t>

<t><strong>Rules:</strong></t>

<t><list style="numbers" type="1">
  <t><spanx style="verb">new_id = (last_assigned + 1) % 0xFFFFFFFD</spanx></t>
  <t>If <spanx style="verb">new_id == 0</spanx>, <spanx style="verb">new_id = 1</spanx> (skip reserved NULL_ENTITY)</t>
  <t>If <spanx style="verb">(new_id - cursor) % 0xFFFFFFFD &gt;= max_window</spanx> -&gt; STOP, apply backpressure</t>
  <t>On reaching a terminal state (COMPLETE, SKIPPED, ABANDONED, or FAILED with no remaining retries): mark resolved; if <spanx style="verb">entity_id == cursor</spanx>, advance cursor past all contiguous resolved IDs</t>
  <t>IDs behind cursor are implicitly recyclable</t>
</list></t>

<t>An entity in the FAILED state that may still transition to RETRYING (Section 6.2.2a) MUST NOT be marked resolved. Only when retries are exhausted or no completion policy permits retries does FAILED become terminal for cursor purposes.</t>

</section>
<section anchor="assembly-manifest"><name>Assembly Manifest</name>

<t>The Assembly Manifest is a local data structure maintained by each endpoint to track the parent-child relationships created during dehydration. It is not transmitted on the wire; rather, each endpoint constructs its own manifest from the <spanx style="verb">parent-id</spanx> fields in received EntityHeaders and from status updates observed on the Control Stream. The CDDL below defines the logical structure of each entry; implementations MAY use any internal representation that preserves the required semantics.</t>

<t>Each Assembly Manifest entry tracks:</t>

<figure><sourcecode type="cddl"><![CDATA[
assembly-manifest-entry = {
  parent-id: uint,
  ? scope-id: uint,              ; Layer 1
  children-ids: [* uint],
  ? children-status: [* entity-status],
  ? policy: completion-policy,   ; Layer 2
  ? created-at: uint,
  ? state: resolution-state,
}

resolution-state = &(
  unspecified: 0,
  active: 1,
  resolved: 2,
  partial: 3,                   ; Some children failed/skipped
  failed: 4,
)
]]></sourcecode></figure>

</section>
<section anchor="checkpoint-blocking"><name>Checkpoint Blocking</name>

<t>A checkpoint is satisfied when:</t>

<t><list style="numbers" type="1">
  <t>All entities in the checkpoint scope with IDs less than <spanx style="verb">checkpoint_entity_id</spanx> (considering circular wrap) have reached terminal state.</t>
  <t>All Assembly Manifest entries within the checkpoint scope have been resolved.</t>
  <t>All nested checkpoints within the checkpoint scope have been satisfied.</t>
</list></t>

<t>CheckpointFrame (Section 6.6 / Appendix C) carries both:</t>

<figure><sourcecode type="cddl"><![CDATA[
checkpoint-frame = {
  checkpoint-id: tstr,
  sequence-number: uint,
  checkpoint-entity-id: uint,
  ? scope-id: uint,
  ? flags: uint,
  ? timeout-ms: uint,
}
]]></sourcecode></figure>

<t><list style="symbols">
  <t><spanx style="verb">checkpoint_id</spanx>: an opaque identifier for logging and correlation.</t>
  <t><spanx style="verb">checkpoint_entity_id</spanx>: the numeric ordering key used for barrier evaluation.</t>
</list></t>

<t>Implementations MUST use <spanx style="verb">checkpoint_entity_id</spanx> (not <spanx style="verb">checkpoint_id</spanx>) when evaluating Condition 1.</t>

<t>For circular comparison in Condition 1, implementations MUST use the same modulo ordering as cursor management. Define <spanx style="verb">MAX = 0xFFFFFFFD</spanx> and:</t>

<t><spanx style="verb">is_before(a, b) = ((b - a + MAX) % MAX) &lt; (MAX / 2)</spanx></t>

<t>An entity ID <spanx style="verb">a</spanx> is considered "less than checkpoint_entity_id <spanx style="verb">b</spanx>" iff <spanx style="verb">is_before(a, b)</spanx> is true.</t>

</section>
<section anchor="scope-id-allocation-layer-1"><name>Scope ID Allocation (Layer 1)</name>

<t>When Layer 1 is negotiated, Scope IDs are 32-bit unsigned integers assigned by the endpoint that initiates the dehydration. The allocation scheme is as follows:</t>

<t><list style="numbers" type="1">
  <t>Scope ID 0 is the root scope and MUST NOT be used for child scopes.</t>
  <t>The dehydrating endpoint assigns a unique Scope ID to each new child scope created during dehydration. The Scope ID MUST be unique within the connection for the lifetime of that scope (i.e., until the scope's SCOPE_DIGEST frame has been emitted and acknowledged).</t>
  <t>Scope IDs MAY be allocated sequentially or randomly; the protocol does not require any particular ordering. Sequential allocation is RECOMMENDED for simplicity and debuggability.</t>
  <t>Once a scope has been closed (its SCOPE_DIGEST has been sent), the Scope ID MAY be reused for a new scope. Implementations MUST ensure that no in-flight status frames reference a recycled Scope ID; this is guaranteed if the implementation waits until all entities within the scope have reached terminal state before recycling.</t>
</list></t>

</section>
<section anchor="scope-digest-propagation-layer-1"><name>Scope Digest Propagation (Layer 1)</name>

<t>When a scope completes, the endpoint MUST compute a Scope Digest and propagate it to the parent scope via a SCOPE_DIGEST frame (Section 6.3).</t>

<t>The Merkle root in the Scope Digest is computed as follows:</t>

<t><list style="numbers" type="1">
  <t>For each entity in the scope, ordered by Entity ID (ascending), construct a 5-octet leaf value by concatenating:
  <list style="symbols">
      <t>The 4-octet big-endian Entity ID.</t>
      <t>A 1-octet status field where the lower 4 bits contain the <spanx style="verb">Stat</spanx> code (Section 6.2.2) and the upper 4 bits are zero.</t>
    </list></t>
  <t>Compute SHA-256 over each 5-octet leaf to produce leaf hashes.</t>
  <t>Build a binary Merkle tree by repeatedly hashing pairs of sibling nodes: <spanx style="verb">SHA-256(left || right)</spanx>. If the number of nodes at any level is odd, the last node is promoted to the next level without hashing.</t>
  <t>The root of this tree is the <spanx style="verb">merkle_root</spanx> value in the SCOPE_DIGEST frame.</t>
</list></t>

<t>This construction is deterministic: any two implementations processing the same set of entity statuses MUST produce the same Merkle root.</t>

</section>
<section anchor="rehydration-readiness-tracking"><name>Rehydration Readiness Tracking</name>

<t>Implementations MUST track Assembly Manifest resolution order using a mechanism that provides O(1) insertion and amortized O(log n) minimum extraction. The tracking mechanism MUST support efficient decrease-key operations to handle out-of-order status updates.</t>

<t>Implementations MAY use a Fibonacci heap or similar priority queue to satisfy these complexity requirements.</t>

</section>
<section anchor="stopping-point-validation-layer-2"><name>Stopping Point Validation (Layer 2)</name>

<t>When yielding or deferring, include validation:</t>

<figure><sourcecode type="cddl"><![CDATA[
stopping-point-validation = {
  ? state-checksum: bstr,        ; Hash of processing state
  ? bytes-processed: uint,       ; Progress marker
  ? children-complete: uint,
  ? children-total: uint,
  ? is-resumable: bool,
  ? checkpoint-ref: tstr,
}
]]></sourcecode></figure>

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

<section anchor="transport-security"><name>Transport Security</name>

<t>PipeStream inherits security from QUIC <xref target="RFC9000"/> and TLS 1.3 <xref target="RFC8446"/>. All connections MUST use TLS 1.3 or later. Implementations MUST NOT provide mechanisms to disable encryption.</t>

</section>
<section anchor="entity-payload-integrity"><name>Entity Payload Integrity</name>

<t>Each Entity SHOULD include a SHA-256 <xref target="FIPS-180-4"/> checksum in its EntityHeader (the <spanx style="verb">checksum</spanx> field defined in Section 6.7.2). The checksum is OPTIONAL in the wire format to accommodate zero-length entities, streamed entities whose final length is unknown at header-emission time, and scenarios where application-layer integrity mechanisms provide equivalent guarantees. When a checksum is present, it MUST be exactly 32 octets containing the SHA-256 digest computed over the raw payload bytes (the octet sequence following the EntityHeader on the Entity Stream). The checksum does not cover the EntityHeader itself.</t>

<t>For chunked entities (where <spanx style="verb">chunk-info</spanx> is present in the EntityHeader), each chunk MAY carry its own per-chunk checksum. The checksum in the first chunk's EntityHeader, if present, MUST cover only that chunk's payload bytes. An implementation that requires whole-entity integrity verification MUST either compute a rolling digest across all chunks or require the sender to transmit a final summary entity containing the whole-payload checksum.</t>

<t>To support true streaming of large entities, implementations MAY begin processing an entity payload before the complete payload has been received and verified. However, the final rehydration or terminal SINK operation MUST NOT be committed until the complete payload checksum has been verified.</t>

<t>If a checksum verification fails, the implementation MUST:</t>

<t><list style="numbers" type="1">
  <t>Reject the entity with PIPESTREAM_INTEGRITY_ERROR (0x04).</t>
  <t>Discard any partial results or temporary state associated with the entity.</t>
  <t>Propagate the failure according to the Completion Policy (Section 8.3).</t>
</list></t>

<t>Implementations that require immediate consistency SHOULD buffer the entire entity and verify the checksum before initiating processing.</t>

<section anchor="algorithm-agility"><name>Algorithm Agility</name>

<t>This specification mandates SHA-256 <xref target="FIPS-180-4"/> as the sole checksum algorithm for both payload integrity (this section) and Merkle tree construction (Section 9.4). SHA-256 is well-studied and widely deployed; however, future developments may necessitate migration to a different algorithm.</t>

<t>PipeStream supports algorithm migration through the capability negotiation mechanism (Section 3.4). A future specification MAY define additional fields in the <spanx style="verb">capabilities</spanx> structure to advertise supported checksum algorithms, following the general principles outlined in <xref target="RFC7696"/>. Until such negotiation is defined, all implementations MUST use SHA-256 when producing or verifying checksums. An implementation that receives a checksum of a length other than 32 octets MUST reject the entity with PIPESTREAM_INTEGRITY_ERROR (0x04).</t>

<t>The <spanx style="verb">checksum</spanx> field in the EntityHeader is typed as <spanx style="verb">bstr .size 32</spanx> in the CDDL schema (Appendix C). A future algorithm negotiation extension would need to update this constraint, the SCOPE_DIGEST Merkle root size, and the corresponding IANA registry entries.</t>

</section>
</section>
<section anchor="resource-exhaustion"><name>Resource Exhaustion</name>

<texttable>
      <ttcol align='left'>Limit</ttcol>
      <ttcol align='left'>Default</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>Max scope depth</c>
      <c>7</c>
      <c>Prevents recursive bombs (8 levels: 0-7)</c>
      <c>Max entities per scope</c>
      <c>4,294,967,294</c>
      <c>Memory bounds</c>
      <c>Max window size</c>
      <c>2,147,483,648</c>
      <c>Max in-flight entities (2^31)</c>
      <c>Checkpoint timeout</c>
      <c>30s</c>
      <c>Prevents stuck state</c>
      <c>Claim check expiry</c>
      <c>86400s</c>
      <c>Garbage collection</c>
</texttable>

<t>Implementations MUST enforce all resource limits listed above. Exceeding any limit MUST result in the corresponding error code (see Section 11.4). Implementations SHOULD allow operators to configure stricter limits than the defaults shown here.</t>

<t>To prevent memory-exhaustion attacks, implementations MUST NOT pre-allocate memory for variable-length payloads based solely on the 32-bit Length field in the UCF header (Section 6.1.1). Memory MUST be allocated incrementally as octets are received, or capped at a smaller initial buffer until the message type and context are verified.</t>

</section>
<section anchor="amplification-attacks"><name>Amplification Attacks</name>

<t>A single dehydration operation can produce an arbitrary number of child entities from a small input, creating a potential amplification vector. To mitigate this:</t>

<t><list style="numbers" type="1">
  <t>Implementations MUST enforce the max_entities_per_scope limit negotiated during capability exchange (Section 3.4). Any dehydration that would exceed this limit MUST be rejected.</t>
  <t>Implementations MUST enforce the max_scope_depth limit. A dehydration chain deeper than this limit MUST be rejected with PIPESTREAM_DEPTH_EXCEEDED (0x07).</t>
  <t>Implementations SHOULD enforce a configurable ratio between input entity size and total child entity count. A recommended default is no more than 1,000 children per megabyte of parent payload.</t>
  <t>The backpressure mechanism (Section 9.1) provides a natural throttle: when the in-flight window fills, no new Entity IDs can be assigned until existing entities complete and the cursor advances. Implementations MUST NOT bypass backpressure for dehydration-generated entities.</t>
</list></t>

</section>
<section anchor="privacy-considerations"><name>Privacy Considerations</name>

<t>PipeStream entity headers and control stream frames carry metadata that may reveal information about the entities being processed, even when payloads are encrypted at the application layer:</t>

<t><list style="numbers" type="1">
  <t><strong>Entity structure leakage</strong>: The number of child entities produced by dehydration, the scope depth, and the Entity ID assignment pattern may reveal the structure of the input being processed (e.g., an entity that dehydrates into 50 children is likely a multi-part input). Implementations that require structural privacy SHOULD pad dehydration counts or use fixed decomposition granularity. Deployments that do not handle privacy-sensitive data MAY omit this padding.</t>
  <t><strong>Metadata in headers</strong>: The <spanx style="verb">content_type</spanx>, <spanx style="verb">metadata</spanx> map, and <spanx style="verb">payload_length</spanx> fields in EntityHeader (Section 6.7) are transmitted in cleartext within the QUIC-encrypted stream. Implementations that require metadata confidentiality beyond transport encryption SHOULD encrypt EntityHeader fields at the application layer and use an opaque content_type such as <spanx style="verb">application/octet-stream</spanx>. This overhead is unnecessary when the deployment operates within a trusted network.</t>
  <t><strong>Traffic analysis</strong>: The timing and size of status frames on the Control Stream may correlate with processing patterns. Implementations operating in privacy-sensitive environments SHOULD send status frames at fixed intervals with padding to obscure processing timing. Deployments in trusted environments MAY omit traffic padding to reduce bandwidth overhead.</t>
  <t><strong>Identifiers</strong>: The <spanx style="verb">doc_id</spanx> field in PipeDoc (Section 7.1) and filenames in BlobBag entries are application-layer data but may be logged by intermediate processing nodes. Implementations SHOULD provide mechanisms to redact or pseudonymize identifiers at pipeline boundaries. This recommendation may be relaxed when all nodes in the pipeline are operated by the same administrative entity.</t>
</list></t>

</section>
<section anchor="replay-and-token-reuse"><name>Replay and Token Reuse</name>

<section anchor="yield-token-replay"><name>Yield Token Replay</name>

<t>Yield tokens (Section 6.5.1) contain opaque continuation state that enables resumption of paused entity processing. A replayed yield token could cause an entity to be processed multiple times or to resume from a stale state. To prevent this:</t>

<t><list style="numbers" type="1">
  <t>Implementations MUST associate each yield token with a stable application context identifier (for example, a session identifier) and Entity ID. In Layer 0-only operation, this context MAY be implicit in the active transport connection. For Layer 2 resumptions that can occur across reconnects or different nodes, the context identifier MUST remain stable across transport connections. A yield token MUST be rejected if presented in a different context than the one that issued it, unless the token was explicitly transferred via a claim check.</t>
  <t>Implementations MUST invalidate a yield token after it has been consumed for resumption. A second resumption attempt with the same token MUST be rejected.</t>
  <t>The StoppingPointValidation (Section 9.6) provides integrity checking at resume time. Implementations MUST verify the <spanx style="verb">state_checksum</spanx> field before accepting a resumed entity. If the checksum does not match the current state, the resumption MUST be rejected and the entity MUST be reprocessed from the beginning.</t>
</list></t>

</section>
<section anchor="claim-check-replay"><name>Claim Check Replay</name>

<t>Claim checks (Section 6.5.2) are long-lived references that can be redeemed in different sessions. To prevent misuse:</t>

<t><list style="numbers" type="1">
  <t>Each claim check carries an <spanx style="verb">expiry_timestamp</spanx> (Unix epoch microseconds). Implementations MUST reject expired claim checks.</t>
  <t>Implementations MUST track redeemed claim check IDs and reject duplicate redemptions. The tracking state MUST persist for at least the claim check expiry duration.</t>
  <t>Claim check IDs MUST be generated using a cryptographically secure random number generator to prevent guessing.</t>
</list></t>

</section>
</section>
<section anchor="encryption-key-management"><name>Encryption Key Management</name>

<t>When using FileStorageReference with encryption:</t>

<t><list style="numbers" type="1">
  <t>Key IDs MUST reference keys in approved providers.</t>
  <t>Wrapped keys MUST use approved envelope encryption.</t>
  <t>Key rotation MUST be supported via key_id versioning.</t>
  <t>Implementations MUST NOT log key material.</t>
  <t>Implementations MUST NOT include unwrapped data encryption keys in EntityHeader metadata or Control Stream frames.</t>
</list></t>

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

<t>This document requests the creation of several new registries and one ALPN identifier registration. All registries defined in this section use the "Expert Review" policy <xref target="RFC8126"/> for new assignments unless otherwise stated.</t>

<section anchor="alpn-identifier-registration"><name>ALPN Identifier Registration</name>

<t>This document registers the following ALPN <xref target="RFC7301"/> protocol identifier:</t>

<dl>
  <dt>Protocol:</dt>
  <dd>
    <t>PipeStream Version 1</t>
  </dd>
  <dt>Identification Sequence:</dt>
  <dd>
    <t>0x70 0x69 0x70 0x65 0x73 0x74 0x72 0x65 0x61 0x6D 0x2F 0x31 ("pipestream/1")</t>
  </dd>
  <dt>Specification:</dt>
  <dd>
    <t>This document</t>
  </dd>
</dl>

</section>
<section anchor="pipestream-frame-type-registry"><name>PipeStream Frame Type Registry</name>

<t>IANA is requested to create the "PipeStream Frame Types" registry. Values are categorized into Fixed (type-sized, no length prefix) frames in 0x50-0x7F and Variable (4-octet length prefix) frames in 0x80-0xFF. Values 0xC0-0xFF are reserved for private use.</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Frame Type Name</ttcol>
      <ttcol align='left'>Class</ttcol>
      <ttcol align='left'>Size</ttcol>
      <ttcol align='left'>Layer</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x50</c>
      <c>STATUS</c>
      <c>Fixed</c>
      <c>16 octets base</c>
      <c>0</c>
      <c>Section 6.2</c>
      <c>0x54</c>
      <c>SCOPE_DIGEST</c>
      <c>Fixed</c>
      <c>72 octets</c>
      <c>1</c>
      <c>Section 6.3</c>
      <c>0x55</c>
      <c>BARRIER</c>
      <c>Fixed</c>
      <c>12 octets</c>
      <c>1</c>
      <c>Section 6.4</c>
      <c>0x56</c>
      <c>GOAWAY</c>
      <c>Fixed</c>
      <c>8 octets</c>
      <c>0</c>
      <c>Section 6.5</c>
      <c>0x57-0x7F</c>
      <c>Reserved</c>
      <c>Fixed</c>
      <c>-</c>
      <c>-</c>
      <c>this document</c>
      <c>0x80</c>
      <c>CAPABILITIES</c>
      <c>Var</c>
      <c>Length-prefixed</c>
      <c>0</c>
      <c>Section 3.4</c>
      <c>0x81</c>
      <c>CHECKPOINT</c>
      <c>Var</c>
      <c>Length-prefixed</c>
      <c>0</c>
      <c>Section 9.3</c>
      <c>0x82-0xBF</c>
      <c>Reserved</c>
      <c>Var</c>
      <c>-</c>
      <c>-</c>
      <c>this document</c>
</texttable>

<section anchor="unknown-frame-handling"><name>Unknown Frame Handling</name>

<t>Receivers that encounter a Variable-class frame type (0x80-0xFF) that they do not recognize MUST skip the frame by reading and discarding the number of octets indicated by the 4-octet length prefix. Receivers that encounter an unknown Fixed-class frame type (0x50-0x7F) for which no size is defined MUST close the connection with PIPESTREAM_ENTITY_INVALID (0x05), since the frame size cannot be determined. Future specifications that register new Fixed-class frame types MUST define the frame size in the registry entry.</t>

</section>
</section>
<section anchor="pipestream-status-code-registry"><name>PipeStream Status Code Registry</name>

<t>IANA is requested to create the "PipeStream Status Codes" registry. Status codes are 4-bit values (0x0-0xF). Values 0xD-0xE are reserved for Expert Review. Value 0xF is reserved for private use.</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Layer</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0x0</c>
      <c>UNSPECIFIED</c>
      <c>-</c>
      <c>Default / heartbeat</c>
      <c>0x1</c>
      <c>PENDING</c>
      <c>0</c>
      <c>Entity announced</c>
      <c>0x2</c>
      <c>PROCESSING</c>
      <c>0</c>
      <c>In progress</c>
      <c>0x3</c>
      <c>COMPLETE</c>
      <c>0</c>
      <c>Success</c>
      <c>0x4</c>
      <c>FAILED</c>
      <c>0</c>
      <c>Failed</c>
      <c>0x5</c>
      <c>CHECKPOINT</c>
      <c>0</c>
      <c>Barrier</c>
      <c>0x6</c>
      <c>DEHYDRATING</c>
      <c>0</c>
      <c>Dehydrating into children</c>
      <c>0x7</c>
      <c>REHYDRATING</c>
      <c>0</c>
      <c>Rehydrating children</c>
      <c>0x8</c>
      <c>YIELDED</c>
      <c>2</c>
      <c>Paused</c>
      <c>0x9</c>
      <c>DEFERRED</c>
      <c>2</c>
      <c>Claim check issued</c>
      <c>0xA</c>
      <c>RETRYING</c>
      <c>2</c>
      <c>Retry in progress</c>
      <c>0xB</c>
      <c>SKIPPED</c>
      <c>2</c>
      <c>Intentionally skipped</c>
      <c>0xC</c>
      <c>ABANDONED</c>
      <c>2</c>
      <c>Timed out</c>
</texttable>

</section>
<section anchor="pipestream-error-code-registry"><name>PipeStream Error Code Registry</name>

<t>IANA is requested to create the "PipeStream Error Codes" registry. Values in the range 0x00-0x3F are assigned by Expert Review. Values in the range 0x40-0xFF are reserved for private use.</t>

<t>PipeStream error codes are used as QUIC application error codes in CONNECTION_CLOSE and RESET_STREAM frames. When terminating a connection or aborting a stream due to a protocol-level error, the endpoint MUST use the corresponding PipeStream error code value as the QUIC Application Error Code.</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0x00</c>
      <c>PIPESTREAM_NO_ERROR</c>
      <c>Graceful shutdown</c>
      <c>0x01</c>
      <c>PIPESTREAM_INTERNAL_ERROR</c>
      <c>Implementation error</c>
      <c>0x02</c>
      <c>PIPESTREAM_IDLE_TIMEOUT</c>
      <c>Idle timeout</c>
      <c>0x03</c>
      <c>PIPESTREAM_CONTROL_RESET</c>
      <c>Control stream must reset</c>
      <c>0x04</c>
      <c>PIPESTREAM_INTEGRITY_ERROR</c>
      <c>Checksum failed</c>
      <c>0x05</c>
      <c>PIPESTREAM_ENTITY_INVALID</c>
      <c>Invalid format or state</c>
      <c>0x06</c>
      <c>PIPESTREAM_ENTITY_TOO_LARGE</c>
      <c>Size exceeded</c>
      <c>0x07</c>
      <c>PIPESTREAM_DEPTH_EXCEEDED</c>
      <c>Scope depth exceeded</c>
      <c>0x08</c>
      <c>PIPESTREAM_WINDOW_EXCEEDED</c>
      <c>Window full</c>
      <c>0x09</c>
      <c>PIPESTREAM_SCOPE_INVALID</c>
      <c>Invalid scope</c>
      <c>0x0A</c>
      <c>PIPESTREAM_CLAIM_EXPIRED</c>
      <c>Claim check expired</c>
      <c>0x0B</c>
      <c>PIPESTREAM_CLAIM_NOT_FOUND</c>
      <c>Claim check not found</c>
      <c>0x0C</c>
      <c>PIPESTREAM_LAYER_UNSUPPORTED</c>
      <c>Protocol layer not supported</c>
</texttable>

</section>
<section anchor="pipestream-serialization-format-registry"><name>PipeStream Serialization Format Registry</name>

<t>IANA is requested to create the "PipeStream Serialization Formats" registry. New entries require Expert Review <xref target="RFC8126"/>.</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0</c>
      <c>CBOR</c>
      <c>Concise Binary Object Representation</c>
      <c>RFC 8949, this document</c>
      <c>1</c>
      <c>PROTOBUF</c>
      <c>Protocol Buffers (see Appendix D)</c>
      <c>this document</c>
      <c>2-255</c>
      <c>Reserved</c>
      <c>Reserved for future use</c>
      <c>this document</c>
</texttable>

</section>
<section anchor="uri-scheme-registration"><name>URI Scheme Registration</name>

<t>This section registers the "pipestream" URI scheme per <xref target="RFC7595"/>. The URI scheme identifies application context for detached or resumable resources (for example, Layer 2 yield/claim-check flows). PipeStream Layer 0 streaming semantics do not depend on this URI scheme.</t>

<dl>
  <dt>Scheme name:</dt>
  <dd>
    <t>pipestream</t>
  </dd>
  <dt>Status:</dt>
  <dd>
    <t>Permanent</t>
  </dd>
  <dt>Applications/protocols that use this scheme:</dt>
  <dd>
    <t>PipeStream protocol (this document)</t>
  </dd>
  <dt>Contact:</dt>
  <dd>
    <t>Kristian Rickert (kristian.rickert@pipestream.ai)</t>
  </dd>
  <dt>Change controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
</dl>

<section anchor="uri-syntax"><name>URI Syntax</name>

<t>The URI syntax is defined using ABNF <xref target="RFC5234"/>:</t>

<figure type="ascii-art"><artwork><![CDATA[
pipestream-URI = "pipestream://" authority "/" session-id
                 [ "/" scope-path ] [ "/" entity-ref ]

session-id     = 1*( ALPHA / DIGIT / "-" )
scope-path     = scope-id *( "." scope-id )
scope-id       = 1*DIGIT
entity-ref     = 1*( ALPHA / DIGIT )
authority      = <authority, see RFC 3986, Section 3.2>
]]></artwork></figure>

<t>Examples:</t>

<t><list style="symbols">
  <t><spanx style="verb">pipestream://processor.example.com/a1b2c3d4</spanx></t>
  <t><spanx style="verb">pipestream://processor.example.com:8443/a1b2c3d4/1.42/e5f6</spanx></t>
</list></t>

</section>
</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>
<reference anchor="RFC9000">
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
    <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
    <date month="May" year="2021"/>
    <abstract>
      <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9000"/>
  <seriesInfo name="DOI" value="10.17487/RFC9000"/>
</reference>
<reference anchor="RFC8446">
  <front>
    <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <date month="August" year="2018"/>
    <abstract>
      <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
      <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8446"/>
  <seriesInfo name="DOI" value="10.17487/RFC8446"/>
</reference>
<reference anchor="RFC8126">
  <front>
    <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <author fullname="T. Narten" initials="T." surname="Narten"/>
    <date month="June" year="2017"/>
    <abstract>
      <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
      <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
      <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="26"/>
  <seriesInfo name="RFC" value="8126"/>
  <seriesInfo name="DOI" value="10.17487/RFC8126"/>
</reference>
<reference anchor="RFC8949">
  <front>
    <title>Concise Binary Object Representation (CBOR)</title>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
    <date month="December" year="2020"/>
    <abstract>
      <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
      <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="94"/>
  <seriesInfo name="RFC" value="8949"/>
  <seriesInfo name="DOI" value="10.17487/RFC8949"/>
</reference>
<reference anchor="RFC8610">
  <front>
    <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
    <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
    <author fullname="C. Vigano" initials="C." surname="Vigano"/>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <date month="June" year="2019"/>
    <abstract>
      <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8610"/>
  <seriesInfo name="DOI" value="10.17487/RFC8610"/>
</reference>
<reference anchor="RFC5234">
  <front>
    <title>Augmented BNF for Syntax Specifications: ABNF</title>
    <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
    <author fullname="P. Overell" initials="P." surname="Overell"/>
    <date month="January" year="2008"/>
    <abstract>
      <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="68"/>
  <seriesInfo name="RFC" value="5234"/>
  <seriesInfo name="DOI" value="10.17487/RFC5234"/>
</reference>
<reference anchor="RFC7595">
  <front>
    <title>Guidelines and Registration Procedures for URI Schemes</title>
    <author fullname="D. Thaler" initials="D." role="editor" surname="Thaler"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <author fullname="T. Hardie" initials="T." surname="Hardie"/>
    <date month="June" year="2015"/>
    <abstract>
      <t>This document updates the guidelines and recommendations, as well as the IANA registration processes, for the definition of Uniform Resource Identifier (URI) schemes. It obsoletes RFC 4395.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="35"/>
  <seriesInfo name="RFC" value="7595"/>
  <seriesInfo name="DOI" value="10.17487/RFC7595"/>
</reference>
<reference anchor="RFC7301">
  <front>
    <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
    <author fullname="S. Friedl" initials="S." surname="Friedl"/>
    <author fullname="A. Popov" initials="A." surname="Popov"/>
    <author fullname="A. Langley" initials="A." surname="Langley"/>
    <author fullname="E. Stephan" initials="E." surname="Stephan"/>
    <date month="July" year="2014"/>
    <abstract>
      <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7301"/>
  <seriesInfo name="DOI" value="10.17487/RFC7301"/>
</reference>

<reference anchor="FIPS-180-4" >
  <front>
    <title>Secure Hash Standard (SHS)</title>
    <author >
      <organization>National Institute of Standards and Technology</organization>
    </author>
    <date year="2015" month="August"/>
  </front>
  <seriesInfo name="FIPS" value="PUB 180-4"/>
</reference>


    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC9114">
  <front>
    <title>HTTP/3</title>
    <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9114"/>
  <seriesInfo name="DOI" value="10.17487/RFC9114"/>
</reference>
<reference anchor="RFC9297">
  <front>
    <title>HTTP Datagrams and the Capsule Protocol</title>
    <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
    <author fullname="L. Pardue" initials="L." surname="Pardue"/>
    <date month="August" year="2022"/>
    <abstract>
      <t>This document describes HTTP Datagrams, a convention for conveying multiplexed, potentially unreliable datagrams inside an HTTP connection.</t>
      <t>In HTTP/3, HTTP Datagrams can be sent unreliably using the QUIC DATAGRAM extension. When the QUIC DATAGRAM frame is unavailable or undesirable, HTTP Datagrams can be sent using the Capsule Protocol, which is a more general convention for conveying data in HTTP connections.</t>
      <t>HTTP Datagrams and the Capsule Protocol are intended for use by HTTP extensions, not applications.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9297"/>
  <seriesInfo name="DOI" value="10.17487/RFC9297"/>
</reference>
<reference anchor="RFC9308">
  <front>
    <title>Applicability of the QUIC Transport Protocol</title>
    <author fullname="M. Kühlewind" initials="M." surname="Kühlewind"/>
    <author fullname="B. Trammell" initials="B." surname="Trammell"/>
    <date month="September" year="2022"/>
    <abstract>
      <t>This document discusses the applicability of the QUIC transport protocol, focusing on caveats impacting application protocol development and deployment over QUIC. Its intended audience is designers of application protocol mappings to QUIC and implementors of these application protocols.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9308"/>
  <seriesInfo name="DOI" value="10.17487/RFC9308"/>
</reference>
<reference anchor="RFC9250">
  <front>
    <title>DNS over Dedicated QUIC Connections</title>
    <author fullname="C. Huitema" initials="C." surname="Huitema"/>
    <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
    <author fullname="A. Mankin" initials="A." surname="Mankin"/>
    <date month="May" year="2022"/>
    <abstract>
      <t>This document describes the use of QUIC to provide transport confidentiality for DNS. The encryption provided by QUIC has similar properties to those provided by TLS, while QUIC transport eliminates the head-of-line blocking issues inherent with TCP and provides more efficient packet-loss recovery than UDP. DNS over QUIC (DoQ) has privacy properties similar to DNS over TLS (DoT) specified in RFC 7858, and latency characteristics similar to classic DNS over UDP. This specification describes the use of DoQ as a general-purpose transport for DNS and includes the use of DoQ for stub to recursive, recursive to authoritative, and zone transfer scenarios.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9250"/>
  <seriesInfo name="DOI" value="10.17487/RFC9250"/>
</reference>
<reference anchor="RFC9260">
  <front>
    <title>Stream Control Transmission Protocol</title>
    <author fullname="R. Stewart" initials="R." surname="Stewart"/>
    <author fullname="M. Tüxen" initials="M." surname="Tüxen"/>
    <author fullname="K. Nielsen" initials="K." surname="Nielsen"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>This document describes the Stream Control Transmission Protocol (SCTP) and obsoletes RFC 4960. It incorporates the specification of the chunk flags registry from RFC 6096 and the specification of the I bit of DATA chunks from RFC 7053. Therefore, RFCs 6096 and 7053 are also obsoleted by this document. In addition, RFCs 4460 and 8540, which describe errata for SCTP, are obsoleted by this document.</t>
      <t>SCTP was originally designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks. It is also suited to be used for other applications, for example, WebRTC.</t>
      <t>SCTP is a reliable transport protocol operating on top of a connectionless packet network, such as IP. It offers the following services to its users:</t>
      <t>The design of SCTP includes appropriate congestion avoidance behavior and resistance to flooding and masquerade attacks.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9260"/>
  <seriesInfo name="DOI" value="10.17487/RFC9260"/>
</reference>
<reference anchor="RFC7574">
  <front>
    <title>Peer-to-Peer Streaming Peer Protocol (PPSPP)</title>
    <author fullname="A. Bakker" initials="A." surname="Bakker"/>
    <author fullname="R. Petrocco" initials="R." surname="Petrocco"/>
    <author fullname="V. Grishchenko" initials="V." surname="Grishchenko"/>
    <date month="July" year="2015"/>
    <abstract>
      <t>The Peer-to-Peer Streaming Peer Protocol (PPSPP) is a protocol for disseminating the same content to a group of interested parties in a streaming fashion. PPSPP supports streaming of both prerecorded (on- demand) and live audio/video content. It is based on the peer-to- peer paradigm, where clients consuming the content are put on equal footing with the servers initially providing the content, to create a system where everyone can potentially provide upload bandwidth. It has been designed to provide short time-till-playback for the end user and to prevent disruption of the streams by malicious peers. PPSPP has also been designed to be flexible and extensible. It can use different mechanisms to optimize peer uploading, prevent freeriding, and work with different peer discovery schemes (centralized trackers or Distributed Hash Tables). It supports multiple methods for content integrity protection and chunk addressing. Designed as a generic protocol that can run on top of various transport protocols, it currently runs on top of UDP using Low Extra Delay Background Transport (LEDBAT) for congestion control.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7574"/>
  <seriesInfo name="DOI" value="10.17487/RFC7574"/>
</reference>
<reference anchor="RFC7696">
  <front>
    <title>Guidelines for Cryptographic Algorithm Agility and Selecting Mandatory-to-Implement Algorithms</title>
    <author fullname="R. Housley" initials="R." surname="Housley"/>
    <date month="November" year="2015"/>
    <abstract>
      <t>Many IETF protocols use cryptographic algorithms to provide confidentiality, integrity, authentication, or digital signature. Communicating peers must support a common set of cryptographic algorithms for these mechanisms to work properly. This memo provides guidelines to ensure that protocols have the ability to migrate from one mandatory-to-implement algorithm suite to another over time.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="201"/>
  <seriesInfo name="RFC" value="7696"/>
  <seriesInfo name="DOI" value="10.17487/RFC7696"/>
</reference>

<reference anchor="MOQT" target="https://datatracker.ietf.org/doc/draft-ietf-moq-transport/">
  <front>
    <title>Media over QUIC Transport</title>
    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization></organization>
    </author>
    <author initials="K." surname="Pugin" fullname="Kirill Pugin">
      <organization></organization>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization></organization>
    </author>
    <author initials="V." surname="Vasiliev" fullname="Victor Vasiliev">
      <organization></organization>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett">
      <organization></organization>
    </author>
    <date year="2025"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-16"/>
</reference>
<reference anchor="scatter-gather" >
  <front>
    <title>The Scatter-Gather Design Pattern</title>
    <author initials="D." surname="Lea" fullname="Doug Lea">
      <organization></organization>
    </author>
    <date year="1996"/>
  </front>
  <seriesInfo name="DOI" value="10.1007/978-1-4612-1260-6"/>
</reference>


    </references>

</references>


<?line 1461?>

<section anchor="appendix-a-protocol-layer-capability-matrix"><name>Appendix A: Protocol Layer Capability Matrix</name>

<texttable>
      <ttcol align='left'>Feature</ttcol>
      <ttcol align='left'>Layer 0</ttcol>
      <ttcol align='left'>Layer 1</ttcol>
      <ttcol align='left'>Layer 2</ttcol>
      <c>Unified status frame (128-bit base)</c>
      <c>X</c>
      <c>X</c>
      <c>X</c>
      <c>Entity streaming</c>
      <c>X</c>
      <c>X</c>
      <c>X</c>
      <c>PENDING/PROCESSING/COMPLETE/FAILED</c>
      <c>X</c>
      <c>X</c>
      <c>X</c>
      <c>DEHYDRATING/REHYDRATING</c>
      <c>X</c>
      <c>X</c>
      <c>X</c>
      <c>Checkpoint blocking</c>
      <c>X</c>
      <c>X</c>
      <c>X</c>
      <c>Assembly Manifest</c>
      <c>X</c>
      <c>X</c>
      <c>X</c>
      <c>Cursor-based ID recycling</c>
      <c>X</c>
      <c>X</c>
      <c>X</c>
      <c>Scoped status fields (Scope ID, depth)</c>
      <c>&#160;</c>
      <c>X</c>
      <c>X</c>
      <c>Hierarchical scopes</c>
      <c>&#160;</c>
      <c>X</c>
      <c>X</c>
      <c>Scope digest (Merkle)</c>
      <c>&#160;</c>
      <c>X</c>
      <c>X</c>
      <c>Barrier (subtree sync)</c>
      <c>&#160;</c>
      <c>X</c>
      <c>X</c>
      <c>YIELDED status</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>X</c>
      <c>DEFERRED status</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>X</c>
      <c>Claim checks</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>X</c>
      <c>Completion policies</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>X</c>
      <c>SKIPPED/ABANDONED statuses</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>X</c>
</texttable>

</section>
<section anchor="appendix-b-relationship-to-existing-protocols"><name>Appendix B: Relationship to Existing Protocols</name>

<t>This appendix discusses the relationship between PipeStream and existing transport and application protocols. The intent is to clarify the design rationale for specifying a new application protocol directly over QUIC <xref target="RFC9000"/> rather than layering on HTTP/3 <xref target="RFC9114"/>, gRPC, or WebTransport <xref target="RFC9297"/>.</t>

<section anchor="quic-as-application-transport"><name>QUIC as Application Transport</name>

<t>RFC 9308 <xref target="RFC9308"/> provides guidance for designers of application protocol mappings to QUIC. PipeStream follows this guidance: stream semantics are mapped to the protocol's data model (Section 4), flow control operates at both the stream and connection level, and an ALPN token is registered for protocol identification (Section 11).</t>

<t>The precedent for application protocols that bypass HTTP and map directly onto QUIC is well established. DNS over Dedicated QUIC Connections <xref target="RFC9250"/> adopts a direct mapping on the grounds that HTTP framing introduces unnecessary overhead when the application has its own message semantics. The Media over QUIC Transport protocol <xref target="MOQT"/> similarly defines its own framing and control messages over QUIC streams, with HTTP/3 as an optional encapsulation rather than a requirement.</t>

<t>PipeStream's requirements align with these precedents. The protocol's dual-stream architecture (Section 4), bit-packed control frames (Section 6), and recursive entity lifecycle (Section 9) have no counterpart in HTTP semantics, and mapping them onto request-response pairs would add complexity without benefit.</t>

</section>
<section anchor="efficiency-considerations"><name>Efficiency Considerations</name>

<t>The decision to implement PipeStream as a standalone protocol over QUIC is driven by the following efficiency requirements:</t>

<section anchor="framing-overhead"><name>Framing Overhead</name>

<t>HTTP/3 and gRPC introduce multiple layers of framing. A gRPC message over HTTP/3 incurs QUIC stream overhead, HTTP/3 DATA frame overhead (minimum 2 octets), and gRPC envelope overhead (5 octets). For small status updates like PipeStream's 16-octet STATUS frame, this encapsulation would double the bandwidth requirement. PipeStream's bit-packed frames achieve near-theoretical minimum overhead for high-frequency coordination.</t>

</section>
<section anchor="stateless-control-plane"><name>Stateless Control Plane</name>

<t>HTTP/3 requires maintaining state for QPACK header compression. In high-concurrency environments where a single node manages thousands of sessions, the memory overhead of these contexts is significant. PipeStream status frames are stateless and self-describing; a receiver can parse any frame without reference to previous frames, enabling low-latency processing and easier load balancing across redundant nodes.</t>

</section>
<section anchor="stream-independence"><name>Stream Independence</name>

<t>gRPC bidirectional streaming is constrained by the lifecycle of a single RPC call. While multiple entities can be multiplexed into one RPC, this reintroduces head-of-line blocking at the application layer if one entity requires retransmission. Alternatively, opening a new RPC for every entity (which could number in the millions for large document sets) incurs substantial setup and teardown overhead. PipeStream treats each entity as an independent QUIC stream, ensuring maximum parallelism and optimal use of QUIC's loss recovery mechanisms.</t>

</section>
</section>
<section anchor="http3"><name>HTTP/3</name>

<t>HTTP/3 <xref target="RFC9114"/> provides multiplexed request-response exchanges over QUIC. Its stream model binds each client-initiated request to a server response on the same stream. PipeStream requires bidirectional, peer-initiated entity streams where either endpoint may open new streams to transmit sub-entities arising from recursive decomposition. The request-response constraint precludes this.</t>

<t>PipeStream also requires a persistent control stream carrying compact, fixed-size status frames at high frequency. HTTP/3 does define unidirectional control streams, but their framing is specific to HTTP semantics (SETTINGS, GOAWAY, MAX_PUSH_ID) and cannot be repurposed for application-level status coordination without introducing a parallel signaling mechanism that duplicates much of what QUIC already provides.</t>

</section>
<section anchor="grpc"><name>gRPC</name>

<t>gRPC defines a remote procedure call framework over HTTP/2, with experimental support for HTTP/3. Bidirectional streaming in gRPC is scoped to a single RPC method: one request stream and one response stream per call. PipeStream requires an arbitrary number of concurrent entity streams with independent flow control, plus a dedicated control stream, all within a single connection. Achieving this over gRPC would require either multiplexing all entities onto a single bidirectional RPC (sacrificing per-stream flow control and head-of-line independence) or opening a separate RPC per entity (sacrificing session-level coordination and incurring per-call overhead).</t>

<t>gRPC further mandates a 5-octet length-prefixed framing envelope for every message. PipeStream's fixed-size control frames are bit-packed at the wire level with zero serialization overhead, which is material at the status update frequencies the protocol is designed to sustain.</t>

</section>
<section anchor="webtransport"><name>WebTransport</name>

<t>WebTransport <xref target="RFC9297"/> provides bidirectional streams and unreliable datagrams over HTTP/3, and is the closest existing protocol to the transport abstraction PipeStream requires. However, several properties make it unsuitable as a substrate:</t>

<t>WebTransport sessions are established via an HTTP/3 CONNECT request, inheriting the client-server asymmetry of HTTP. In PipeStream, both endpoints participate symmetrically in capability negotiation and may initiate entity streams; the protocol does not distinguish a "client" role from a "server" role after the handshake.</t>

<t>WebTransport is designed for environments constrained by the web security model (origin-based isolation, CORS). PipeStream targets server-to-server processing pipelines where these constraints are inapplicable.</t>

<t>WebTransport provides raw byte streams with no built-in coordination semantics. PipeStream would need to implement its own framing, status state machine, checkpoint barriers, and scope hierarchy on top of WebTransport streams. At that point, the HTTP/3 session layer introduces an additional round trip during establishment and per-stream framing overhead, with no corresponding benefit.</t>

</section>
<section anchor="summary"><name>Summary</name>

<t>PipeStream occupies a design point not addressed by existing protocols: a QUIC-native application protocol combining multiplexed entity streaming, recursive decomposition with hierarchical scopes, Merkle-based integrity propagation, and barrier-synchronized reassembly. While existing protocols like SCTP <xref target="RFC9260"/> and PPSPP <xref target="RFC7574"/> address subsets of these requirements, none provide the integrated lifecycle and coordination semantics that PipeStream defines.</t>

</section>
</section>
<section anchor="appendix-c-schema-reference-cddl"><name>Appendix C: Schema Reference (CDDL)</name>

<t>This appendix consolidates the normative CDDL <xref target="RFC8610"/> schema definitions for all PipeStream messages. These definitions are authoritative for the wire format when CBOR <xref target="RFC8949"/> is the negotiated serialization format (the default). Individual definitions also appear inline throughout the specification body.</t>

<t>An informational Protocol Buffers equivalent is provided in Appendix D for implementations that negotiate Protobuf encoding.</t>

<figure><sourcecode type="cddl"><![CDATA[
; -----------------------------------------------------------
; Integer size convention
; -----------------------------------------------------------
; CDDL "uint" is an unbounded unsigned integer. When
; encoded in CBOR, the encoder MUST use the smallest
; CBOR major-type-0 encoding that fits the value.
; The following aliases document the wire-format field
; widths used in fixed-size frames; they do not constrain
; the CBOR encoding but record the maximum value each
; field may carry.
;
;   uint32  values 0..4294967295     (Entity ID, Scope ID)
;   uint64  values 0..2^64-1         (counters, timestamps)
;
; For variable-length serialized messages (CBOR), the
; natural uint encoding applies and receivers MUST accept
; any valid CBOR unsigned integer.
; -----------------------------------------------------------

; -----------------------------------------------------------
; Serialization format negotiation
; -----------------------------------------------------------

serialization-format = &(
  cbor: 0,
  protobuf: 1,
)

; -----------------------------------------------------------
; Capabilities (exchanged during CONNECT on Stream 0)
; -----------------------------------------------------------

capabilities = {
  layer0-core: bool,
  layer1-recursive: bool,
  layer2-resilience: bool,
  ? max-scope-depth: uint .le 7,
  ? max-entities-per-scope: uint,
  ? max-window-size: uint,
  ? serialization-format: serialization-format,
  ? keepalive-timeout-ms: uint,   ; Default: 30000 (30s)
}

; -----------------------------------------------------------
; Entity header (prefixes each entity on Entity Streams)
; -----------------------------------------------------------

entity-header = {
  entity-id: uint,                ; 32-bit on wire (STATUS frame)
  ? parent-id: uint,              ; 32-bit scope-local
  ? scope-id: uint,               ; 32-bit (Section 6.2.1)
  layer: uint .le 3,              ; Data layer 0-3
  ? content-type: tstr,
  payload-length: uint,           ; Payload byte count
  ? checksum: bstr .size 32,      ; SHA-256; SHOULD be present
  ? metadata: { * tstr => tstr },
  ? chunk-info: chunk-info,
  ? completion-policy: completion-policy,  ; Layer 2
}

chunk-info = {
  total-chunks: uint,
  chunk-index: uint,
  chunk-offset: uint,
}

; -----------------------------------------------------------
; Completion policy (Layer 2)
; -----------------------------------------------------------

completion-policy = {
  ? mode: completion-mode,
  ? max-retries: uint,
  ? retry-delay-ms: uint,
  ? timeout-ms: uint,
  ? min-success-ratio: float32,
  ? on-timeout: failure-action,
  ? on-failure: failure-action,
}

completion-mode = &(
  unspecified: 0,
  strict: 1,
  lenient: 2,
  best-effort: 3,
  quorum: 4,
)

failure-action = &(
  unspecified: 0,
  fail: 1,
  skip: 2,
  retry: 3,
  defer: 4,
)

; -----------------------------------------------------------
; Checkpoint frame (Type 0x81)
; -----------------------------------------------------------

checkpoint-frame = {
  checkpoint-id: tstr,
  sequence-number: uint,
  checkpoint-entity-id: uint,
  ? scope-id: uint,
  ? flags: uint,
  ? timeout-ms: uint,
}

; -----------------------------------------------------------
; Status frame
; -----------------------------------------------------------

status-frame = {
  entity-id: uint,
  ? scope-id: uint,
  status: entity-status,
  ? extended-data: any,
}

entity-status = &(
  unspecified: 0,
  pending: 1,
  processing: 2,
  complete: 3,
  failed: 4,
  checkpoint: 5,
  dehydrating: 6,
  rehydrating: 7,
  yielded: 8,
  deferred: 9,
  retrying: 10,
  skipped: 11,
  abandoned: 12,
)

; -----------------------------------------------------------
; Assembly Manifest entry
; -----------------------------------------------------------

assembly-manifest-entry = {
  parent-id: uint,
  ? scope-id: uint,
  children-ids: [* uint],
  ? children-status: [* entity-status],
  ? policy: completion-policy,
  ? created-at: uint,
  ? state: resolution-state,
}

resolution-state = &(
  unspecified: 0,
  active: 1,
  resolved: 2,
  partial: 3,
  failed: 4,
)

; -----------------------------------------------------------
; Yield token (Layer 2)
; -----------------------------------------------------------

yield-token = {
  reason: yield-reason,
  ? continuation-state: bstr,
  ? validation: stopping-point-validation,
}

yield-reason = &(
  unspecified: 0,
  external-call: 1,
  rate-limited: 2,
  awaiting-sibling: 3,
  awaiting-approval: 4,
  resource-busy: 5,
)

; -----------------------------------------------------------
; Claim check (Layer 2)
; -----------------------------------------------------------

claim-check = {
  claim-id: uint,
  entity-id: uint,
  ? scope-id: uint,
  expiry-timestamp: uint,
  ? validation: stopping-point-validation,
}

; -----------------------------------------------------------
; Stopping point validation (Layer 2)
; -----------------------------------------------------------

stopping-point-validation = {
  ? state-checksum: bstr,
  ? bytes-processed: uint,
  ? children-complete: uint,
  ? children-total: uint,
  ? is-resumable: bool,
  ? checkpoint-ref: tstr,
}

; -----------------------------------------------------------
; Scope digest (Layer 1)
; -----------------------------------------------------------

scope-digest = {
  scope-id: uint,
  entities-processed: uint,
  entities-succeeded: uint,
  entities-failed: uint,
  entities-deferred: uint,
  merkle-root: bstr .size 32,
}

; -----------------------------------------------------------
; Document envelope
; -----------------------------------------------------------

pipe-doc = {
  doc-id: tstr,
  entity-id: uint,
  ? ownership: ownership-context,
}

ownership-context = {
  owner-id: tstr,
  ? group-id: tstr,
  ? scopes: [* tstr],
}

; -----------------------------------------------------------
; File storage reference
; -----------------------------------------------------------

file-storage-reference = {
  provider: tstr,
  bucket: tstr,
  key: tstr,
  ? region: tstr,
  ? attrs: { * tstr => tstr },
  ? encryption: encryption-metadata,
}

encryption-metadata = {
  algorithm: tstr,
  ? key-provider: tstr,
  ? key-id: tstr,
  ? wrapped-key: bstr,
  ? iv: bstr,
  ? context: { * tstr => tstr },
}
]]></sourcecode></figure>

</section>
<section anchor="appendix-d-schema-reference-protocol-buffers"><name>Appendix D: Schema Reference (Protocol Buffers)</name>

<t>This appendix provides an informational Protocol Buffers schema equivalent for PipeStream messages. The normative schema definitions use CDDL notation and appear throughout the specification body and in Appendix C. Implementations that negotiate Protobuf as the serialization format (Section 3.5) MAY use these definitions. The canonical Protobuf source files are maintained in the repository at <spanx style="verb">proto/</spanx>.</t>

<section anchor="protocol-level-messages"><name>Protocol-Level Messages</name>

<figure><sourcecode type="protobuf"><![CDATA[
// Copyright 2026 PipeStream AI
//
// PipeStream Protocol - IETF draft protocol for recursive
// entity streaming over QUIC. Defines the wire-format
// messages for Layers 0-2 of the PipeStream architecture:
// core streaming, recursive scoping, and resilience.
//
// Edition 2023 is used for closed enums (critical for wire-protocol
// safety) and implicit field presence (distinguishing "not set" from
// zero values). In this edition, all fields have explicit presence
// by default, making the 'optional' keyword unnecessary.

edition = "2023";

package pipestream.protocol.v1;

import "google/protobuf/any.proto";

// All enums in this file are CLOSED. Unknown enum values received on
// the wire MUST be rejected. This is essential because status codes
// are encoded as 4-bit values in the status frame wire format;
// accepting unknown values could cause undefined behavior in state
// machines and cursor advancement.
option features.enum_type = CLOSED;

// SerializationFormat specifies the encoding for variable-
// length control messages (0x80-0xFF) and entity headers.
enum SerializationFormat {
  SERIALIZATION_FORMAT_CBOR = 0;
  SERIALIZATION_FORMAT_PROTOBUF = 1;
}

// Capabilities describes the feature set supported by a PipeStream
// endpoint. Exchanged during the CONNECT handshake so that both
// sides can negotiate which protocol layers and resource limits
// apply to the session.
message Capabilities {
  // Whether the endpoint supports Layer 0 (core entity streaming).
  bool layer0_core = 1;

  // Whether the endpoint supports Layer 1 (recursive scoping and
  // dehydration).
  bool layer1_recursive = 2;

  // Whether the endpoint supports Layer 2 (resilience, yield, and
  // claim-check). Requires Layer 1 support; if layer1_recursive is
  // false, this MUST be false.
  bool layer2_resilience = 3;

  // Maximum nesting depth allowed for recursive scopes.
  // Default is 7 (8 levels: 0-7).
  uint32 max_scope_depth = 4;

  // Maximum number of entities permitted within a single scope.
  uint32 max_entities_per_scope = 5;

  // Maximum flow-control window size, in number of in-flight
  // entities. Default is 2,147,483,648 (2^31).
  uint32 max_window_size = 6;

  // Serialization format (default: CBOR).
  SerializationFormat serialization_format = 7;
}

// EntityHeader is sent at the beginning of each entity stream to
// describe the payload that follows. It carries identity, lineage,
// content metadata, chunking information, and the completion policy
// that governs how partial failures of this entity's children are
// handled.
message EntityHeader {
  // Scope-local entity identifier.
  uint32 entity_id = 1;

  // Identifier of the parent entity.
  uint32 parent_id = 2;

  // Identifier of the scope.
  uint32 scope_id = 3;

  // Data layer (0-3).
  uint32 layer = 4;

  // MIME content type.
  string content_type = 5;

  // Length in bytes of the complete entity payload, before any
  // chunking.
  uint64 payload_length = 6;

  // SHA-256 integrity checksum.
  bytes checksum = 7;

  // Arbitrary metadata.
  map<string, string> metadata = 8;

  // Chunking information.
  ChunkInfo chunk_info = 9;

  // Resilience completion policy.
  CompletionPolicy completion_policy = 10;
}

// ChunkInfo describes how a payload is divided into chunks.
message ChunkInfo {
  // Total number of chunks.
  uint32 total_chunks = 1;

  // Zero-based chunk index.
  uint32 chunk_index = 2;

  // Byte offset within the complete payload.
  uint64 chunk_offset = 3;
}

// CompletionPolicy controls Layer 2 resilience behavior.
message CompletionPolicy {
  // Mode for evaluating completion.
  CompletionMode mode = 1;

  // Maximum retry attempts.
  uint32 max_retries = 2;

  // Delay between retries in milliseconds.
  uint32 retry_delay_ms = 3;

  // Maximum wait time in milliseconds.
  uint32 timeout_ms = 4;

  // Minimum success ratio for QUORUM mode.
  float min_success_ratio = 5;

  // Action on timeout.
  FailureAction on_timeout = 6;

  // Action on failure.
  FailureAction on_failure = 7;
}

// CompletionMode specifies completion evaluation strategies.
enum CompletionMode {
  COMPLETION_MODE_UNSPECIFIED = 0;
  COMPLETION_MODE_STRICT = 1;
  COMPLETION_MODE_LENIENT = 2;
  COMPLETION_MODE_BEST_EFFORT = 3;
  COMPLETION_MODE_QUORUM = 4;
}

// FailureAction specifies error handling behaviors.
enum FailureAction {
  FAILURE_ACTION_UNSPECIFIED = 0;
  FAILURE_ACTION_FAIL = 1;
  FAILURE_ACTION_SKIP = 2;
  FAILURE_ACTION_RETRY = 3;
  FAILURE_ACTION_DEFER = 4;
}

// EntityStatus represents the lifecycle state of an entity.
enum EntityStatus {
  ENTITY_STATUS_UNSPECIFIED = 0;
  ENTITY_STATUS_PENDING = 1;
  ENTITY_STATUS_PROCESSING = 2;
  ENTITY_STATUS_COMPLETE = 3;
  ENTITY_STATUS_FAILED = 4;
  ENTITY_STATUS_CHECKPOINT = 5;
  ENTITY_STATUS_DEHYDRATING = 6;
  ENTITY_STATUS_REHYDRATING = 7;
  ENTITY_STATUS_YIELDED = 8;
  ENTITY_STATUS_DEFERRED = 9;
  ENTITY_STATUS_RETRYING = 10;
  ENTITY_STATUS_SKIPPED = 11;
  ENTITY_STATUS_ABANDONED = 12;
}

// StatusFrame represents a status transition.
message StatusFrame {
  // Identifier of the entity.
  uint32 entity_id = 1;

  // Identifier of the scope.
  uint32 scope_id = 2;

  // Current status.
  EntityStatus status = 3;

  // Optional extension data.
  google.protobuf.Any extended_data = 4;
}

// CheckpointFrame (Type 0x81)
message CheckpointFrame {
  // Unique checkpoint identifier.
  string checkpoint_id = 1;

  // Monotonic sequence number.
  uint64 sequence_number = 2;

  // Numeric ordering key for barrier evaluation.
  uint32 checkpoint_entity_id = 3;

  // Scope to which this checkpoint applies.
  uint32 scope_id = 4;

  // Checkpoint flags.
  uint32 flags = 5;

  // Maximum wait time in milliseconds.
  uint32 timeout_ms = 6;
}

// AssemblyManifestEntry tracks parent-child relationships.
message AssemblyManifestEntry {
  // Identifier of the parent entity.
  uint32 parent_id = 1;

  // Scope identifier.
  uint32 scope_id = 2;

  // Ordered child identifiers.
  repeated uint32 children_ids = 3;

  // Current status of each child.
  repeated EntityStatus children_status = 4;

  // Governing completion policy.
  CompletionPolicy policy = 5;

  // Creation timestamp (Unix epoch microseconds).
  uint64 created_at = 6;

  // Current resolution state.
  ResolutionState state = 7;
}

// ResolutionState tracks Assembly Manifest completion.
enum ResolutionState {
  RESOLUTION_STATE_UNSPECIFIED = 0;
  RESOLUTION_STATE_ACTIVE = 1;
  RESOLUTION_STATE_RESOLVED = 2;
  RESOLUTION_STATE_PARTIAL = 3;
  RESOLUTION_STATE_FAILED = 4;
}

// YieldToken captures continuation state for paused entities.
message YieldToken {
  // Reason for yielding.
  YieldReason reason = 1;

  // Opaque continuation state.
  bytes continuation_state = 2;

  // Validation data for resumption.
  StoppingPointValidation validation = 3;
}

// YieldReason describes why processing was yielded.
enum YieldReason {
  YIELD_REASON_UNSPECIFIED = 0;
  YIELD_REASON_EXTERNAL_CALL = 1;
  YIELD_REASON_RATE_LIMITED = 2;
  YIELD_REASON_AWAITING_SIBLING = 3;
  YIELD_REASON_AWAITING_APPROVAL = 4;
  YIELD_REASON_RESOURCE_BUSY = 5;
}

// ClaimCheck is a Layer 2 deferred-processing reference.
message ClaimCheck {
  // Unique claim identifier.
  uint64 claim_id = 1;

  // Identifier of the deferred entity.
  uint32 entity_id = 2;

  // Scope identifier.
  uint32 scope_id = 3;

  // Expiry timestamp (Unix epoch microseconds).
  uint64 expiry_timestamp = 4;

  // Validation data.
  StoppingPointValidation validation = 5;
}

// StoppingPointValidation captures a snapshot of progress.
message StoppingPointValidation {
  // Hash of internal state.
  bytes state_checksum = 1;

  // Payload bytes consumed.
  uint64 bytes_processed = 2;

  // Completed child count.
  uint32 children_complete = 3;

  // Total expected child count.
  uint32 children_total = 4;

  // Resumption capability flag.
  bool is_resumable = 5;

  // Last passed checkpoint reference.
  string checkpoint_ref = 6;
}

// ScopeDigest is a Layer 1 summary of a completed scope.
message ScopeDigest {
  // Identifier of the scope.
  uint32 scope_id = 1;

  // Total processed count.
  uint64 entities_processed = 2;

  // Total succeeded count.
  uint64 entities_succeeded = 3;

  // Total failed count.
  uint64 entities_failed = 4;

  // Total deferred count.
  uint64 entities_deferred = 5;

  // Merkle root hash.
  bytes merkle_root = 6;
}

// PipeDoc represents the top-level document envelope for an entity.
message PipeDoc {
  // Unique document identifier.
  string doc_id = 1;

  // Identifier of the entity.
  uint32 entity_id = 2;

  // Ownership and access context.
  OwnershipContext ownership = 3;
}

// OwnershipContext defines multi-tenancy and access control for
// entities.
message OwnershipContext {
  // Entity owner identifier.
  string owner_id = 1;

  // Group identifier.
  string group_id = 2;

  // List of access scopes.
  repeated string scopes = 3;
}

// FileStorageReference provides a location for external data.
message FileStorageReference {
  // Storage provider identifier.
  string provider = 1;

  // Bucket or container name.
  string bucket = 2;

  // Object key or path.
  string key = 3;

  // Optional region hint.
  string region = 4;

  // Provider-specific attributes.
  map<string, string> attrs = 5;

  // Encryption metadata.
  EncryptionMetadata encryption = 6;
}

// EncryptionMetadata defines encryption parameters.
message EncryptionMetadata {
  // Encryption algorithm.
  string algorithm = 1;

  // Key provider identifier.
  string key_provider = 2;

  // Encryption key identifier.
  string key_id = 3;

  // Optional wrapped DEK.
  bytes wrapped_key = 4;

  // Initialization vector.
  bytes iv = 5;

  // Additional encryption context.
  map<string, string> context = 6;
}
]]></sourcecode></figure>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
P6RXJynvjwEA

-->

</rfc>

