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


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

]>


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

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

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

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

    <abstract>


<?line 54?>

<t>This document specifies PipeStream, a recursive entity streaming protocol designed for distributed document processing over QUIC transport. PipeStream enables the decomposition ("dehydration") of documents into constituent entities, their transmission across distributed processing nodes, and subsequent rehydration at destination endpoints.</t>

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

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

<t>To ensure consistency across distributed processing pipelines, PipeStream implements checkpoint blocking, whereby processing nodes MUST synchronize at defined points before proceeding. This mechanism guarantees that all constituent parts of a dehydrated document 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 64?>

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

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

<t>Distributed document processing pipelines face significant challenges when handling large, complex documents that require multiple stages of transformation, analysis, and enrichment. Traditional batch processing approaches require entire documents 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 document processing workflows increasingly demand the ability to:</t>

<t><list style="symbols">
  <t>Process documents 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 documents of arbitrary size without memory constraints</t>
  <t>Support recursive decomposition where document parts may themselves be decomposed</t>
  <t>Scale from single documents to collections of millions of documents</t>
</list></t>

<t>Current approaches based on batch processing and store-and-forward architectures are inefficient for large documents and fail to exploit the inherent parallelism available in distributed processing environments. Furthermore, existing streaming protocols do not provide the consistency semantics required for document processing where the integrity of the rehydrated output depends on the successful processing of all constituent parts.</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 documents as recursive compositions of entities. A document MAY be decomposed into multiple 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 document 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. A document is "dehydrated" (scattered) at the source into constituent entities, these entities are transmitted and processed in parallel across distributed pipeline stages, and finally the entities are "rehydrated" (gathered) at the destination to reconstitute the complete processed document. 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 document 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 document in memory.</t>
  <t><strong>Fault Isolation</strong>: Failures in processing individual entities can be detected, reported, and potentially retried without affecting other entities.</t>
  <t><strong>Consistency</strong>: The checkpoint blocking mechanism ensures that rehydration operations proceed only when all constituent parts have been successfully processed.</t>
</list></t>

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

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

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

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

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

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

</section>
</section>
<section anchor="terminology"><name>Terminology</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t><list style="symbols">
  <t>YIELDED status with continuation tokens</t>
  <t>DEFERRED status with claim checks</t>
  <t>RETRYING, SKIPPED, ABANDONED statuses</t>
  <t>Completion policies (STRICT, LENIENT, BEST_EFFORT, QUORUM)</t>
  <t>Claim check query/response frames</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>During CONNECT, endpoints exchange supported capabilities:</t>

<figure><sourcecode type="protobuf"><![CDATA[
message Capabilities {
  bool layer0_core = 1;           // Always true
  bool layer1_recursive = 2;      // Scoped IDs, digests
  bool layer2_resilience = 3;     // Yield, claim checks
  uint32 max_scope_depth = 4;     // Default: 7 (8 levels, 0-7)
  uint32 max_entities_per_scope = 5;  // Default: 4,294,967,294
                                      // (2^32-2)
  uint32 max_window_size = 6;     // Default: 2,147,483,648 (2^31)
}
]]></sourcecode></figure>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t><list style="numbers" type="1">
  <t><strong>Establishment:</strong> Client initiates QUIC connection with ALPN identifier "pipestream/1"</t>
  <t><strong>Capability Exchange:</strong> Client and server exchange supported protocol layers and limits</t>
  <t><strong>Control Stream Initialization:</strong> Client opens Stream 0 as bidirectional Control Stream</t>
  <t><strong>Entity Streaming:</strong> Entities are transmitted per Sections 5 and 6</t>
  <t><strong>Termination:</strong> Connection closes via QUIC CONNECTION_CLOSE or application-level shutdown</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.</t>
</list></t>

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

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

<t><list style="symbols">
  <t>The initial MAX_STREAM_DATA for Stream 0 SHOULD be at least 8192 octets.</t>
  <t>Implementations SHOULD NOT block Entity Stream transmission due to Control Stream flow control exhaustion.</t>
</list></t>

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

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

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

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

<t>When no status updates have been transmitted for KEEPALIVE_TIMEOUT (default: 30 seconds), 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; it MAY close the connection with PIPESTREAM_IDLE_TIMEOUT (0x02) when application-level inactivity policy requires it.</t>

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

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

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

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

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

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

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

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

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

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

<t>PipeStream error signaling on Stream 0 and QUIC transport signals are complementary. Endpoints SHOULD bridge them so peers receive both transport-level and protocol-level context.</t>

<t><list style="numbers" type="1">
  <t>If an Entity Stream is aborted with <spanx style="verb">RESET_STREAM</spanx> or <spanx style="verb">STOP_SENDING</spanx>, the endpoint SHOULD emit a corresponding terminal status (<spanx style="verb">FAILED</spanx>, <spanx style="verb">ABANDONED</spanx>, or policy-driven equivalent) for that entity on Stream 0.</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.</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>.</t>
  <t>On QUIC connection termination (<spanx style="verb">CONNECTION_CLOSE</spanx>), entities without a previously observed terminal status MUST be treated as failed by local policy.</t>
</list></t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>The Status Frame reports lifecycle transitions for entities.</t>

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

<dl>
  <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. Additional extension data follows (Section 6.5).</t>
  </dd>
  <dt>C (1 bit):</dt>
  <dd>
    <t>Cursor update flag. A 4-octet cursor value follows (Section 6.2.3).</t>
  </dd>
  <dt>D (3 bits):</dt>
  <dd>
    <t>Explicit scope nesting depth (0-7). 0=Root. Layer 1.</t>
  </dd>
  <dt>Flags (15 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 (16 bits):</dt>
  <dd>
    <t>Identifier for the scope to which this entity belongs.</t>
  </dd>
  <dt>Reserved (16 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>Protobuf default / heartbeat signal</c>
      <c>0x1</c>
      <c>PENDING</c>
      <c>0</c>
      <c>Entity announced, not yet transmitting</c>
      <c>0x2</c>
      <c>PROCESSING</c>
      <c>0</c>
      <c>Entity transmission in progress</c>
      <c>0x3</c>
      <c>COMPLETE</c>
      <c>0</c>
      <c>Entity successfully processed</c>
      <c>0x4</c>
      <c>FAILED</c>
      <c>0</c>
      <c>Entity processing failed</c>
      <c>0x5</c>
      <c>CHECKPOINT</c>
      <c>0</c>
      <c>Synchronization barrier</c>
      <c>0x6</c>
      <c>DEHYDRATING</c>
      <c>0</c>
      <c>Dehydrating into children</c>
      <c>0x7</c>
      <c>REHYDRATING</c>
      <c>0</c>
      <c>Rehydrating children</c>
      <c>0x8</c>
      <c>YIELDED</c>
      <c>2</c>
      <c>Paused with continuation token</c>
      <c>0x9</c>
      <c>DEFERRED</c>
      <c>2</c>
      <c>Detached with claim check</c>
      <c>0xA</c>
      <c>RETRYING</c>
      <c>2</c>
      <c>Retry in progress</c>
      <c>0xB</c>
      <c>SKIPPED</c>
      <c>2</c>
      <c>Intentionally skipped</c>
      <c>0xC</c>
      <c>ABANDONED</c>
      <c>2</c>
      <c>Timed out</c>
</texttable>

<t>The base STATUS frame is 12 octets. When C=1, a 4-octet cursor value follows (total 16 octets before any E=1 extension data). When E=1, additional extension bytes follow as defined in Section 6.5.</t>

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

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

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

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

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

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

<figure type="ascii-art"><artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Type (0x54)  |  Flags (8)      |        Scope ID (16)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                   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 (16 bits):</dt>
  <dd>
    <t>Identifier of the scope being summarized.</t>
  </dd>
  <dt>Entities Processed (64 bits):</dt>
  <dd>
    <t>The total number of entities that were processed within the scope.</t>
  </dd>
  <dt>Entities Succeeded (64 bits):</dt>
  <dd>
    <t>The number of entities that reached a terminal success state.</t>
  </dd>
  <dt>Entities Failed (64 bits):</dt>
  <dd>
    <t>The number of entities that reached a terminal failure state.</t>
  </dd>
  <dt>Entities Deferred (64 bits):</dt>
  <dd>
    <t>The number of entities that were deferred via claim checks.</t>
  </dd>
  <dt>Merkle Root (256 bits):</dt>
  <dd>
    <t>The SHA-256 Merkle root covering all entity statuses in the scope (see Section 9.4).</t>
  </dd>
</dl>

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

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

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

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

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

<t>When E=1 in a status frame, extension data follows. The length of extension data is determined by the Status code.</t>

<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 treat the frame as malformed and fail processing with PIPESTREAM_ENTITY_INVALID (0x05).</t>

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

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

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

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

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

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

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

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

</section>
</section>
<section anchor="protobuf-encoded-messages-0x80-0xff"><name>Protobuf-Encoded Messages (0x80-0xFF)</name>

<t>Messages in this range are preceded by a 4-octet length field.</t>

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

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

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

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

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

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

</section>
<section anchor="entity-header-protobuf"><name>Entity Header (Protobuf)</name>

<figure><sourcecode type="protobuf"><![CDATA[
message EntityHeader {
  uint32 entity_id = 1;         // Scope-local identifier
  uint32 parent_id = 2;         // 0 for root entities
  uint32 scope_id = 3;          // Layer 1: scope identifier
  uint32 layer = 4;             // Data layer (0-3)
  string content_type = 5;      // MIME type
  uint64 payload_length = 6;
  bytes checksum = 7;           // SHA-256 (32 bytes)
  map<string, string> metadata = 8;
  ChunkInfo chunk_info = 9;
  CompletionPolicy completion_policy = 10; // Layer 2: failure handling
}
]]></sourcecode></figure>

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

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

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

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

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

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

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

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

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

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

<figure><sourcecode type="protobuf"><![CDATA[
message FileStorageReference {
  string provider = 1;           // Storage provider identifier
  string bucket = 2;             // Bucket/container name
  string key = 3;                // Object key/path
  string region = 4;             // Optional region hint
  map<string, string> attrs = 5; // Provider-specific attributes
  EncryptionMetadata encryption = 6;
}

message EncryptionMetadata {
  string algorithm = 1;          // "AES-256-GCM", "AES-256-CBC"
  string key_provider = 2;       // "aws-kms", "azure-keyvault",
                                 // "gcp-kms", "vault"
  string key_id = 3;             // Key ARN/URI/ID
  bytes wrapped_key = 4;         // Optional: client-side encrypted DEK
  bytes iv = 5;                  // Initialization vector
  map<string, string> context = 6; // Encryption context
}
]]></sourcecode></figure>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<figure><sourcecode type="protobuf"><![CDATA[
message CompletionPolicy {
  CompletionMode mode = 1;
  uint32 max_retries = 2;        // Default: 3
  uint32 retry_delay_ms = 3;     // Default: 1000
  uint32 timeout_ms = 4;         // Default: 300000 (5 min)
  float min_success_ratio = 5;   // For QUORUM mode
  FailureAction on_timeout = 6;
  FailureAction on_failure = 7;
}

enum CompletionMode {
  COMPLETION_MODE_UNSPECIFIED = 0;  // Default; treat as STRICT
  COMPLETION_MODE_STRICT = 1;       // All children MUST complete
  COMPLETION_MODE_LENIENT = 2;      // Continue with partial results
  COMPLETION_MODE_BEST_EFFORT = 3;  // Complete with whatever succeeds
  COMPLETION_MODE_QUORUM = 4;       // Need min_success_ratio
}

enum FailureAction {
  FAILURE_ACTION_UNSPECIFIED = 0;  // Default; treat as FAIL
  FAILURE_ACTION_FAIL = 1;         // Propagate failure up
  FAILURE_ACTION_SKIP = 2;         // Skip, continue with siblings
  FAILURE_ACTION_RETRY = 3;        // Retry up to max_retries
  FAILURE_ACTION_DEFER = 4;        // Create claim check, continue
}
]]></sourcecode></figure>

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

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

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

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

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

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

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

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

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

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

<t><list style="numbers" type="1">
  <t><spanx style="verb">new_id = (last_assigned + 1) % 0xFFFFFFFD</spanx></t>
  <t>If <spanx style="verb">new_id == 0</spanx>, <spanx style="verb">new_id = 1</spanx> (skip reserved NULL_ENTITY)</t>
  <t>If <spanx style="verb">(new_id - cursor) % 0xFFFFFFFD &gt;= max_window</spanx> -&gt; STOP, apply backpressure</t>
  <t>On COMPLETE/FAILED: mark resolved; if <spanx style="verb">entity_id == cursor</spanx>, advance cursor</t>
  <t>IDs behind cursor are implicitly recyclable</t>
</list></t>

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

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

<figure><sourcecode type="protobuf"><![CDATA[
message AssemblyManifestEntry {
  uint32 parent_id = 1;
  uint32 scope_id = 2;           // Layer 1
  repeated uint32 children_ids = 3;
  repeated EntityStatus children_status = 4;
  CompletionPolicy policy = 5;   // Layer 2
  uint64 created_at = 6;
  ResolutionState state = 7;
}

enum ResolutionState {
  RESOLUTION_STATE_UNSPECIFIED = 0;
  RESOLUTION_STATE_ACTIVE = 1;
  RESOLUTION_STATE_RESOLVED = 2;
  RESOLUTION_STATE_PARTIAL = 3;      // Some children failed/skipped
  RESOLUTION_STATE_FAILED = 4;
}
]]></sourcecode></figure>

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

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

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

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

<figure><sourcecode type="protobuf"><![CDATA[
message CheckpointFrame {
  string checkpoint_id = 1;
  uint64 sequence_number = 2;
  uint32 checkpoint_entity_id = 3;
  uint32 scope_id = 4;
  uint32 flags = 5;
  uint32 timeout_ms = 6;
}
]]></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-digest-propagation-layer-1"><name>Scope Digest Propagation (Layer 1)</name>

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

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

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

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

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

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

<t>Implementations MAY choose any data structure that satisfies these complexity requirements. See the companion document <spanx style="verb">REFERENCE_IMPLEMENTATION.md</spanx> for a recommended approach using a Fibonacci heap.</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="protobuf"><![CDATA[
message StoppingPointValidation {
  bytes state_checksum = 1;      // Hash of processing state
  uint64 bytes_processed = 2;    // Progress marker
  uint32 children_complete = 3;
  uint32 children_total = 4;
  bool is_resumable = 5;
  string checkpoint_ref = 6;
}
]]></sourcecode></figure>

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

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

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

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

<t>Each Entity MUST include a SHA-256 checksum in its EntityHeader.</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:
1. Reject the entity with PIPESTREAM_INTEGRITY_ERROR (0x04).
2. Discard any partial results or temporary state associated with the entity.
3. Propagate the failure according to the Completion Policy (Section 8.3).</t>

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

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

<texttable>
      <ttcol align='left'>Limit</ttcol>
      <ttcol align='left'>Default</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>Max scope depth</c>
      <c>7</c>
      <c>Prevents recursive bombs (8 levels: 0-7)</c>
      <c>Max entities per scope</c>
      <c>4,294,967,294</c>
      <c>Memory bounds</c>
      <c>Max window size</c>
      <c>2,147,483,648</c>
      <c>Backpressure threshold</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>

</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 documents being processed, even when payloads are encrypted at the application layer:</t>

<t><list style="numbers" type="1">
  <t><strong>Document 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 document being processed (e.g., a document that dehydrates into 50 children is likely a multi-page document). Implementations that require structural privacy SHOULD pad dehydration counts or use fixed decomposition granularity.</t>
  <t><strong>Metadata in headers</strong>: The <spanx style="verb">content_type</spanx>, <spanx style="verb">metadata</spanx> map, and <spanx style="verb">payload_length</spanx> fields in EntityHeader (Section 6.7) are transmitted in cleartext within the QUIC-encrypted stream. Implementations that require metadata confidentiality beyond transport encryption SHOULD encrypt EntityHeader fields at the application layer and use an opaque content_type such as <spanx style="verb">application/octet-stream</spanx>.</t>
  <t><strong>Traffic analysis</strong>: The timing and size of status frames on the Control Stream may correlate with document processing patterns. Implementations operating in privacy-sensitive environments SHOULD send status frames at fixed intervals with padding to obscure processing timing.</t>
  <t><strong>Identifiers</strong>: The <spanx style="verb">doc_id</spanx> field in PipeDoc (Section 7.1) and filenames in BlobBag entries are application-layer data but may be logged by intermediate processing nodes. Implementations SHOULD provide mechanisms to redact or pseudonymize identifiers at pipeline boundaries.</t>
</list></t>

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

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

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

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

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

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

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

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

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

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

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

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

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

<texttable>
      <ttcol align='left'>Protocol</ttcol>
      <ttcol align='left'>Identification Sequence</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>PipeStream Version 1</c>
      <c>"pipestream/1"</c>
      <c>this document</c>
</texttable>

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

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

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

</section>
<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-0xF are reserved for future Standards Action.</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>Protobuf 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>

<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</c>
      <c>0x06</c>
      <c>PIPESTREAM_ENTITY_TOO_LARGE</c>
      <c>Size exceeded</c>
      <c>0x07</c>
      <c>PIPESTREAM_DEPTH_EXCEEDED</c>
      <c>Scope depth exceeded</c>
      <c>0x08</c>
      <c>PIPESTREAM_WINDOW_EXCEEDED</c>
      <c>Window full</c>
      <c>0x09</c>
      <c>PIPESTREAM_SCOPE_INVALID</c>
      <c>Invalid scope</c>
      <c>0x0A</c>
      <c>PIPESTREAM_CLAIM_EXPIRED</c>
      <c>Claim check expired</c>
      <c>0x0B</c>
      <c>PIPESTREAM_CLAIM_NOT_FOUND</c>
      <c>Claim check not found</c>
      <c>0x0C</c>
      <c>PIPESTREAM_LAYER_UNSUPPORTED</c>
      <c>Protocol layer not supported</c>
</texttable>

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

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

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

scope-path = scope-id *("." scope-id)
]]></artwork></figure>

<t>Examples:
- <spanx style="verb">pipestream://processor.example.com/a1b2c3d4</spanx>
- <spanx style="verb">pipestream://processor.example.com:8443/a1b2c3d4/1.42/e5f6</spanx></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>



    </references>

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

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

<section anchor="protobuf-schema-reference"><name>Protobuf Schema Reference</name>

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

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

edition = "2023";

package pipestream.protocol.v1;

import "google/protobuf/any.proto";

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

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

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

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

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

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

  // Maximum flow-control window size, in number of entities.
  uint32 max_window_size = 6;
}

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

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

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

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

  // MIME content type.
  string content_type = 5;

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

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

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

  // Chunking information.
  ChunkInfo chunk_info = 9;

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

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

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

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

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

  // Maximum retry attempts.
  uint32 max_retries = 2;

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

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

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

  // Action on timeout.
  FailureAction on_timeout = 6;

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

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

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

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

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

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

  // Current status.
  EntityStatus status = 3;

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

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

  // Monotonic sequence number.
  uint64 sequence_number = 2;

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

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

  // Checkpoint flags.
  uint32 flags = 5;

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

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

  // Scope identifier.
  uint32 scope_id = 2;

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

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

  // Governing completion policy.
  CompletionPolicy policy = 5;

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

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

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

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

  // Opaque continuation state.
  bytes continuation_state = 2;

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

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

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

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

  // Scope identifier.
  uint32 scope_id = 3;

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

  // Validation data.
  StoppingPointValidation validation = 5;
}

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

  // Payload bytes consumed.
  uint64 bytes_processed = 2;

  // Completed child count.
  uint32 children_complete = 3;

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

  // Resumption capability flag.
  bool is_resumable = 5;

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

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

  // Total processed count.
  uint64 entities_processed = 2;

  // Total succeeded count.
  uint64 entities_succeeded = 3;

  // Total failed count.
  uint64 entities_failed = 4;

  // Total deferred count.
  uint64 entities_deferred = 5;

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

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

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

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

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

  // Group identifier.
  string group_id = 2;

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

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

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

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

  // Optional region hint.
  string region = 4;

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

  // Encryption metadata.
  EncryptionMetadata encryption = 6;
}

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

  // Key provider identifier.
  string key_provider = 2;

  // Encryption key identifier.
  string key_id = 3;

  // Optional wrapped DEK.
  bytes wrapped_key = 4;

  // Initialization vector.
  bytes iv = 5;

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

</section>
</section>
<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 (96-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>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>


  </back>

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

-->

</rfc>

