VER 1.0 — The Visual Embedding Recordstable
§6 Layer 1 — Canonical Visual Embeddings and Embedding Space Descriptors
Every vector in a Record is bound to an Embedding Space by space_id. A Record MUST contain at least one embedding with role: "canonical_visual" in a space of kind: "visual", computed from the Canonical Buffer and nothing else.
6.1 Space Descriptor Fields
| Field | Definition |
|---|---|
space_id | Globally unique, immutable identifier: reverse-DNS + "/" + semver, e.g. org.verstandard.space.openclip-vit-l14-datacomp-xl/1.0. |
kind | visual | text | fused. |
model | family, architecture, checkpoint identifier, and weights_sha256. Weight pinning is mandatory. |
dim / dtype | Vector dimensionality; fp32 | fp16 | bf16 | int8 | binary. |
normalization | l2 | none (whether stored vectors are unit-norm). |
metric | cosine | dot | l2 — the metric under which distances are meaningful. |
preprocessing | Visual: exact resize policy, interpolation, antialias flag, crop, mean, std, channel order. Text: tokenizer id + hash, max length, truncation, casing. This is the model-specific half that CPNP deliberately excludes. |
reference | URI of a published reference image set and reference vectors, plus a conformance tolerance (§6.2). |
provenance | Publisher, publication date, license. |
6.2 Rules
- Descriptors are immutable once published. New weights, preprocessing, dtype, or metric ⇒ new
space_id. This prevents silent model drift. - Reproducibility is defined by tolerance, not bit-exactness: an implementation conforms to a space iff its mean cosine similarity against the published reference vectors meets the declared tolerance (RECOMMENDED ≥ 0.999 for fp32 profiles; quantized profiles declare their own). This absorbs GPU, CUDA, TensorRT, and ONNX runtime nondeterminism honestly instead of pretending it away.
- Multiple canonical embeddings across different spaces MAY coexist in one Record — this is the sanctioned migration path during model transitions (dual-embed, then retire the old space).
- Vectors MAY be inline (float array), base64 (dtype-tagged, little-endian), or by reference
{ uri, sha256, byte_length }for large-vector hygiene.
