<?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-00" 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>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ai-pipestream/pipestream-quic-protocol-rfc"/>.</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>

<t><spanx style="verb">protobuf
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)
}
</spanx></t>

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

<t>Variable-frame Length (32 bits): 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>

</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>

<t><spanx style="verb">
    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 |E|C| D(3)|       Flags (15 bits)       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                       Entity ID (32 bits)                     |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |        Scope ID (16 bits)       |      Reserved (16 bits)     |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</spanx></t>

<t>Stat (4 bits): Status code (see Section 6.2.2).</t>

<t>E (1 bit): Extended frame flag. Additional extension data follows (Section 6.5).</t>

<t>C (1 bit): Cursor update flag. A 4-octet cursor value follows (Section 6.2.3).</t>

<t>D (3 bits): Explicit scope nesting depth (0-7). 0=Root. Layer 1.</t>

<t>Flags (15 bits): Reserved for future use. MUST be zero when sent and MUST be ignored by receivers.</t>

<t>Entity ID (32 bits): Unsigned integer identifying the entity.</t>

<t>Scope ID (16 bits): Identifier for the scope to which this entity belongs.</t>

<t>Reserved (16 bits): Reserved for future use. MUST be zero when sent and MUST be ignored by receivers.</t>

</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>

<t><spanx style="verb">
    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)                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</spanx></t>

<t>New Cursor Value (32 bits): 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>

</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>

<t><spanx style="verb">
    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)                     |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</spanx></t>

<t>Flags (8 bits): Reserved for future use. MUST be zero when sent and MUST be ignored by receivers.</t>

<t>Scope ID (16 bits): Identifier of the scope being summarized.</t>

<t>Entities Processed (64 bits): The total number of entities that were processed within the scope.</t>

<t>Entities Succeeded (64 bits): The number of entities that reached a terminal success state.</t>

<t>Entities Failed (64 bits): The number of entities that reached a terminal failure state.</t>

<t>Entities Deferred (64 bits): The number of entities that were deferred via claim checks.</t>

<t>Merkle Root (256 bits): The SHA-256 Merkle root covering all entity statuses in the scope (see Section 9.4).</t>

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

<t><spanx style="verb">
    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)                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</spanx></t>

<t>S (1 bit): Status (0 = waiting, 1 = released).</t>

<t>Reserved (7 bits): Reserved for future use. MUST be zero when sent and MUST be ignored by receivers.</t>

<t>Barrier ID (16 bits): Identifier for the barrier within the scope.</t>

<t>Parent Entity ID (32 bits): The identifier of the parent entity whose sub-tree is blocked by this barrier.</t>

</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>

<t><spanx style="verb">
    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)                       |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</spanx></t>

<t>Yield Reason (8 bits): The reason for yielding (see Section 6.5.1.1).</t>

<t>Token Length (24 bits): The length of the Yield Token in bytes (maximum 16,777,215).</t>

<t>Yield Token (variable): The opaque continuation state.</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>

<t><spanx style="verb">
    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)        |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</spanx></t>

<t>Claim Check ID (64 bits): A cryptographically secure random identifier for the claim.</t>

<t>Expiry Timestamp (64 bits): Unix epoch timestamp in microseconds when the claim expires.</t>

</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>

<t><spanx style="verb">
   +---------------------------+
   |    Header Length (4)      |   4 octets, big-endian uint32
   +---------------------------+
   |                           |
   |    Header (Protobuf)      |   Variable length
   |                           |
   +---------------------------+
   |                           |
   |    Payload                |   Variable length (per header)
   |                           |
   +---------------------------+
</spanx></t>

<t>Header Length (4 octets): The length of the Protobuf-encoded EntityHeader in bytes.</t>

<t>Header (Protobuf): The serialized EntityHeader message (see Section 6.7.2).</t>

<t>Payload (variable): The raw entity data.</t>

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

<t><spanx style="verb">protobuf
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&lt;string, string&gt; metadata = 8;
  ChunkInfo chunk_info = 9;
  CompletionPolicy completion_policy = 10; // Layer 2: failure handling
}
</spanx></t>

</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>

<t>```protobuf
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&lt;string, string&gt; attrs = 5; // Provider-specific attributes
  EncryptionMetadata encryption = 6;
}</t>

<t>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&lt;string, string&gt; context = 6; // Encryption context
}
```</t>

</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>

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

<t>```protobuf
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;
}</t>

<t>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
}</t>

<t>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
}
```</t>

</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>
1. <spanx style="verb">new_id = (last_assigned + 1) % 0xFFFFFFFD</spanx>
2. If <spanx style="verb">new_id == 0</spanx>, <spanx style="verb">new_id = 1</spanx> (skip reserved NULL_ENTITY)
3. If <spanx style="verb">(new_id - cursor) % 0xFFFFFFFD &gt;= max_window</spanx> -&gt; STOP, apply backpressure
4. On COMPLETE/FAILED: mark resolved; if <spanx style="verb">entity_id == cursor</spanx>, advance cursor
5. IDs behind cursor are implicitly recyclable</t>

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

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

<t>```protobuf
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;
}</t>

<t>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;
}
```</t>

</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>

<t><spanx style="verb">protobuf
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;
}
</spanx></t>

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

<t><spanx style="verb">protobuf
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;
}
</spanx></t>

</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>

<t>```
pipestream-URI = "pipestream://" authority "/" session-id ["/" scope-path] ["/" entity-id]</t>

<t>scope-path = scope-id *("." scope-id)
```</t>

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

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

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

<t>```protobuf
// 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.</t>

<t>edition = "2023";</t>

<t>package pipestream.protocol.v1;</t>

<t>import "google/protobuf/any.proto";</t>

<t>// All enums in this file are CLOSED.
option features.enum_type = CLOSED;</t>

<t>// Capabilities describes the feature set supported by a PipeStream endpoint.
message Capabilities {
  // Whether the endpoint supports Layer 0 (core entity streaming).
  bool layer0_core = 1;</t>

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

<t>// Whether the endpoint supports Layer 2 (resilience, yield, and claim-check).
  bool layer2_resilience = 3;</t>

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

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

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

<t>// EntityHeader is sent at the beginning of each entity stream.
message EntityHeader {
  // Scope-local entity identifier.
  uint32 entity_id = 1;</t>

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

<t>// Identifier of the scope.
  uint32 scope_id = 3;</t>

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

<t>// MIME content type.
  string content_type = 5;</t>

<t>// Payload length in bytes.
  uint64 payload_length = 6;</t>

<t>// SHA-256 integrity checksum.
  bytes checksum = 7;</t>

<t>// Arbitrary metadata.
  map&lt;string, string&gt; metadata = 8;</t>

<t>// Chunking information.
  ChunkInfo chunk_info = 9;</t>

<t>// Resilience completion policy.
  CompletionPolicy completion_policy = 10;
}</t>

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

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

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

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

<t>// Maximum retry attempts.
  uint32 max_retries = 2;</t>

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

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

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

<t>// Action on timeout.
  FailureAction on_timeout = 6;</t>

<t>// Action on failure.
  FailureAction on_failure = 7;
}</t>

<t>// 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;
}</t>

<t>// 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;
}</t>

<t>// 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;
}</t>

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

<t>// Identifier of the scope.
  uint32 scope_id = 2;</t>

<t>// Current status.
  EntityStatus status = 3;</t>

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

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

<t>// Monotonic sequence number.
  uint64 sequence_number = 2;</t>

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

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

<t>// Checkpoint flags.
  uint32 flags = 5;</t>

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

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

<t>// Scope identifier.
  uint32 scope_id = 2;</t>

<t>// Ordered child identifiers.
  repeated uint32 children_ids = 3;</t>

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

<t>// Governing completion policy.
  CompletionPolicy policy = 5;</t>

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

<t>// Current resolution state.
  ResolutionState state = 7;
}</t>

<t>// 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;
}</t>

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

<t>// Opaque continuation state.
  bytes continuation_state = 2;</t>

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

<t>// 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;
}</t>

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

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

<t>// Scope identifier.
  uint32 scope_id = 3;</t>

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

<t>// Validation data.
  StoppingPointValidation validation = 5;
}</t>

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

<t>// Payload bytes consumed.
  uint64 bytes_processed = 2;</t>

<t>// Completed child count.
  uint32 children_complete = 3;</t>

<t>// Total expected child count.
  uint32 children_total = 4;</t>

<t>// Resumption capability flag.
  bool is_resumable = 5;</t>

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

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

<t>// Total processed count.
  uint64 entities_processed = 2;</t>

<t>// Total succeeded count.
  uint64 entities_succeeded = 3;</t>

<t>// Total failed count.
  uint64 entities_failed = 4;</t>

<t>// Total deferred count.
  uint64 entities_deferred = 5;</t>

<t>// Merkle root hash.
  bytes merkle_root = 6;
}</t>

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

<t>// Identifier of the entity.
  uint32 entity_id = 2;</t>

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

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

<t>// Group identifier.
  string group_id = 2;</t>

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

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

<t>// Bucket or container name.
  string bucket = 2;</t>

<t>// Object key or path.
  string key = 3;</t>

<t>// Optional region hint.
  string region = 4;</t>

<t>// Provider-specific attributes.
  map&lt;string, string&gt; attrs = 5;</t>

<t>// Encryption metadata.
  EncryptionMetadata encryption = 6;
}</t>

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

<t>// Key provider identifier.
  string key_provider = 2;</t>

<t>// Encryption key identifier.
  string key_id = 3;</t>

<t>// Optional wrapped DEK.
  bytes wrapped_key = 4;</t>

<t>// Initialization vector.
  bytes iv = 5;</t>

<t>// Additional encryption context.
  map&lt;string, string&gt; context = 6;
}
```</t>

</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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

-->

</rfc>

