DreamDB

DreamDB Specification — 0009: Conformance

Status: Draft. Builds on 0000–0008 (the entire v0 spec). This document defines what "DreamDB-conformant" means for each component (Backend, Storage Connector, Protocol Component / SDK), enumerates the test-vector battery that any conformant implementation MUST pass, and resolves the meta-OQs about concrete tag values: OQ-11 (CBOR tag numbers), OQ-12 (multihash algorithm tags), OQ-17 (time-anchor CBOR tag).


1. Purpose

The DreamDB v0 spec defines a protocol composed of byte formats, address grammars, HTTP semantics, algorithms, and operational disciplines. An implementation is DreamDB-conformant if it correctly realizes the relevant subset for its role. This document:

  • Defines the three conformance roles (Backend, Storage Connector, Protocol Component) and what each must implement.
  • Resolves the spec's meta-OQs — concrete CBOR tag values, multihash algorithm tags, and other registry-style commitments deferred from earlier docs.
  • Enumerates the test-vector categories that a conformant implementation MUST pass, organized by source spec doc.
  • Specifies the test-vector exchange format — a structured JSON form that is portable across implementation languages.
  • Defines the conformance reporting that an implementation publishes to advertise its level.

What this document does not do:

  • Enumerate every individual vector in full. The reference corpus lives in dreamdb-conformance/vectors/ in this repository; §10 describes its exchange organization. Category rows define requirements or named performance profiles, not proof that every row has an implemented test or has run on every platform.
  • Replace earlier specs' normative requirements. Conformance is judged against the entire spec; this document is a roadmap, not a substitute.

2. Conformance Roles

DreamDB's three-layer architecture (0000 §3) admits three conformance roles, each independently testable:

RoleWhat it implementsTested by
BackendHTTP semantics (0005)HTTP-level test suite hitting a deployed backend
Storage ConnectorHTTP-to-DreamDB transport shim (0005 §8)Unit + integration tests against a reference backend
Protocol Component (SDK)DreamDB Protocol verbs (0001–0008)End-to-end tests + algorithmic/byte-format vectors

A complete implementation is two of these (Connector + Protocol; the Backend is supplied by an existing object store) plus a binding to a chosen Backend that has independently been verified Backend-conformant.

2.1 Backend conformance

A Backend is ContentStore-Conformant if it correctly implements:

  • HTTP verbs PUT, GET (with Range), HEAD, LIST (with prefix and pagination), DELETE per 0005 §3.
  • Strong read-after-write consistency for content-addressed paths (0005 §5.1).
  • Lexicographic byte-order LIST results (0005 §3.5.1).
  • The §3–§5 HTTP semantics over HTTP/1.1 or later (0005 §6). HTTP/2 / HTTP/3 is a performance upgrade (a profile attribute, 0023), not a conformance requirement — the byte contract is identical across versions.

A Backend is RefStore-Conformant if, additionally, it correctly implements:

  • If-None-Match: * and If-Match: <etag> conditional writes per 0005 §4.
  • Linearizable CAS semantics (0005 §5.2).

Each tier is independently certifiable; a Backend MAY be ContentStore-Conformant only.

2.2 Storage Connector conformance

A Storage Connector is conformant if it:

  • Translates DreamDB protocol-layer requests into HTTP per 0005.
  • Iterates LIST pagination to exhaustion (0005 §3.5.2).
  • Round-trips ETags opaquely for If-Match and canonicalizes for cross-request comparison (0005 §8.5).
  • Reuses connections per (backend host, auth identity) pair rather than one-per-request (0005 §8.1); when it negotiates HTTP/2 / HTTP/3 those requests share the connection's multiplexed streams. The multiplexing is a performance-profile attribute (0023), not a conformance gate; the connector is conformant over HTTP/1.1.
  • Translates bytes:<a>-<b> (DreamDB half-open) → Range: bytes=<a>-<b−1> (HTTP inclusive) (0005 §3.3).
  • Exposes no DreamDB-semantic logic — bytes pass through opaquely (0005 §8.4).

2.3 Protocol Component (SDK) conformance

A Protocol Component is conformant if it correctly implements:

  • The eight verbs of 0006 §2 (Open, Resolve, Query, Stream, Get, Append, Layer, Publish).
  • The per-session cache discipline of 0006 §3 (cache by content hash; never by path).
  • Manifest Supremacy — never use list-prefix during steady-state reads (0005 §5.3.1).
  • The integer-only time arithmetic discipline of 0003 §4.1.
  • The f32-determinism discipline for spatial-key derivation (0004 §5.4).
  • The deterministic CBOR encoding of all hashable Objects (0002 §3).
  • The base2 spatial-key encoding, base32 hash encoding, 16-char hex time encoding of 0002 §6 / §8 and 0003 §6.
  • The byte-format layouts of 0007 for every Object kind it produces or reads.
  • The DAG semantics of 0008 — multi-parent Manifests, MUST-refuse-on-SpatialIndex-conflict merges, lex-greatest tiebreak for Constants.
  • The operational disciplines of 0006 §4.1.1, §4.4.1, §7.3 (Ref freshness, Stream prefetch, GC).

3. Resolved Meta-OQs

This section resolves the placeholder values used in earlier docs.

3.1 Multihash algorithm tag for BLAKE3 (resolves OQ-12)

BLAKE3-256 algorithm tag = 0x1e

DreamDB uses the BLAKE3 algorithm code 0x1e, but its fixed 33-byte wire value below is DreamDB's encoding, not a complete standard multihash serialization: there is no digest-length varint. Matching an algorithm code does not make the encodings interchangeable. A future algorithm requires an explicit protocol revision; readers must not enable it merely because an external registry lists it.

A multihash for BLAKE3-256 on the wire is therefore:

0x1e || <32-byte BLAKE3 hash>      = 33 bytes total

Encoded for use in addresses as base32-lowercase-no-padding (per 0002 §8.1): 53 characters (33 bytes × 8 bits / 5 bits per char = ceil(52.8) = 53).

3.2 DreamDB CBOR tag value (resolves OQ-11, OQ-17)

DreamDB specifies one locally chosen CBOR tag for foreign-CBOR-embedding scenarios:

dreamdb.tag = 65521 (= 0xFFF1)

This is not an IANA private-use allocation. The IANA CBOR Tags registry places 32768 and above under First Come First Served registration, not a private-use policy. This document does not establish a DreamDB registration or global collision freedom. Foreign-CBOR integrations must agree on the local meaning; any registration or renumbering needs a separate compatibility decision. This correction does not change the value or introduce tags into DreamDB Object schemas (§3.2.1).

3.2.1 Tag scope: foreign-CBOR contexts only

The tag is a deployment-local foreign-CBOR convention. An integration MUST agree both its use of 65521 and the wrapped semantic type out of band. Seeing 65521 in an arbitrary document is not sufficient evidence of DreamDB content; without that agreement a consumer preserves it as an uninterpreted tag or refuses the unsupported application format, rather than interpreting it as a DreamDB value. The wrapped CBOR major type alone is insufficient (modality tags and spatial keys are both strings).

Inside the schema-typed fields of DreamDB Objects, this tag is NOT used. Those fields use plain CBOR types directly:

  • Time anchors → plain CBOR uint (per 0003 §5).
  • Hashes → plain CBOR byte string (per 0002 §3).
  • Modality tags → plain CBOR text string.
  • Spatial keys → plain CBOR text string (base2 chars).

The schema's field name (or array position) is the type indicator. Adding a tag inside DreamDB schemas would be redundant and adds 2–3 bytes per occurrence — at billion-scale, that is GB-class waste.

Ordinary DreamDB Object readers do not acquire tagged alternatives to their fields. The reference core exports DREAMDB_TAG and its generic CBOR codec can round-trip a tagged value, but this does not perform automatic DreamDB semantic interpretation or establish an interoperable foreign-document format.

3.2.2 Maps vs. positional arrays in DreamDB schemas

0002 §3.1 specifies two encoding choices for schema-typed DreamDB Objects:

  • Maps with string keys: low-volume schemas (Manifest top-level, Genesis, SpatialIndex Object, Track Object metadata). Self-describing; debugger-friendly.
  • Positional CBOR arrays: high-volume schemas (Index Page leaf entries and internal entries per 0007 §7.3 / §7.5). Field order pinned in spec text; saves ~40 bytes per entry and ~40 GB on a 1B-entry Track.

Conformance test vectors (§5.1) MUST cover both encodings — including a positional-array round-trip that confirms the field order matches the spec.

4. Test-Vector Format

Conformance test vectors are exchanged as JSON documents with the following schema:

json
{
   "test_id":      "0002.cbor.deterministic.0001",
   "spec_section": "0002 §3.1",
   "category":     "cbor-roundtrip",
   "description":  "Round-trip a Manifest with one Track entry",
   "inputs":       { ... category-specific inputs ... },
   "expected":     { ... category-specific expected outputs ... },
   "pass_criteria": "byte-identical round-trip",
   "metadata":     { ... optional, e.g. golden-file references ... }
}

4.1 Test ID convention

test_id := <spec-doc>.<category>.<subcategory>.<sequence>

Example IDs:

  • 0002.cbor.deterministic.0001 — first deterministic-CBOR test in 0002.
  • 0004.lsh-cosine.f32-rounding.0003 — third f32-rounding-edge-case test for dreamdb.lsh-cosine.
  • 0005.http.range-translation.0001 — first byte-range translation test.
  • 0008.dag.refuse-spatial-index-incompat.0001 — first MUST-refuse merge test.

This makes failures locatable and grep-friendly.

4.2 Categories

Each category specifies its own input/expected schema. The full schema definitions live in the conformance suite repo (§10); summary follows in §5–§8.

4.3 Pass / fail criteria

Vectors specify their own pass criteria. Common kinds:

  • Byte-identical: produced output bytes equal expected bytes exactly.
  • Functional equivalence: produced output is semantically equivalent (e.g. an array order-independent set comparison).
  • Behavioral assertion: under specified conditions, the implementation makes (or does not make) certain HTTP requests; takes (or does not take) certain actions.
  • Tolerance bound: produced metric (e.g. recall, latency) is within a stated bound of the expected value.

4.4 Conformance vs. performance (normative)

The four kinds in §4.3 fall into two classes with different normative force, and an implementation MUST be evaluated against them separately:

  • Conformance criteria — the byte-identical, functional-equivalence, and behavioral-assertion kinds. These are deterministic and environment-independent: given the same inputs, a correct implementation passes on any hardware, network, or workload. An implementation is DreamDB-conformant for a category if and only if it passes every conformance criterion in that category. A failure here is non-conformance.
  • Performance-profile targets — the tolerance-bound kind (recall, latency, throughput, bytes-fetched, wall-clock). These depend on the workload (corpus size, dimensionality, distribution) and the environment (storage round-trip, bandwidth, CPU/GPU). They are advisory: missing a target means the implementation does not claim that performance profile — it does not make the implementation non-conformant. Performance profiles are defined separately in 0023-performance-profiles.md and version on their own cadence.

The boundary must be read carefully: a quantity fixed by the protocol for the declared fixture is a behavioral assertion, not a timing target. For example, Manifest Supremacy requires zero query LISTs. An exact Bucket GET count additionally depends on the fixture's split count, cache state, coalescing and retry conditions; it cannot be inferred from the number of tables alone. “Completes in <100 ms p95” is a performance-profile target.

Performance narrative elsewhere in the spec (e.g. 0004 §7.3/§8 latency budgets) is informative. The normative requirements such narrative rests on — chiefly Manifest Supremacy (0005 §5.3.1: no list-prefix on the steady-state read path) and the cold-start round-trip bound — are stated as conformance criteria in their own right (§6, §7), never inferred from a budget.

5. Test Categories — Byte Formats and Algorithms

5.1 0002: Content addressing

CategoryPass criterionCoverage
cbor.deterministic.*Byte-identical canonical encodingAll hashable Object types
multihash.encoding.*Byte-identical multihash + base32 round-tripBLAKE3 hashes (0x1e)
address.grammar.*Path parse and re-emit produces same bytesAll address forms; URI scheme
modality.tag.parsing.*Tag → (class, encoding, params) parse correctnessBuilt-in classes; reverse-DNS
spatial-key.base2.*base2 encoding round-trips arbitrary-N bit stringsBit lengths 1-256, prefix-preservation
paged-index.btree.*B-tree page traversal returns expected leaf entriesInline + paged forms; mixed
bao.range-integrity.*Standard outboard bytes are byte-identical; arbitrary unaligned ranges verify and trim exactly; changed data or proof is refused1 KiB boundaries; tail chunk; malformed/truncated/corrupt proof and subject

multihash.encoding.* covers whole-Object hashing. bao.range-integrity.* separately pins the derived proof bytes and the verified-range algorithm from 0002 §6.5.4; passing one category does not imply passing the other.

5.2 0003: Time encoding

CategoryPass criterionCoverage
time-anchor.hex.*u64 ↔ 16-char hex round-trip; lex order = numeric orderMin (0), max (2⁶⁴ − 1), mid, near-boundary values
time-bucket.placement.*floor(t_start / D) produces correct bucket for boundary casest_start = 59.9 s, 60.0 s, 60.1 s, 59.999999999 s with D=60s
time-bucket.overflow.*Overflow stress — t at 2⁶⁴ − 1, t + duration overflow detection, bucket-duration near 2⁶³ − 1, bucket-duration = 1 ns (degenerate floor(t/1)=t), bucket-duration = 2⁶³ − 1 (degenerate floor(t/huge)=0)Edge u64 values; catastrophic-overflow guards
genesis.cbor.*Genesis Object round-trips deterministicallyAnchored/abstract; with/without horizon
duration-parsing.overflow.*Duration suffix parsing rejects values whose ns count would exceed 2⁶³ − 11_000_000_000h, 2⁶³ s, etc.
integer-only.violation.*Implementation rejects f64 in time arithmetic at compile/lint time, OR fuzz tests confirm no f64 path existsStatic analysis hooks

5.3 0004: Spatial indexing

0004.lsh_l2.001–002 pin the optional dreamdb.lsh-l2 profile (§5.8 of 0004): canonical SpatialIndex hash, seeded signed-bin/probe order, raw negative squared L2 score, and decoder rejection of canonical CBOR containing a zero bucket width. Category lsh-l2-determinism expresses the seed and binary64 width as little-endian hex bytes; query/candidate JSON numbers become binary32 inputs. This is deterministic wire/arithmetic evidence, not a measurement of global ANN recall or independent-implementation agreement.

CategoryPass criterionCoverage
lsh-cosine.hyperplanes.*ChaCha20 seed → hyperplane table is bit-identical across implementationsMultiple seeds; D ∈ {64, 128, 768}
lsh-cosine.bit-derivation.*(vector, hyperplanes) → spatial-key bits are bit-identicalEdge cases including <v, h_i> = 0 ties
lsh-cosine.f32-rounding.*f32 left-fold dot product produces bit-identical results on every required hardware pathSee §5.3.1 — multi-architecture coverage
recall.locality.*Reports empirical bit-collision rates for the exact §5.3 normalized-cube generator; no spherical 1 − θ/π acceptance threshold appliesFixed synthetic corpus and seeds, with the measured profile versioned alongside results
multi-table.union.*Query combines the expected per-table candidates under the format's duplicate rulesFixed candidate sets; empirical recall belongs to 0023
lineage.spatial-index-hash.*Bucket header spatial_index_hash mismatch triggers abort, NOT silent decodeDeliberate mismatches

5.3.1 Multi-architecture f32-determinism conformance (mandatory)

Floating-point determinism across heterogeneous hardware is the single most fragile conformance surface. SIMD optimizers (AVX-512 fused-multiply-add, ARM NEON's vector-friendly rounding modes, GPU paths) are at liberty to reorder f32 operations; the resulting drift is invisible until two SDKs disagree on a single bit and silently route data to different Spatial Buckets.

The discipline:

Pure-scalar reference is the canonical implementation. The dreamdb.lsh-cosine algorithm spec (0004 §5) is interpreted to mean the bytes the scalar reference path produces, with all SIMD optimizations disabled. Any SIMD path is conformant if and only if it produces bit-identical output to scalar.

Required hardware coverage: a conformant implementation MUST be tested on the following paths, all producing bit-identical results to the scalar reference:

Hardware pathNotes
x86-64, AVX-512FMA, vectorized accumulator
x86-64, AVX2older Intel/AMD; subset of AVX-512
x86-64, scalar (no SIMD)reference path; canonical
ARM64, NEONApple Silicon, AWS Graviton, server ARM
ARM64, scalar (no SIMD)reference path; canonical

Test-vector design: vectors crafted to expose rounding-order sensitivity:

  • Pairs with dot products at exactly 0.5 ulp (the rounding boundary).
  • Vectors where left-fold and right-fold accumulation order produce different f32 results — and where the spec mandates left-fold (0004 §5.4).
  • Adversarial inputs: extreme magnitude ranges, near-zero dot products, denormalized floats.
  • Pairs at exactly the <v, h_i> = 0 tie boundary (0004 §5.1 specifies tie → 1).

Non-conformance: an implementation that produces different bits under SIMD vs. scalar on any required hardware path is non-conformant for that path. The implementation MUST disable SIMD optimization on that platform until parity is achieved. Compromised SIMD paths shipping silently is the failure mode this discipline exists to prevent.

This is the same model used by cryptographic library testing (BoringSSL, RustCrypto, libsodium): bit-identical scalar reference, hardware paths verified against it, no SIMD path ships without bit parity.

5.4 0007: Object byte formats

CategoryPass criterionCoverage
bucket.inline.layout.*Record i starts at header_size + i × record_size; its vector/code begins after the record's anchor fieldsLegacy 160-byte, compressed 200-byte and declared extension layouts
bucket.reference.layout.*Reference resolves to correct Vector-Storage byte rangeMulti-table cases
fragment.cmaf.*CMAF Fragment can be played by reference decoderH.264 / H.265 / AV1 / Opus / FLAC
time-batch.in-object-index.*(time_anchor, byte_offset, byte_size) index round-tripsVariable-payload events
index-page.delta-encoding.*Delta-encoded leaves round-trip through encode/decodePage-boundary cases
dynamic-height.*Adding items past height-N capacity produces height-(N+1) tree with old root preservedHeights 1→2→3→...→8
multi-bucket-merge.*Query against spatial-key with 3 bucket splits returns merged result in t_start orderTime-overlapping splits

6. Test Categories — HTTP Contract (0005)

6.1 ContentStore HTTP semantics

CategoryPass criterionCoverage
http.put.idempotent.*PUT same bytes twice → second is no-op (200/201/412)With/without If-None-Match: *
http.range.translation.*DreamDB bytes:<a>-<b> → HTTP Range: bytes=<a>-<b−1>Boundaries 0, 1, 1MB, large
http.list.exhaust.*Pagination iterates correctly across K×1000 boundaryK ∈ {0, 1, 2}; k×1000+1 cases
http.list.sort-order.*Backend returns lex-byte-order across pagesAdversarial keys, ASCII paths
http.consistency.read-after-write.*PUT → GET returns the bytes immediatelyMultiple regions if applicable

6.2 RefStore HTTP semantics

CategoryPass criterionCoverage
http.refs.create.*If-None-Match: * → 412 on existing (treat as success)Initial create + idempotent re-create
http.refs.cas.*If-Match: <etag> → 412 on mismatch (treat as conflict)Concurrent advance
http.refs.linearizable.*Two concurrent CAS attempts: exactly one succeedsStress test
http.etag.flavor.*Round-trip ETag with quotes, with W/, multipart-styleBackend-specific flavors

6.3 Connector behaviors

CategoryPass criterionCoverage
connector.connection-reuse.*Multiple parallel requests reuse one connection per (host, auth) — HTTP/1.1 keep-alive suffices (0005 §8.1)16-parallel-GET hot path
connector.retry.exponential.*5xx / 429 → exponential backoff up to budget5xx, 429, network errors
connector.412.tier-aware.*412 on ContentStore PUT = success; 412 on RefStore PUT = conflictBoth tiers

Profile-only (not a conformance gate): connector.h2.shared-connection.* — multiple parallel requests share one HTTP/2 (or HTTP/3) multiplexed connection. This is a 0023 performance-profile attribute (0023 §"environment_class"), exercised only when the profile asserts an HTTP/2+ environment; it is not required for connector conformance (§2.2, 0005 §6). An HTTP/1.1 connector that reuses connections via keep-alive (connector.connection-reuse.* above) is fully conformant.

7. Test Categories — Verbs and SDK behavior (0006)

CategoryPass criterionCoverage
verb.append-publish.roundtrip.*Standard transaction succeeds; new Manifest is reachableSingle-modality + multi-modality
verb.append.retry.*Mid-Append failure + retry produces idempotent resultFailure injected at every step
verb.publish.concurrent.*Two concurrent Publishes → one wins, loser rebuildsRebase + merge paths
verb.query.cold-vs-hot.*Cold and cached reads return the same result; cached metadata is reusedPin cache state and index shape; no universal one-round-trip bound
verb.query.no-list-prefix.*Hot-path query issues ZERO LIST HTTP requests (Manifest Supremacy)Steady-state queries
verb.gc.algorithm.*Synthetic orphans + reachable mix → orphans deleted, reachable preservedThreshold honored
verb.stream.prefetch.*Prefetch preserves stream order and honors cancellation and configured lookaheadStall/latency targets require a 0023 workload, not a universal lookahead of two
verb.refs.freshness.*HEAD-detected ETag mismatch triggers Resolve flowLong-lived session
cache.content-hash-keyed.*Different Tracks Object for same (timeline, modality) produce two cache entriesCross-Manifest

8. Test Categories — DAG and Versioning (0008)

CategoryPass criterionCoverage
dag.parents-array.*Manifests with parents: [], [1], and [2+] round-tripAll cardinalities
dag.fast-forward.*Detect when one parent is ancestor of the otherLinear, branching, multi-level
dag.spatial-index-incompat.*MUST refuse merge with named conflicting hashes; auto-merging implementation is non-conformantEdge cases
dag.merge-equivalence.*Merged read result is strategy-independent (0008 §5.3): layered, fused, and fused-then-compacted yield identical query results — the §6 union of both parentsDisjoint + overlapping branches; pre/post compaction
dag.constant-tiebreak.*Lexicographically-greatest layer-Track address winsMulti-layer Constants
dag.cas-rebase-loop.*Bounded retries terminate; surface PublishConflictRetry budget exhaustion
dag.feature-branch-load.*Report throughput for a pinned branch-per-writer versus shared-Ref workloadPerformance profile (0023), not a conformance gate
dag.monotonic-ts.*Writer fix-up of ts < max(parents.ts) produces monotonic chain; reader-side Timeline-Jump flag surfacesClock-skew injection
dag.history-walk.*DAG traversal terminates; visits each Manifest at most onceCyclic-input rejection (impossible by construction, but verify)

8.5 Test Categories — Phase-3 ObjectKinds and Verbs

Phase-3 specs (0010, 0012, 0013, 0014) introduce new ObjectKinds and query/write extensions. The conformance battery for them is OPTIONAL for pre-Phase-3 v0 SDKs and REQUIRED for SDKs claiming Phase-3 conformance.

8.5.1 0010 — Vector compression

v0.1 normative for the framework + raw-f32 / rabitq-cosine / pq-cosine. The Object byte format and RaBitQ encode-determinism are vector-gated (dreamdb-conformance/vectors/0010/); the rerank-recall target is a 0023 performance profile, not a conformance gate.

CategoryPass criterionCoverage
vc.roundtrip.*VectorCompressor Object → canonical CBOR encode/decode/re-encode byte-identical (raw-f32 / rabitq-cosine / pq-cosine)Vector-gated
vc.rabitq.encode-determinism.*encode(v) reproduces the scalar-canonical code for a fixed rotation seed; decode reproducible (0004 §5.4 gate)Vector-gated
vc.raw-f32.identity-code.*raw-f32 encode is the identity f32-LE byte layoutVector-gated
vc.bucket-header.200-byte.*Buckets with a vector_compressor_hash use the 200-byte v2 header, with the hash at 86..119, zero-filled reservation at 119..200, and records at 200 + i×record_sizeVector-gated
vc.reference-inline-code.*A compressed reference Bucket uses record_size = 49 + code_bytes; query scoring reads the inline code, exact reranking retains the raw VS reference, and legacy 160/49 Buckets remain byte-compatibleBehavioral (dreamdb-protocol + dreamdb-dataset tests)
vc.lineage-mismatch-abort.*Decoding a Bucket against the wrong VC Object causes a critical-error abortBehavioral (dreamdb-dataset tests)
vc.rerank-storage.*Re-rank fetch path closes the recall gap to exact f32Performance profile (0023), not a gate
vc.qinco.*Learned-codebook roundtrip + MLP determinismDeferred (OQ-46)

8.5.2 0012 — Federation

CategoryPass criterionCoverage
fed.manifest.canonical.*FederationManifest decode/re-encode bytes and content hash are identicalVector-gated
fed.hash-verify-abort.*A coordinator or shard backend serving wrong bytes for a known hash MUST abortNegative backend-corruption check
fed.scatter-gather.partial.*A quorum-satisfied response with a missing logical shard is flagged partial:trueOne shard offline
fed.shard-key.range-prune.*Hybrid-range shards outside the query's anchor range are skippedMulti-shard time queries
fed.schema-mismatch-abort.*Shards whose canonical Schema hash differs are never score-mergedNegative multi-shard query
fed.router.fanout-reduction.*Router-graph dispatches reduce contacted shards from N to K_routerDeferred (0012 §8)

8.5.3 0013 — Graph indexing

CategoryPass criterionCoverage
graph.vamana.build.deterministic.*A build from the pinned (vectors, seed, alpha, L_build, passes) reproduces the complete canonical adjacency and entry pointSmall inline case + raw f32le/u32le reference graph (dim=64, 10K nodes, R=8)
graph.vamana.search.deterministic.*Final ids, f32 score bits and every expanded trajectory pair are identical across implementationsThree queries over the 10K-node reference graph
graph.page.header.lineage.*A batch GraphPage header's graph_index_hash matches the current batch GraphIndexCache-mis-keying
fresh-vamana.page-lineage.*Reused and rewritten pages bind one validated batch root; foreign-root, missing-root, mutable-family and malformed page-range cases refuseRoot + two Fresh snapshots
graph.compose-with-compressor.*Measure recall for a declared supported graph/compressor combinationPerformance profile (0023); reserved QINCo is not required
graph.entry-point.medoid.*Approximate-medoid entry point selection is deterministic across implementationsSample-size cap

8.5.4 0014 — Streaming extensions

CategoryPass criterionCoverage
chunk.itemmanifest.roundtrip.*Existing map wire form decodes/re-encodes byte-identically; empty Item uses one zero-sized chunk, never an empty listSingle-chunk + multi-chunk + empty Item
chunk.fragmententry.4-tuple.*Direct entries (absent Schema chunking policy, no packing) retain v0 4-tuplesBackwards-compat
chunk.fragmententry.5-tuple.*Schema chunking emits 5-tuples with is_manifest=true, without requiring a modality parameterManifest-bearing case
chunk.stitching.range-fetch.*Byte-range [A,B) fetches only the chunks overlapping rangePartial reads at every chunk boundary
chunk.total-size-verify.*Manifest-declared total mismatches actual concatenated size → critical errorNegative test
chunk.gc.transitive.*GC walks ItemManifest → chunk hashes transitively; no dangling refsMixed reachable/orphan
playlist.renditions.roundtrip.*CLOSED RenditionPlaylist CBOR and registry binding roundtrip deterministicallyVideoItem snapshots
playlist.cross-rendition.anchor.*Publication refuses unequal Item extents or Fragment boundaries before any playlist writePublic publisher boundary
playlist.snapshot.gc.*A playlist-pinned VideoItem remains readable after current field replacement and GCTransitive closure
playlist.hls.emission.*HLS .m3u8 emission is byte-identical for the same playlist and shim base URITranslation determinism

8.5.5 New ObjectKind path-grammar coverage

CategoryPass criterionCoverage
path.parser.items.*<timeline>/<modality>/items/<hash> parses to ItemManifest ObjectKindAll 6 new slots
path.parser.playlist.*<timeline>/<modality>/playlist/<hash> parses to RenditionPlaylist
path.parser.graph-index.*graph-index/<hash> parses to GraphIndex
path.parser.graph-page.*<timeline>/<modality>/graph-page/<hash> parses to GraphPage
path.parser.vector-compressor.*vector-compressor/<hash> parses to VectorCompressor
path.parser.federation-manifests.*federation-manifests/<hash> parses to FederationManifest

8.6 Test Categories — Phase-4 ObjectKinds and Verbs

Phase-4 specifications (0015, 0016, 0017, 0018, 0019) introduce hybrid retrieval, streaming freshness, schema evolution, multi-tenancy, and encryption. Conformance for them is OPTIONAL for pre-Phase-4 SDKs and REQUIRED for SDKs claiming the corresponding Phase-4 capability. Categories without shipped vectors remain known targets; 0019 now has mandatory format vectors in §8.6.5.

8.6.1 0015 — Hybrid retrieval

CategoryPass criterionCoverage
hybrid.rrf.scale-invariance.*Same RRF score regardless of sub-query score scalesBM25+cosine; cosine+bm25-plus
hybrid.planner.deterministic.*Same Manifest + stats + query → same planMulti-implementation
hybrid.prefilter.threshold.*Selectivity <1% → pre-filter chosen; >1% → post-filterAdversarial stats
hybrid.required.elimination.*required:true sub-query eliminates non-matching candidatesBoolean-AND semantics
hybrid.bm25.fp32-determinism.*BM25 scores bit-identical across implementationsScalar reference vectors
hybrid.colbert.maxsim.*MaxSim aggregation matches reference (within fp32 left-fold discipline)dim=128 reference corpus
hybrid.colbert.composite-anchor.*Canonical modality and checked document/token anchor arithmetic agreeRound-trip, final complete window, invalid tail and ordinal
hybrid.colbert.reopen-exact.*Write, reopen and query ranks by sidecar f32 even when decoded-code order differsPublic Dataset path; lossy compressor
hybrid.splade.encoder-validation.*TextIndex with SPLADE algorithm validates encoder_hash against registryEncoder mismatch → critical error

8.6.2 0016 — Streaming freshness

CategoryPass criterionCoverage
hotshard.append.flush-threshold.*Buffered items exceeding threshold trigger Track rewriteBoundary cases
hotshard.append.ttl.*TTL expiry forces flush even below thresholdClock-skew injection
hotshard.read.merge.*Query merges Track + HotShard candidates correctlyTime / vector / scalar predicates
hotshard.staleness.consumer-tolerance.*max_staleness_seconds honored; refresh triggered on missAll staleness levels
fresh-vamana.append-search.*After N appends, recall@10 stays within 5% of full-rebuild baselineN ∈ {10K, 100K, 1M}
fresh-vamana.consolidation.recall.*Post-consolidation recall returns to full-rebuild baselineAfter 10× threshold of appends
fresh-vamana.tombstone.delete.*Tombstoned items absent from query results; remain in graph until consolidationMixed insert/delete
index-health.drift-metric.*Drift metric monotonically tracks distribution shiftSynthetic drift injection
index-health.recommended-action.*Threshold transitions produce correct recommended_action transitionsAll policy levels

8.6.3 0017 — Schema evolution

CategoryPass criterionCoverage
evolve.multi-version-registry.*Registry with v1 + v2 both query correctlyBoth versions, independent queries
evolve.reencode.resumable.*Crash mid-Reencode + resume produces same final state as uninterrupted runFailure injected per-batch
evolve.reencode.checkpoint-monotonic.*last_anchor strictly increases across batchesAdversarial batch orderings
evolve.planner.all-versions-fallback.*version_preference: "all" fills v2 coverage gap with v1 scoresPartial coverage scenarios
evolve.gc.decommission-v1.*After v1 removed from registry, its Objects become eligible after safety thresholdStandard GC test
evolve.compatible-with.semantics.*coverage: "complete" means every v1 Item present in v2; verifier assertsMixed coverage states

8.6.4 0018 — Multi-tenant

CategoryPass criterionCoverage
tenant.quota.storage-507.*Storage cap exceeded → HTTP 507 + correct DreamDB-Quota headerMultiple storage types
tenant.quota.rate-429.*Rate limit exceeded → HTTP 429 + Retry-After headerPer-resource rate
tenant.token.tenant-id-mismatch.*Token tenant_id ≠ Space tenant_id → HTTP 403All scope levels
tenant.token.cross-tenant-isolation.*Token from tenant A can never access tenant B's pathsNegative test
tenant.usage-batch.publish-cadence.*Batches emitted on schedule; chain of previous_batch links unbrokenMulti-window scenario
tenant.usage-batch.violations-recorded.*429/507 events surfaced in subsequent batch's violations arrayAdversarial load
tenant.fair-share.anti-monopoly.*One tenant cannot capture >50% capacity when other tenants are activeMulti-tenant load test
tenant.federation.cross-issuer.*Federation hop preserves tenant_id; no escalationCross-issuer scenarios
tenant.offboarding.gc.*After quota=0 + retention window, all tenant Objects reclaimedStandard GC + retention

8.6.5 0019 — Data-plane encryption

0019 is a normative wire format, but the reference Dataset/SDK does not yet implement it. The vectors in dreamdb-conformance/vectors/0019/ are mandatory for any implementation claiming Lineage-v3 encryption capability. Passing them establishes the deterministic format and cryptographic decisions below; it does not certify a cloud KMS adapter, key-destruction procedure or plaintext-handling environment.

CategoryPass criterionCoverage
encryption-envelopeCanonical header/envelope bytes, address and decrypt result match; malformed, unauthenticated or address-substituted input produces the named refusalConvergent, randomized, empty and multi-chunk Objects
enc.convergent.dedup.*Same plaintext and DWK produce identical bytes/address; another DWK differs; sealed hash+DEK is recoverable without prior plaintextDomain-scoped equality
enc.randomized.uniqueness.*Supplied distinct fixture DEKs produce distinct envelopes and both decryptTwo logical writes
enc.aead.tamper-detect.*Modified authenticated header or sealed chunk is refused before plaintext is returnedHeader + ciphertext bit flips
enc.range.chunk.*Prefix/header and requested chunk ranges are Bao-bound to the expected envelope address before AES-SIV decryption; an Object substituted from the same domain is refused; empty plaintext has one 16-byte sealed chunkFirst/middle/final/empty/substitution
enc.key-bundle.*AES-KW integrity and convergent P/DEK re-derivation are enforcedCorrupt wrap + mismatched bundle
enc.lineage-v3-policy.*CLOSED policy/slot shapes, canonical slot order and mode/suite/domain agreement are enforcedPositive + malformed declarations

The vector runner supplies a raw DWK as the result of a successful fixture KMS slot. That is an input to the protocol algorithm, not a substitute test for KMS authentication. KMS call rate, key-cache hit ratio and throughput belong to implementation operations/performance evidence, not conformance.

8.6.6 Phase-4 path-grammar coverage

CategoryPass criterionCoverage
path.parser.text-index.*<timeline>/<modality>/text-index/<hash> parses to TextIndexAll grammar cases
path.parser.text-index.posting.*<timeline>/<modality>/text-index/posting/<hash> parses to TextIndex pageTwo-segment disambiguation
path.parser.hot-shard.*<timeline>/<modality>/hot-shard/<hash> parses to HotShardAll grammar cases
path.parser.tenant-usage.*tenant-usage/<hash> parses to TenantUsageBatchTop-level namespace
path.parser.tenant-usage-refs.*tenant-usage-refs/<tenant_id> parses to TenantUsageRefTop-level refs namespace

8.7 0021 — Compaction

Categories for the bucket/tombstone compaction pass (0021). Several overlap the §8 merge categories — compaction must preserve query results exactly (0008 §5.3 read-equivalence).

CategoryPass criterionCoverage
compact.multi-bucket-read.*Append N batches into k cells, query → top-K matches brute forceLSM multi-fragment-per-cell
compact.idempotence.*Compacting an already-consolidated dataset is a no-opRe-compact stability, including a dataset consolidated to K > 1 by the payload cap
compact.capacity.*A cell's merged output is cut into K = ceil(N / C) Buckets, each within bucket_max_bytes of record payload, with the exact sidecar cut at the same boundariesOver-cap merge split; oversized singleton repaired below threshold; bucket_max_bytes range and threshold=0 refused before any write
compact.correctness.*Queries return the same anchors pre- and post-compactionPairs with §8 dag.merge-equivalence
compact.lineage-refusal.*Compaction across a SpatialIndex-hash change fails with the documented errorNegative test
compact.anchor-conflict-refusal.*Two fragments with the same time_anchor but different vectors → fail loudlyNegative test
compact.read-online.*A query started against the OLD Manifest while compaction runs completes correctlyConcurrency

8.8 0022 — Fragment packs

Categories for many-Items-per-Object packing (0022); the byte-range reader obligation is 0002 §6.5.4.

CategoryPass criterionCoverage
pack.roundtrip.*Write N items with pack_items=k → ⌈N/k⌉ packs → read back byte-equalWhole-pack round-trip
pack.mixed-batches.*Batches with different N each → separate packs; item count matchesPer-batch packing
pack.per-field-independence.*Packed + unpacked Fields in one Schema → independent pack_itemsSchema-level isolation
pack.reject-pack-plus-chunk.*pack_items > 1 AND chunk_size on one Field → writer MUST refuse OR degrade to chunkingNegative test
pack.byte-range-fetch.*Single-item GET with pack_offset returns exactly [pack_offset, pack_offset + byte_size)Pairs with §5.4 track-object 6-tuple

8.9 0020 — Tombstones (read-side deletion)

Categories for the legacy TombstoneListObject, the persistent paged TombstoneIndexObject, and the read-side suppression filter (0020). The byte-format categories are vector-gated (dreamdb-conformance/vectors/0020/); the suppression/time-travel behavior is a behavioral assertion. Physical reclamation is delegated to 0021 (see §8.7) per 0020 §6.

CategoryPass criterionCoverage
tombstone.list.roundtrip.*TombstoneListObject → canonical CBOR encode/decode/re-encode byte-identical, decoded == originalAnchors+parents; parent-only "caught-up" marker
tombstone.list.sort-invariant.*Anchors stored strictly ascending; decoders REJECT unsorted / duplicate anchor bytesSort normalization + rejection
tombstone.index.roundtrip.*Tombstone index head plus leaf/internal pages encode/decode/re-encode byte-identically; malformed bounds or summaries are rejectedTimeline-scoped head, parent link, canonical pages, range summaries
tombstone.read.suppression.*A query at the deleting Manifest does NOT return tombstoned anchors across any modalityBehavioral (Item-scoped suppression)
tombstone.read.time-travel.*A query at a pre-deletion Manifest STILL returns the anchors (suppression resolves at the read Manifest's registry)Behavioral (0020 §5)
tombstone.dag.parent-walk.*Effective tombstone set = breadth-first union over the parent DAGIncremental deletion

8.10 0011 — Scalar indexing

Categories for native scalar filtering (0011). v0.2 retains dreamdb.bitmap-categorical for categorical / bool equality and adds byte-pinned value-keyed B-trees for integer/timestamp, finite-float and UTF-8 lexical ordering.

CategoryPass criterionCoverage
scalar-index.roundtrip.*ScalarIndex Object (bitmap or built-in B-tree params) → pinned canonical CBOR bytes and byte-identical round-tripVector-gated (vectors/0011/)
scalar-btree-page.roundtrip.*Leaf/internal page → pinned canonical CBOR bytes, hash, ordering and byte-identical round-tripVector-gated (vectors/0011/)
scalar.bucket.roaring-roundtrip.*Per-value RoaringTreemap anchor set encodes/decodes order-independent + deterministicdreamdb-dataset util.rs tests
scalar.query.categorical-eq.*Pure Filter::Where (no Vector/TimeRange) returns exactly the anchors whose categorical value matchesBehavioral (in suite)
scalar.query.intersect-with-vector.*Where intersected with a Vector clause narrows the top-K to matching scalarsBehavioral (vector path)
scalar.query.undeclared-field-error.*Where on an undeclared / non-Scalar field is a clear schema errorNegative test
scalar.btree.range.*Narrow ordered predicate returns exact anchors while fetching fewer than all published scalar index pagesBehavioral (Dataset public entry)

8.11 0024 — Embedding spec identity

CategoryPass criterionCoverage
embedding.spec-id.*Canonical identity_basis CBOR hashes to the full 53-character lowercase base32 multihash carried by exactly one spec= parameterValid identity; truncated, malformed, repeated, and mismatching IDs
embedding.membership.*An implementation record joins a spec_id only by clearing 0024 §4 against that basis's own realization_commitment, recomputed from the realization_manifest the embed_spec carriesSame basis with differing implementations; anchor change from failed parity; sub-threshold parity; probe set under 1,000; commitment not matching its manifest
embedding.modality-grammar.*The canonical model hint and full spec_id produce a modality accepted by 0002 §5.1Underscore model spelling; superseded hyphen spelling rejected

Vectors in the embedding-spec-identity category spell realization_commitment, parity.against and artifact digests in the canonical base32 string form of 0002 §8.1, and parity.mean_f64le / parity.min_f64le as 16 lowercase hex characters — the 8 bytes of the IEEE-754 binary64 value, little-endian. A runner decodes both vector spellings locally, because the shared JSON-to-CBOR vector helper has no byte-string convention and teaching it one would change how every other category decodes. The hash-bearing digest fields are promoted to byte strings before canonical encoding; the statistics are decoded straight to binary64 for the threshold comparison and are never rebuilt as CBOR here. No CBOR float appears anywhere in the category, in keeping with 0002 §3.1.5.

Every vector nests the CLOSED embed_spec of 0024 §3 — identity_basis, realization_manifest, implementation_records — under an embed_spec key, with fixture metadata (test_id, category, modality, the expectations) outside it. The nesting is what makes the CLOSED check meaningful: at the document root an unknown fourth wire key cannot be told apart from a new metadata key, so a runner reading the three fields from the root would declare the container closed while accepting anything.

implementation_records is always an array, never a singleton shorthand, never empty, and sorted ascending by each record's canonical CBOR bytes with byte-identical entries refused. Computing that order is the one place in the corpus where a record is encoded as the Manifest would carry it — base32 digests and the two hex statistics resolved to their byte strings first.

A runner recomputes the threshold verdict from the stated mean_f64le, min_f64le and count rather than trusting a verdict stated in the record, and checks the structural rules of 0024 §3.2 — including that the vector's realization_manifest hashes to the realization_commitment its identity_basis declares. It does not execute an encoder and therefore does not compute parity itself; the measurement of 0024 §4 is out of scope for the vector corpus.

8.12 0025 — Typed Array Items

CategoryPass criterionCoverage
typed-array.declaration.*CLOSED dense-array declaration encodes canonically and hashes to the complete item= multihashFull identity; unknown fields and overflow refused
typed-array.modality.*Tag projections, parameter order, and legal kind/storage pairs agree with the declarationMissing parameters, projection mismatch, illegal pair, truncated identity
typed-array.payload.*raw has exactly product(shape) × sizeof(dtype) bytes; NPY redundantly agrees on dtype, byte order, shape, and layoutRaw length plus NPY accept/mismatch vectors
typed-array.sdk.*Dataset and public SDKs write and read typed arrays without MIME inferenceVector-gated dtype/shape/endianness/layout decode in Python + WASM/TS; public Event and Constant round-trips; WASM-written storage independently read by Rust
post-v1-array.ragged.*CLOSED ragged-array v1 declaration hashes to a complete identity and its offsets-values payload obeys the declared row/cell boundaryPositive identity/payload; malformed offsets and value length
post-v1-array.csr.*CLOSED sparse-csr v1 declaration hashes to a complete identity and its CSR payload has a canonical row/column representationPositive identity/payload; malformed row offsets, duplicate and out-of-range columns

The post-v1 vectors are executable format references, not evidence that a Dataset or SDK writer exists. Dense-v1 vectors and bytes are unchanged.

8.13 0027 — Progressive geometry

geometry-item vectors supply canonical descriptor bytes as cbor_hex and require either byte-identical decode/re-encode with expected_family, or the specific expected_error. They invoke the actual CLOSED protocol decoder; they do not establish Dataset publication, range authentication or GC behavior. Those claims are exercised separately at the public Dataset and SDK boundary.

9. Test Categories — End-to-End Worked Example

A full end-to-end test that exercises the entire spec in one scenario:

test_id: e2e.video-search.0001
description: Ingest a 10-minute video; embed; query "moment of interest"; stream.

Setup:
  - Backend: MinIO localhost:9000.
  - Storage Connector: HTTP/1.1 or later (the HTTP/2 variant exercises the `0023` performance profile, not conformance).
  - SDK: any conformant Protocol Component.

Steps:
  1. Open(backend, "main") — should be cold; LIST manifests/ to bootstrap.
  2. Append(video.h264, [600 fragments × 1s each]) — single-shot or paged.
  3. Layer(embedding.f32.dim=768.bucketed.spatial_bits=18, derived from video).
  4. Append(title.text, ["Test Recording"]).
  5. Publish — advance refs/main via CAS.
  6. (Disconnect the SDK, wait 5 s, reopen — verify Ref freshness.)
  7. Open(backend, "main") — fetches the new Manifest.
  8. Query(embedding modality, query_vector, k=5, recall=0.9) — measure latency.
  9. Stream(video, time_range around top result, +/- 5 s) — verify decoder accepts.
  10. (Run GC with 24h threshold; verify nothing reachable was deleted.)

Conformance criteria (normative — pass/fail, environment-independent):
  - All HTTP responses match expected status codes.
  - Manifest published is reachable from refs/main.
  - GC preserves all Objects reachable from the test's Manifest.
  - Throughout: ZERO LIST HTTP requests on the hot path (Manifest Supremacy).

Performance-profile targets (informative — advisory, NOT pass/fail; see 0023):
  - Cold-start query latency < 200 ms p95.
  - Hot-path subsequent query (same SDK session) < 100 ms p95.
  - Stream first-byte < 100 ms.

10. Conformance Suite Repository

The actual reference corpus and runner live in this repository:

dreamdb-conformance/
├── src/                — reference vector dispatch and checks
├── tests/              — behavioral and corpus integration tests
└── vectors/            — spec-numbered portable inputs and expected outputs

Vectors use the JSON conventions in §4 and category-specific sections, with binary companion files where needed. The Rust runner is one implementation; sharing it across language bindings does not constitute an independent port.

A v0 implementation publishes a conformance report (a structured JSON document listing which test categories passed/failed) and a chosen Tier ("ContentStore-Conformant Backend," "Full Protocol Component," etc.) when claiming DreamDB compatibility.

11. Self-Certification

Until a formal conformance authority exists, implementations self-certify:

  1. Run the conformance suite against your implementation.
  2. Publish the resulting report (machine-readable JSON + human-readable summary).
  3. State your claimed Tier in the README.
  4. Cite the spec version (e.g. "DreamDB v0.1.0").

Conformance and performance are reported separately. The Tier in step 3 is a pass/fail conformance claim (it covers only the conformance criteria of §4.4). An implementation MAY additionally publish the performance profiles (0023-performance-profiles.md) it meets, each with the workload and environment it was measured under. A profile that is unclaimed or unmet never affects the conformance Tier — an implementation can be fully conformant while meeting zero performance profiles.

The community SHOULD maintain a public list of self-certified implementations and their reports. Discrepancies between claimed and actual conformance can be challenged via the public report; this is the same model used by Web Platform Tests, IETF interop reports, and similar.

A formal certification authority MAY emerge in v0.1+; v0 leans on community-maintained transparency.

12. Compatibility Across Spec Revisions

DreamDB spec versions follow semantic versioning:

  • Patch (v0.1.x → v0.1.y): clarifications, OQ resolutions, conformance test additions. Existing implementations remain conformant.
  • Minor (v0.1 → v0.2): feature additions (new modalities, new algorithms, new optional verbs). Existing implementations remain conformant for the subset they support; new features are opt-in.
  • Major (v0 → v1): breaking changes. Implementations MAY support multiple major versions in parallel via a version-prefixed namespace (TBD in v1).

Within v0:

  • v0 freezes the data model, address grammar, time encoding, hash function, and HTTP contract.
  • v0.1+ MAY add: new spatial-indexing algorithms (dreamdb.pq-ivf, dreamdb.lsh-l2, dreamdb.learned-mlp-v1), additional modalities (AV1, HEVC, FLAC, sensor types), federation primitives, named tags, push-style notifications.

13. Open Questions Resolved by This Document

This document explicitly resolves:

  • OQ-11 (concrete CBOR tag numbers): § 3.2.
  • OQ-12 (multihash algorithm tags — IPFS-aligned): § 3.1.
  • OQ-17 (concrete value for the time-anchor CBOR tag): § 3.2 — folded into local dreamdb.tag = 65521, by application agreement on number and inner type; not used inside DreamDB schemas or claimed globally registered.

The category taxonomy answers the original requests to specify what conformance must cover. It does not prove corpus completeness, an executed result or independent-implementation agreement. Capability-specific unfinished vector questions remain in their owning specs and in INDEX.md.

14. Open Questions Not Resolved

Two operational decisions deferred to community / operator coordination:

  • OQ-42 (→ community / future spec): Public registry of conformance reports. v0 is self-certification only; a formal authority may emerge.
  • OQ-43 (→ community / future spec): Publication cadence for the conformance suite repository. v0 is unscheduled — releases tied to spec revisions.

End of v0 specification. Implementations interested in v0 conformance should start with 0000-overview.md, build forward through 0001–0008, and verify against the test categories in this document.