<?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.39 (Ruby 3.3.8) -->


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

]>


<rfc ipr="trust200902" docName="draft-krickert-pipestream-03" 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="July" day="23"/>

    <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 99?>

<t>This document specifies PipeStream, a recursive scatter-gather streaming
protocol for hierarchical task decomposition and distributed processing
over QUIC transport. PipeStream enables the decomposition (scattering)
of complex, arbitrary workloads into constituent sub-tasks, their
transmission across distributed processing nodes, and subsequent
rehydration (gathering) at destination endpoints.</t>

<t>While application-layer protocols like gRPC provide stream multiplexing,
PipeStream embeds a hierarchical state machine directly into the
protocol. It employs a dual-stream architecture consisting of a data
stream for payload transmission and a control stream for tracking
completion status and maintaining distributed consistency.</t>

<t>PipeStream defines a generic 2-bit Data Layer field for entity
representation, leaving the concrete payload semantics to application
profiles. To ensure consistency across parallel processing pipelines,
the protocol implements checkpoint blocking, guaranteeing that all
constituent parts of a decomposed workload 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 121?>

<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 inputs 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 inputs to collections of millions of entries</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>

<t>These pipelines also increasingly span organizational and vendor boundaries: a processing stage operated by one party must interoperate with stages operated by others. Today that interoperability is achieved through per-vendor SDKs and bespoke coordination logic, because no standardized wire protocol expresses the decomposition, tracking, and reassembly semantics these systems share. PipeStream specifies that wire protocol.</t>

<section anchor="the-limits-of-existing-transport-and-rpc-mechanisms"><name>The Limits of Existing Transport and RPC Mechanisms</name>

<t>Existing multiplexed RPC frameworks (for example, gRPC over HTTP/2 or
HTTP/3) and raw transport APIs (for example, WebTransport) excel at
point-to-point data streaming. However, they lack native mechanisms for
distributed consistency when workloads are hierarchically decomposed.</t>

<t>In a standard streaming RPC model, an application must manually track
state if a primary task spawns tens of thousands of distributed
sub-tasks. PipeStream solves this by pushing the scatter-gather state
machine down to the protocol level. Through the use of cryptographic
Scope Digests (Section 6.3) and Barrier Frames (Section 6.4), PipeStream
provides native barrier synchronization semantics, ensuring a parent
stream cannot logically terminate until all scattered child entities
across distributed nodes have reached a terminal status.</t>

<t>Broker-based pipeline architectures (distributed commit logs and
message queues) address a related problem by decoupling stages through
intermediary persistence, but they externalize exactly the semantics
PipeStream makes native: determining whether a hierarchically
decomposed job has fully completed requires an external coordination
store, and end-to-end integrity verification is left to the
application. Appendix B compares PipeStream to these and other
existing protocols in detail.</t>

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

<t>PipeStream is a domain-neutral recursive streaming protocol. Its design
has been validated against distributed document processing, but it is
equally 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>PipeStream uniquely bridges true streaming and request-response
processing models. Layer 0 streaming is optimal when processing nodes
have low-latency interconnects and can process entities incrementally.
Layer 2 yield/resume and claim checks handle workflows that require
external service calls, rate limiting, human approval gates, or
cross-session resumption. This dual nature allows a single protocol to
serve both real-time streaming pipelines and complex multi-stage
workflows with heterogeneous latency characteristics.</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 transport-level layer
field and recursive processing semantics but leaves concrete payload
meaning to application profile 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 input or a constituent part of a decomposed input. Each Entity possesses a unique identifier within its processing scope and carries payload data tagged with a transport-level layer value. Entities are immutable once created; transformations produce new Entities rather than modifying existing ones. An input enters the pipeline as a single root Entity and MAY be decomposed into multiple Entities during processing; it 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 root entities to contain parts, and parts to contain sub-tasks, 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 an 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 complete unit) 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. 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>An Entity that exists as a complete, stored unit 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>An input that has been decomposed into multiple in-flight Entities being processed in parallel across distributed nodes. An input 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>A transport-level 2-bit field carried in the Entity Header that identifies the payload representation. The concrete meaning of each layer value is defined by an application profile rather than by the core protocol.</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 entities or terminal entities 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 + 4-octet length prefix)</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 (root -&gt; component -&gt; sub-task -&gt; leaf)</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.4.2).</t>

<figure><sourcecode type="cddl"><![CDATA[
serialization-format = uint .le 255
                       ; Value from the PipeStream Serialization
                       ; Formats registry (Section 11.5).
                       ; This document defines only CBOR (0).

capabilities = {
  layer0-core: bool,               ; MUST be 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,292
                                   ; (Section 9.1)
  ? max-window-size: uint,         ; Default: 2,147,483,646
                                   ; (Max in-flight entities;
                                   ; see Section 9.1)
  ? 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>

<t>The <spanx style="verb">layer0-core</spanx> field MUST be true; an endpoint that receives a
Capabilities message with <spanx style="verb">layer0-core</spanx> set to false MUST close the
connection with PIPESTREAM_LAYER_UNSUPPORTED (0x0C). The
<spanx style="verb">max-entities-per-scope</spanx> and <spanx style="verb">max-window-size</spanx> values are bounded by
the Entity ID space constraints defined in Section 9.1; an endpoint
MUST NOT advertise values exceeding those bounds.</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.</t>

<t>This document defines a single serialization format: CBOR <xref target="RFC8949"/>, value 0 in the PipeStream Serialization Formats registry (Section 11.5). All PipeStream implementations MUST support CBOR. The <spanx style="verb">serialization-format</spanx> capability field and its registry exist to permit future specifications to define additional formats; any such specification MUST normatively define the encoding of every serialized message in this document.</t>

<t>Negotiation proceeds as follows:</t>

<t><list style="numbers" type="1">
  <t>CBOR <xref target="RFC8949"/> is the default and MUST be supported by all endpoints.</t>
  <t>Each peer advertises its preferred <spanx style="verb">serialization-format</spanx> in its Capabilities message.</t>
  <t>If both peers advertise the same format and both support it, that format is used.</t>
  <t>If preferences differ, if either peer omits the field, or if a peer advertises a value the other does not recognize, the peers MUST fall back to CBOR <xref target="RFC8949"/>.</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_FRAME_ERROR (0x0D).</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>

<t>This section is descriptive; the normative requirements that realize
these goals appear in Sections 5 through 9.</t>

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

<t>PipeStream enables entities to be transmitted and processed incrementally as they become available. The framing and status mechanisms operate on individual entities rather than complete inputs, so a sender never needs to buffer a complete input before initiating transmission.</t>

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

<t>The protocol supports 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 provides checkpoint blocking semantics (Section 9.3) 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 maintains strict separation between the control plane (the Control Stream) and the data plane (Entity Streams).</t>

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

<t>PipeStream is defined directly 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 carries a 2-bit data layer field supporting four distinct
data representation layers whose concrete semantics are defined by
application profiles:</t>

<texttable>
      <ttcol align='left'>Layer</ttcol>
      <ttcol align='left'>Conventional Role</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0</c>
      <c>Raw input</c>
      <c>Binary or originating payload bytes</c>
      <c>1</c>
      <c>Enriched intermediate</c>
      <c>Annotated or partially processed payload</c>
      <c>2</c>
      <c>Structured result</c>
      <c>Normalized or extracted output</c>
      <c>3</c>
      <c>Extension</c>
      <c>Application-specific payload semantics</c>
</texttable>

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

<t>PipeStream uses a dual-plane architecture within a single QUIC connection. The endpoint that initiates the QUIC connection is the client. Either endpoint MAY originate entities (Section 5.2); in many deployments the client acts as producer and the server as consumer, but the protocol does not require this asymmetry after connection establishment.</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 (client-initiated)</c>
      <c>Control</c>
      <c>STATUS, SCOPE_DIGEST, BARRIER, GOAWAY, CAPABILITIES, CHECKPOINT</c>
      <c>Entity Streams</c>
      <c>Unidirectional (either endpoint)</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 frame payloads are 16 octets base (21 octets on wire including the 5-octet UCF header). 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>Length</c>
      <c>16</c>
      <c>STATUS payload length with no cursor or extension</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 of the pipestream URI scheme (Section 11.6) 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"><name>Entity Streams</name>

<t>Entity Streams carry entity payload data using the Entity Frame format defined in Section 6.8.</t>

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

<t>Each Entity Stream is a QUIC unidirectional stream. Either endpoint MAY open Entity Streams once the initial Capabilities exchange (Section 3.4) has completed. Per <xref target="RFC9000"/>, client-initiated unidirectional streams carry Stream IDs 2, 6, 10, and so on, and server-initiated unidirectional streams carry Stream IDs 3, 7, 11, and so on.</t>

<t>Endpoints MUST NOT open bidirectional streams other than Stream 0. An endpoint that receives a bidirectional stream other than Stream 0 MUST treat this as a connection error of type PIPESTREAM_FRAME_ERROR (0x0D).</t>

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

<t>Each Entity Stream carries exactly one Entity Frame (Section 6.8): a Header Length prefix, a serialized EntityHeader, and the payload octets. The following rules apply:</t>

<t><list style="numbers" type="1">
  <t>The sender MUST close the stream (QUIC FIN) immediately after the final payload octet. The end of the stream delimits the payload.</t>
  <t>When the EntityHeader includes a <spanx style="verb">payload-length</spanx> field, the receiver MUST verify that the number of payload octets received before the FIN equals that value. A mismatch MUST be treated as a stream error of type PIPESTREAM_ENTITY_INVALID (0x05).</t>
  <t>A sender that abandons transmission of an entity SHOULD abort the stream with RESET_STREAM carrying an appropriate PipeStream error code; the receiver MUST discard any partial payload data (see Section 5.5).</t>
  <t>A receiver that no longer requires an entity MAY send STOP_SENDING on the corresponding Entity Stream.</t>
  <t>Additional data received on an Entity Stream after a complete Entity Frame MUST be treated as a stream error of type PIPESTREAM_FRAME_ERROR (0x0D).</t>
</list></t>

</section>
</section>
<section anchor="prohibition-of-0-rtt-early-data"><name>Prohibition of 0-RTT Early Data</name>

<t>QUIC permits applications to send data in 0-RTT early data before the TLS handshake completes; such data is replayable by an attacker. PipeStream capability negotiation establishes per-connection state whose replay could alter negotiated limits or serialization formats.</t>

<t>Endpoints MUST NOT send PipeStream frames in 0-RTT early data, and a server MUST NOT process PipeStream frames received in early data before the QUIC handshake is confirmed. A future extension may define 0-RTT semantics along with the required replay protections.</t>

</section>
<section anchor="performance-considerations"><name>Performance Considerations</name>

<section anchor="entity-granularity-and-stream-overhead"><name>Entity Granularity and Stream Overhead</name>

<t>PipeStream's "one entity per stream" model (Section 5.2) provides clean multiplexing and flow control but introduces per-stream overhead (QUIC STREAM frame headers and internal stack state).</t>

<t><list style="numbers" type="1">
  <t><strong>Small Payloads:</strong> For workloads consisting of many small entities (e.g., &lt;1 KiB), the per-stream overhead may become significant. Implementations SHOULD avoid excessive fragmentation and prefer coarser entity granularity where possible.</t>
  <t><strong>Aggregation:</strong> Application profiles MAY define mechanisms for bundling multiple small logical units into a single PipeStream entity to reduce transport-layer overhead.</t>
  <t><strong>Stream Limits:</strong> Senders MUST respect the peer's QUIC <spanx style="verb">initial_max_streams_uni</spanx> and <spanx style="verb">MAX_STREAMS</spanx> limits. High-frequency entity producers SHOULD monitor stream credit availability and adjust dehydration rates accordingly to avoid stalling the pipeline.</t>
</list></t>

</section>
<section anchor="control-stream-priority"><name>Control Stream Priority</name>

<t>Implementations SHOULD assign the Control Stream (Stream 0) a higher priority than Entity Streams. Timely delivery of STATUS and SCOPE_DIGEST frames is critical for advancing the cursor and releasing backpressure (Section 9.1).</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 status (<spanx style="verb">FAILED</spanx> when terminal, <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 handled by local failure policy, typically by marking them <spanx style="verb">FAILED</spanx> or <spanx style="verb">ABANDONED</spanx>.</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 ensure forward compatibility and consistent parsing, all messages on the Control Stream use a Unified Control Frame (UCF) structure with an explicit length prefix.</t>

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

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

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>Type</c>
      <c>1 octet</c>
      <c>Frame Type identifier</c>
      <c>Length</c>
      <c>4 octets</c>
      <c>Total length of the frame payload (excluding Type/Length)</c>
      <c>Payload</c>
      <c>variable</c>
      <c>Frame-specific data</c>
</texttable>

<t>This structure allows any implementation to skip an unknown frame type by reading its length and discarding the payload.</t>

<t>For frame types with a fixed or computable payload layout defined by this specification, the Length field MUST equal the length implied by that layout (for STATUS frames, the base payload plus any cursor update and extension; see Section 6.2.2). A receiver that detects a Length value inconsistent with the frame's type-specific layout MUST close the connection with PIPESTREAM_FRAME_ERROR (0x0D).</t>

<t>Although the Length field can express values up to 2^32 - 1, implementations SHOULD enforce a locally configured maximum control frame size and MAY treat frames exceeding it as a connection error of type PIPESTREAM_FRAME_ERROR (0x0D). See also the incremental allocation requirement in Section 10.3.</t>

<t>For compactness, the fixed-frame diagrams below show the frame payload that follows the common UCF header. On the wire, each Stream 0 frame is encoded as <spanx style="verb">Type (1 octet) | Length (4 octets) | Payload</spanx>.</t>

</section>
<section anchor="frame-types"><name>Frame Types</name>

<t>The following frame types are defined by this document. All frames use the common UCF header:</t>

<texttable>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Layer</ttcol>
      <ttcol align='left'>Payload Format</ttcol>
      <c>0x50</c>
      <c>STATUS</c>
      <c>0</c>
      <c>Fixed 16-octet payload, with optional cursor and extension payloads</c>
      <c>0x54</c>
      <c>SCOPE_DIGEST</c>
      <c>1</c>
      <c>Fixed 72-octet payload</c>
      <c>0x55</c>
      <c>BARRIER</c>
      <c>1</c>
      <c>Fixed 12-octet payload</c>
      <c>0x56</c>
      <c>GOAWAY</c>
      <c>0</c>
      <c>Fixed 8-octet payload</c>
      <c>0x80</c>
      <c>CAPABILITIES</c>
      <c>0</c>
      <c>Serialized message payload (negotiated format)</c>
      <c>0x81</c>
      <c>CHECKPOINT</c>
      <c>0</c>
      <c>Serialized message payload (negotiated format)</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 payload reports lifecycle transitions for entities. The payload 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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | Ver(4) |Stat(4)|E|C|D(3) |           Flags (19 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.6.1) 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.4).</t>
  </dd>
  <dt>D (3 bits):</dt>
  <dd>
    <t>Explicit scope nesting depth (0-7). 0=Root. Layer 1.</t>
  </dd>
  <dt>Flags (19 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 workloads.</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 payload is 16 octets (21 octets on the wire including the UCF header). When C=1, a 4-octet cursor value follows (20-octet payload, 25 octets on the wire). 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 anchor="status-reporting-direction"><name>Status Reporting Direction</name>

<t>STATUS frames flow in both directions on Stream 0. For each entity, responsibility for status reporting is divided between the originating endpoint (the endpoint that assigned the Entity ID and transmits the entity) and the processing endpoint (the endpoint that receives the corresponding Entity Stream):</t>

<t><list style="numbers" type="1">
  <t>The originating endpoint MAY announce an entity with a PENDING status frame before opening its Entity Stream.</t>
  <t>Once the Entity Stream has been opened, the processing endpoint is authoritative for the entity's lifecycle and emits the STATUS frames for subsequent transitions (PROCESSING, DEHYDRATING, REHYDRATING, COMPLETE, FAILED, and the Layer 2 statuses).</t>
  <t>The originating endpoint applies terminal statuses (typically FAILED or ABANDONED) on its own authority only as part of transport error handling (Section 5.5) or local failure policy, for example when the Entity Stream is reset or the connection is lost before a terminal report arrives.</t>
  <t>The originating endpoint advances its cursor based on observed terminal statuses and announces cursor advancement using the C flag (Section 6.2.4).</t>
</list></t>

<t>If an endpoint receives a STATUS frame for an entity from a peer that is not authoritative for that transition under these rules, the frame MUST be validated against the state machine of Section 6.2.3; conflicting reports are resolved in favor of the processing endpoint.</t>

</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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Flags (8)      |        Reserved (24)                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       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.5).</t>
  </dd>
</dl>

<t>The SCOPE_DIGEST payload is 72 octets (77 octets on the wire including the UCF header). 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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |S|  Reserved (31 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 (31 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>

<t>The BARRIER payload is 12 octets (17 octets on the wire including the UCF header).</t>

</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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           Reserved (32 bits)                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                   Last Entity ID (32 bits)                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<dl>
  <dt>Reserved (32 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>

<t>The GOAWAY payload is 8 octets (13 octets on the wire including the UCF header).</t>

<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, where "increase" is evaluated using the circular ordering function <spanx style="verb">is_before</spanx> defined in Section 9.3.</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 Extension Length is zero, extends beyond the end of the frame as delimited by the UCF Length field, or is missing, the receiver MUST treat the frame as malformed and close the connection with PIPESTREAM_FRAME_ERROR (0x0D).</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.6.2.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>

<t>For a Yield Extension, the Extension Length (Section 6.6.1) MUST equal 4 + Token Length. A mismatch MUST be treated as PIPESTREAM_FRAME_ERROR (0x0D).</t>

<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="serialized-message-frames-0x80-0xff"><name>Serialized Message Frames (0x80-0xFF)</name>

<t>These frame types use the common UCF header defined in Section 6.1. The payload body is encoded using the serialization format negotiated during capability exchange (Section 3.4.2). 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 entity payload 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.8.2).</t>
  </dd>
  <dt>Payload (variable):</dt>
  <dd>
    <t>The raw entity data. The payload extends to the end of the Entity Stream (QUIC FIN); see Section 5.2. When the <spanx style="verb">payload-length</spanx> field is present in the EntityHeader, it MUST equal the number of payload octets.</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; Appendix C consolidates the complete schema.</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,        ; Octet count of the payload
                                 ; carried in this frame; SHOULD be
                                 ; present. Omitted only when the
                                 ; final length is unknown at
                                 ; header-emission time (the stream
                                 ; FIN delimits the payload).
  ? 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 enumerates the status codes of Section 6.2.2;
; the full definition appears in Appendix C.

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 anchor="chunked-transfer"><name>Chunked Transfer</name>

<t>An entity whose payload is too large to transmit conveniently as a single frame MAY be split into chunks. Each chunk is transmitted as its own Entity Frame on its own Entity Stream, subject to the following rules:</t>

<t><list style="numbers" type="1">
  <t>Every chunk of an entity MUST carry the same <spanx style="verb">entity-id</spanx>, <spanx style="verb">parent-id</spanx> (if present), <spanx style="verb">scope-id</spanx> (if present), and <spanx style="verb">layer</spanx> values, and MUST include a <spanx style="verb">chunk-info</spanx> structure.</t>
  <t>The <spanx style="verb">payload-length</spanx> and <spanx style="verb">checksum</spanx> fields in a chunk's EntityHeader, when present, cover only that chunk's payload octets (see Section 10.2 for whole-entity integrity requirements).</t>
  <t><spanx style="verb">chunk-offset</spanx> is the octet offset of the chunk's first payload octet within the complete entity payload. <spanx style="verb">total-chunks</spanx> MUST be identical across all chunks of an entity, and the <spanx style="verb">chunk-index</spanx> values MUST cover the range 0 to total-chunks - 1 with no duplicates.</t>
  <t>Chunks MAY be transmitted concurrently on separate Entity Streams and MAY arrive in any order. The receiver reassembles the payload by <spanx style="verb">chunk-offset</spanx>.</t>
  <t>The entity payload is complete when all <spanx style="verb">total-chunks</spanx> chunks have been received and the reassembled ranges are contiguous and non-overlapping. Overlapping or duplicated ranges MUST be treated as PIPESTREAM_ENTITY_INVALID (0x05).</t>
  <t>Lifecycle status for a chunked entity is reported once for the entity as a whole (Section 6.2), not per chunk.</t>
</list></t>

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

<t>This section describes the payload model visible to the core protocol.
PipeStream distinguishes between the wire-level Entity Header carried on
Entity Streams and any application-level envelope that may be embedded
within the payload bytes.</t>

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

<t>The normative wire-level Entity Header is defined in Section 6.8.2. It
provides transport-level identification and routing metadata, including
<spanx style="verb">entity-id</spanx>, <spanx style="verb">parent-id</spanx>, <spanx style="verb">scope-id</spanx>, <spanx style="verb">layer</spanx>, <spanx style="verb">payload-length</spanx>, and
optional integrity metadata. The core protocol interprets these fields
for stream processing, flow control, and recursive coordination, but it
does not define application-specific payload structure.</t>

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

<t>PipeStream defines a 2-bit Data Layer field (values 0-3) in the Entity
Header that identifies the payload encoding class. The semantics of each
layer value are defined by Application Profile specifications. The core
protocol does not assign meaning to specific layer values; it ensures
that the layer field is faithfully transmitted and that receivers can
route entities to appropriate handlers based on layer.</t>

<t>Application Profiles SHOULD define at most four data layers. Common
patterns include:</t>

<texttable>
      <ttcol align='left'>Layer</ttcol>
      <ttcol align='left'>Conventional Meaning</ttcol>
      <ttcol align='left'>Purpose</ttcol>
      <c>0</c>
      <c>Raw or binary payload</c>
      <c>Unprocessed input</c>
      <c>1</c>
      <c>Annotated or enriched payload</c>
      <c>Intermediate processing artifacts</c>
      <c>2</c>
      <c>Structured or normalized payload</c>
      <c>Final extracted or transformed output</c>
      <c>3</c>
      <c>Application-specific extension</c>
      <c>Domain extension point</c>
</texttable>

<t>This layering enables pipeline stages to progressively transform
entities from raw input to structured output while maintaining type
distinction through the layer field.</t>

</section>
<section anchor="application-level-envelope"><name>Application-Level Envelope</name>

<t>The Entity Header (Section 6.8.2) provides transport-level
identification (<spanx style="verb">entity-id</spanx>, <spanx style="verb">scope-id</spanx>, and <spanx style="verb">layer</spanx>). Applications that
require additional identification, such as a stable input
identifier that persists across pipeline runs, multi-tenancy context, or
domain-specific metadata, SHOULD define an application-level envelope
message carried within the entity payload.</t>

<t>If an application-level envelope carries its own entity identifier, that
identifier MUST match the <spanx style="verb">entity-id</spanx> in the enclosing Entity Header.
The definition of application-level envelopes is outside the scope of
this specification. See <xref target="PIPESTREAM-DOCPROC"></xref> for an example companion
profile that defines such an envelope for document-processing workloads.</t>

</section>
<section anchor="common-storage-references"><name>Common Storage References</name>

<t>PipeStream defines a common storage reference type for entities that
refer to externally stored data. Application Profiles are not required
to use this type but SHOULD prefer it over ad hoc storage reference
formats to improve interoperability between pipeline stages from
different implementations.</t>

<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>Decomposition: dehydrate a root entity into sub-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 by an application-defined sink</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.4.2). 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 decomposition by dehydrating an input entity
into one or more sub-entities. When Layer 2 is negotiated, the sender
MAY attach a completion policy that governs how partial success,
timeouts, or retries are handled during recursive processing.</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>

<t>The SINK action represents terminal consumption of processed entities.
Sink implementations are application-specific and are defined by
Application Profile specifications. Common sink patterns include
persistent storage, search engine indexing, event notification, and
downstream service delivery.</t>

</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. All circular arithmetic in this document is performed modulo 0xFFFFFFFD; this modulus excludes the reserved values at the top of the 32-bit space from circulation. The following Entity ID values are reserved and MUST NOT be assigned to entities:</t>

<texttable>
      <ttcol align='left'>Entity ID</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Purpose</ttcol>
      <c>0x00000000</c>
      <c>NULL_ENTITY</c>
      <c>Reserved; skipped during assignment</c>
      <c>0xFFFFFFFD-0xFFFFFFFE</c>
      <c>Reserved</c>
      <c>Outside the circular ID space</c>
      <c>0xFFFFFFFF</c>
      <c>CONNECTION_LEVEL</c>
      <c>Connection-scoped signals such as heartbeats (Section 5.1.4)</c>
</texttable>

<t>Assignable Entity IDs therefore range from 0x00000001 to 0xFFFFFFFC, yielding 4,294,967,292 usable identifiers per scope.</t>

<t>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>The <spanx style="verb">max_window</spanx> value MUST NOT exceed 2,147,483,646 (the largest value strictly less than 0xFFFFFFFD / 2). This bound guarantees that the circular comparison function <spanx style="verb">is_before</spanx> (Section 9.3) is unambiguous for any pair of in-flight Entity IDs. The default <spanx style="verb">max-window-size</spanx> advertised in the capabilities exchange (Section 3.4) is 2,147,483,646.</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 (see the state transition table in Section 6.2) 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.7 / 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 sent and all entities in the scope have reached terminal state).</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 and all entities within the scope have reached terminal state), the Scope ID MAY be reused for a new scope. Implementations MUST ensure that no in-flight status frames reference a recycled Scope ID before reuse.</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 ascending numeric Entity ID value, 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 entity's terminal <spanx style="verb">Stat</spanx> code (Section 6.2.2) and the upper 4 bits are zero.</t>
    </list></t>
  <t>Compute each leaf hash as <spanx style="verb">SHA-256(0x00 || leaf)</spanx>, where <spanx style="verb">leaf</spanx> is the 5-octet value from step 1.</t>
  <t>Build a binary Merkle tree by repeatedly hashing pairs of sibling nodes: <spanx style="verb">SHA-256(0x01 || 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>The 0x00 and 0x01 domain-separation prefixes distinguish leaf hashes from interior-node hashes, preventing second-preimage attacks in which an interior node is presented as a leaf (or vice versa). This construction follows the approach used for Merkle Tree Hashes in Certificate Transparency.</t>

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

<t>Because each Entity ID contributes exactly one leaf, an implementation MUST NOT recycle an Entity ID within a scope whose SCOPE_DIGEST has not yet been computed. Cursor-based recycling (Section 9.1) already guarantees this when scopes complete before the ID space wraps; implementations whose scopes approach the ID-space capacity MUST close and digest the scope before reusing any of its Entity IDs.</t>

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

<t>Implementations MUST track Assembly Manifest resolution order using a local data structure that can efficiently identify the next parent entity eligible for rehydration as child statuses arrive out of order.</t>

<t>The specific algorithm and internal representation are implementation choices and are outside the scope of this specification.</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>

<t>PipeStream frames MUST NOT be sent or processed in 0-RTT early data (Section 5.3), which removes the replay exposure that early data would otherwise introduce for capability negotiation and status frames.</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.8.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.5). 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,292</c>
      <c>Memory bounds (Section 9.1)</c>
      <c>Max window size</c>
      <c>2,147,483,646</c>
      <c>Max in-flight entities (Section 9.1)</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.8.2) 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>: Application-level input identifiers and filenames carried inside profile-defined payload envelopes are not interpreted by PipeStream Core but may still be logged by intermediate processing nodes. Implementations SHOULD provide mechanisms to redact or pseudonymize such 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.6.2) 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.7) 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.6.3) 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>
  <t>Because the claim check identifier space is 64 bits, an online attacker with sufficient query volume could attempt to enumerate valid identifiers. Implementations SHOULD rate-limit claim redemption attempts per peer and SHOULD treat repeated redemption failures as a signal of probing.</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; guidance for the designated experts appears in Section 11.7.</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. All frames on Stream 0 MUST use a 4-octet length prefix following the 1-octet Type. The registry is partitioned into three ranges that determine both the registration policy and the framing class of the payload:</t>

<texttable>
      <ttcol align='left'>Range</ttcol>
      <ttcol align='left'>Framing Class</ttcol>
      <ttcol align='left'>Registration Policy</ttcol>
      <c>0x00-0x7F</c>
      <c>Fixed bit-packed payload (Section 6)</c>
      <c>Expert Review</c>
      <c>0x80-0xBF</c>
      <c>Serialized payload in the negotiated format (Section 6.7)</c>
      <c>Expert Review</c>
      <c>0xC0-0xFF</c>
      <c>Private use</c>
      <c>Not applicable</c>
</texttable>

<t>Each registration consists of a value, a frame type name, the minimum protocol layer, a short description, and a reference to a specification. The initial contents are:</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Frame Type Name</ttcol>
      <ttcol align='left'>Layer</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x50</c>
      <c>STATUS</c>
      <c>0</c>
      <c>Entity lifecycle status</c>
      <c>Section 6.2</c>
      <c>0x54</c>
      <c>SCOPE_DIGEST</c>
      <c>1</c>
      <c>Merkle completion summary</c>
      <c>Section 6.3</c>
      <c>0x55</c>
      <c>BARRIER</c>
      <c>1</c>
      <c>Subtree synchronization</c>
      <c>Section 6.4</c>
      <c>0x56</c>
      <c>GOAWAY</c>
      <c>0</c>
      <c>Graceful shutdown signal</c>
      <c>Section 6.5</c>
      <c>0x80</c>
      <c>CAPABILITIES</c>
      <c>0</c>
      <c>Negotiated limits/layers</c>
      <c>Section 3.4</c>
      <c>0x81</c>
      <c>CHECKPOINT</c>
      <c>0</c>
      <c>Global synchronization</c>
      <c>Section 9.3</c>
</texttable>

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

<t>Receivers that encounter a frame type that they do not recognize MUST skip the frame by reading and discarding the number of octets indicated by the 4-octet length prefix. This mechanism ensures that future protocol extensions can be introduced without breaking backward compatibility for older implementations.</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>
      <c>0x0D</c>
      <c>PIPESTREAM_FRAME_ERROR</c>
      <c>Malformed frame or improper stream usage</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"/>. A registration request MUST include a reference to a specification that normatively defines the encoding of every serialized PipeStream message (Section 3.4.2).</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-255</c>
      <c>Unassigned</c>
      <c>Available via Expert Review</c>
      <c>&#160;</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>Scheme syntax:</dt>
  <dd>
    <t>See Section 11.6.1.</t>
  </dd>
  <dt>Scheme semantics:</dt>
  <dd>
    <t>A pipestream URI identifies an application-level session context within a PipeStream deployment and, optionally, a scope path and an entity reference within that context. It is used to locate detached or resumable resources, such as Layer 2 claim checks, potentially across transport connections. The authority component identifies the endpoint that issued the resource.</t>
  </dd>
  <dt>Encoding considerations:</dt>
  <dd>
    <t>All components other than the authority are restricted to a subset of unreserved ASCII characters by the ABNF in Section 11.6.1. Percent-encoding is neither required nor permitted in those components. The authority component follows the syntax and encoding rules of <xref target="RFC3986"/>, Section 3.2.</t>
  </dd>
  <dt>Interoperability considerations:</dt>
  <dd>
    <t>None beyond those described in this document.</t>
  </dd>
  <dt>Security considerations:</dt>
  <dd>
    <t>See Section 10 of this document. A pipestream URI may embed session and claim identifiers that function as bearer capabilities; such URIs SHOULD be treated as sensitive and MUST NOT be exposed in logs or referral contexts where they could enable claim redemption by unauthorized parties.</t>
  </dd>
  <dt>Contact:</dt>
  <dd>
    <t>Kristian Rickert (kristian.rickert@pipestream.ai)</t>
  </dd>
  <dt>Change controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
  <dt>References:</dt>
  <dd>
    <t>This document</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 anchor="guidance-for-designated-experts"><name>Guidance for Designated Experts</name>

<t>For all registries defined in this section, the designated experts are advised to apply the following criteria when evaluating requests:</t>

<t><list style="numbers" type="1">
  <t>A permanent, readily available public specification of the proposed value is required and needs to define the value's semantics precisely enough for independent interoperable implementations.</t>
  <t>The proposed value must not conflict with, duplicate, or create ambiguity with existing registrations, including the framing class of frame types (fixed bit-packed versus serialized payload; Section 11.2).</t>
  <t>Requests should be evaluated for their effect on existing deployments; extensions that require behavior changes from unmodified endpoints are inappropriate for these registries and instead require a new protocol version (Section 3.4.1).</t>
  <t>Assignments from scarce code spaces (in particular the 4-bit status code space) should be granted conservatively; the expert may require demonstrated deployment interest before assigning values from a scarce space.</t>
</list></t>

</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="RFC3986">
  <front>
    <title>Uniform Resource Identifier (URI): Generic Syntax</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="L. Masinter" initials="L." surname="Masinter"/>
    <date month="January" year="2005"/>
    <abstract>
      <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="66"/>
  <seriesInfo name="RFC" value="3986"/>
  <seriesInfo name="DOI" value="10.17487/RFC3986"/>
</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="RFC7942">
  <front>
    <title>Improving Awareness of Running Code: The Implementation Status Section</title>
    <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
    <author fullname="A. Farrel" initials="A." surname="Farrel"/>
    <date month="July" year="2016"/>
    <abstract>
      <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
      <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="205"/>
  <seriesInfo name="RFC" value="7942"/>
  <seriesInfo name="DOI" value="10.17487/RFC7942"/>
</reference>

<reference anchor="PIPESTREAM-DOCPROC" target="https://github.com/ai-pipestream/pipestream-quic-protocol-rfc/tree/main/docproc">
  <front>
    <title>PipeStream Document Processing Profile</title>
    <author initials="K." surname="Rickert" fullname="Kristian Rickert">
      <organization></organization>
    </author>
    <date year="2026" month="March"/>
  </front>
</reference>


<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" target="https://www.rfc-editor.org/rfc/rfc9308">
  <front>
    <title>Applicability of the QUIC Transport Protocol</title>
    <author initials="M." surname="Kuehlewind" fullname="Mirja Kuehlewind">
      <organization></organization>
    </author>
    <author initials="B." surname="Trammell" fullname="Brian Trammell">
      <organization></organization>
    </author>
    <date year="2022" month="September"/>
  </front>
  <seriesInfo name="RFC" value="9308"/>
</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" target="https://www.rfc-editor.org/rfc/rfc9260">
  <front>
    <title>Stream Control Transmission Protocol</title>
    <author initials="R." surname="Stewart" fullname="Randall Stewart">
      <organization></organization>
    </author>
    <author initials="M." surname="Tuexen" fullname="Michael Tuexen">
      <organization></organization>
    </author>
    <author initials="K." surname="Nielsen" fullname="Kirsty Nielsen">
      <organization></organization>
    </author>
    <date year="2022" month="June"/>
  </front>
  <seriesInfo name="RFC" value="9260"/>
</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">
   <front>
      <title>Media over QUIC Transport</title>
      <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
         <organization>Cisco</organization>
      </author>
      <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
         <organization>Google</organization>
      </author>
      <author fullname="Ian Swett" initials="I." surname="Swett">
         <organization>Google</organization>
      </author>
      <author fullname="Alan Frindell" initials="A." surname="Frindell">
         <organization>Meta</organization>
      </author>
      <date day="6" month="July" year="2026"/>
      <abstract>
	 <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-19"/>
   
</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 1703?>

<section anchor="protocol-layer-capability-matrix"><name>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="relationship-to-existing-protocols"><name>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 21-octet on-wire STATUS frame, this encapsulation would still materially increase bandwidth requirements. PipeStream's bit-packed frames minimize coordination overhead for high-frequency control traffic.</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 input 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>Beyond the stream model mismatch, gRPC does not provide protocol-level primitives for recursive entity decomposition, checkpoint-based consistency across parallel processing paths, or hierarchical scope management with digest propagation. Building equivalent semantics on top of gRPC requires application-layer coordination logic that PipeStream provides natively as part of the protocol specification.</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>

<t>PipeStream complements rather than replaces gRPC: a PipeStream pipeline stage MAY internally use gRPC to communicate with processing services while relying on PipeStream for inter-stage coordination and consistency.</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="media-over-quic-transport"><name>Media over QUIC Transport</name>

<t>The Media over QUIC Transport protocol <xref target="MOQT"/> is architecturally the closest existing QUIC-native protocol to PipeStream: both use a bidirectional control stream for session coordination alongside unidirectional streams carrying independent data objects, following the application-mapping guidance of <xref target="RFC9308"/>.</t>

<t>The two protocols nevertheless solve different problems. MOQT is a publish/subscribe media delivery protocol optimized for fan-out through relays: objects within a track are delivered to a dynamic set of subscribers, delivery of any individual object may be abandoned when it ceases to be useful (for example, after a latency deadline passes), and no participant tracks whether the totality of published objects reached any subscriber. PipeStream is a scatter-gather processing protocol with the opposite requirements: the set of child entities produced by a decomposition is determinate, every entity MUST be driven to a terminal status, and reassembly is gated on cryptographically verifiable completion of the entire set (Section 9). MOQT has no counterpart to hierarchical scopes, scope digests, barrier synchronization, or completion policies, and PipeStream has no counterpart to tracks, subscriptions, or relay-based fan-out.</t>

<t>Extending MOQT with completion tracking would require adding precisely the control-plane machinery this document defines, while inheriting subscription semantics that have no role in pipeline processing.</t>

</section>
<section anchor="broker-based-pipeline-architectures"><name>Broker-Based Pipeline Architectures</name>

<t>Many production processing pipelines are built not on RPC frameworks but on message brokers and distributed commit logs, with stages communicating through persistent intermediary queues or topics. These architectures provide durable decoupling and replay, and PipeStream is not a replacement for them where store-and-forward durability between organizationally separate stages is the primary requirement.</t>

<t>However, broker-based architectures externalize the semantics that PipeStream provides natively. Completion of a hierarchically decomposed job must be tracked in a coordination store outside the message path; end-to-end integrity of a reassembled output must be verified by application logic; and backpressure operates per queue rather than end-to-end across a pipeline. Each stage boundary additionally imposes a full persist-and-forward cycle, which defeats incremental streaming of large entities. The broker itself is also an interoperability boundary: no standardized wire protocol expresses scatter-gather semantics across brokers from different vendors, so multi-organization pipelines are coupled through vendor-specific client libraries.</t>

<t>A PipeStream deployment MAY use a broker behind an individual processing stage (as it may use gRPC; see above) while relying on PipeStream for inter-stage transport, completion tracking, and integrity verification.</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="schema-reference-cddl"><name>Schema Reference (CDDL)</name>

<t>This appendix consolidates the normative CDDL <xref target="RFC8610"/> schema
definitions for PipeStream Core messages that use negotiated
serialization. These definitions are authoritative for the wire format
when CBOR <xref target="RFC8949"/> is the negotiated serialization format (the
default). Fixed control frames on Stream 0, such as STATUS and
SCOPE_DIGEST, use the bit-packed wire formats defined in Section 6 and
are not serialized as CDDL messages.</t>

<t>Application-specific payload envelopes and profile-specific schemas are
outside the scope of this appendix; see <xref target="PIPESTREAM-DOCPROC"></xref> for an
example companion profile that defines such messages.</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 = uint .le 255
                       ; Value from the PipeStream Serialization
                       ; Formats registry (Section 11.5).
                       ; This document defines only CBOR (0).

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

capabilities = {
  layer0-core: bool,              ; MUST be true
  layer1-recursive: bool,
  layer2-resilience: bool,
  ? max-scope-depth: uint .le 7,  ; Default: 7
  ? max-entities-per-scope: uint, ; Default: 4,294,967,292
  ? max-window-size: uint,        ; Default: 2,147,483,646
                                  ; (Section 9.1)
  ? 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,         ; Octet count of this frame's
                                  ; payload; SHOULD be present
                                  ; (Section 6.8.1)
  ? 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,
}

; -----------------------------------------------------------
; Entity status codes
; -----------------------------------------------------------

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,
}

; -----------------------------------------------------------
; 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="implementation-status"><name>Implementation Status</name>

<t>[[RFC Editor: please remove this entire appendix, and the reference to
<xref target="RFC7942"/>, before publication.]]</t>

<t>This appendix records the status of known implementations of the
protocol defined by this specification at the time of posting of this
Internet-Draft, following the process described in <xref target="RFC7942"/>. The
description of implementations in this appendix is intended to assist
the IETF in its decision processes in progressing drafts to RFCs.
Please note that the listing of any individual implementation here does
not imply endorsement by the IETF. Furthermore, no effort has been
spent to verify the information presented here that was supplied by
IETF contributors. This is not intended as, and must not be construed
to be, a catalog of available implementations or their features.
Readers are advised to note that other implementations may exist.</t>

<section anchor="reference-implementation"><name>Reference Implementation</name>

<dl>
  <dt>Organization:</dt>
  <dd>
    <t>PipeStream AI</t>
  </dd>
  <dt>Description:</dt>
  <dd>
    <t>Reference implementation of the PipeStream protocol.</t>
  </dd>
  <dt>Maturity:</dt>
  <dd>
    <t>Under development; not yet publicly released.</t>
  </dd>
  <dt>Coverage:</dt>
  <dd>
    <t>To be updated as development progresses.</t>
  </dd>
  <dt>Licensing:</dt>
  <dd>
    <t>To be determined.</t>
  </dd>
  <dt>Contact:</dt>
  <dd>
    <t>Kristian Rickert (kristian.rickert@pipestream.ai)</t>
  </dd>
</dl>

<t>The authors welcome reports of additional implementations for inclusion
in future revisions of this appendix.</t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
zBfZGqTBuU2axu3cveJ/ZUnbqmS+AQA=

-->

</rfc>

