# v0.87.15 — Versioned Row Identity V2 Contracts > **Plain-language companion:** [v0.87.15.md](v0.87.15.md) **Status: Implemented.** Derived from [ROADMAP.md](../ROADMAP.md). ## Release theme Freeze a portable, typed, exact row-identity contract before later releases change storage or DVM integration. v0.87.15 adds the V2 wire specification, domain and scalar registry, canonical encoder/probe helpers, validation rules, and independent golden vectors. Existing V1 storage, CDC, and refresh paths remain unchanged. ## Implementation status | ID | Title | Status | |---|---|---| | ROWID-1 | Freeze the V2 wire format | ✅ Done | | ROWID-2 | Add the extension-wide type and domain registry | ✅ Done | | ROWID-3 | Implement typed datum encoding | ✅ Done | | ROWID-4 | Validate identity schemas and source keys | ✅ Done | | ROWID-5 | Publish reproducible identity vectors | ✅ Done | | CORR-1 | Prove equality and injectivity contracts | ✅ Done | | CORR-2 | Enforce prefix-free tuple framing | ✅ Done | | CORR-3 | Verify canonical special values | ✅ Done | | STAB-1 | Bound encoder resource usage | ✅ Done | | STAB-2 | Classify unsupported inputs explicitly | ✅ Done | | STAB-3 | Preserve backend error safety | ✅ Done | | PERF-1 | Keep fixed-width encoding allocation-light | ✅ Done | | PERF-2 | Keep dispatch resolution bounded | ✅ Done | | PERF-3 | Establish encoder coverage for later benchmarks | ✅ Done | | SCAL-1 | Keep registry resolution bounded | ✅ Done | | SCAL-2 | Bound structural recursion | ✅ Done | | SCAL-3 | Exercise all identity domains | ✅ Done | | UX-1 | Document identity support and rejection | ✅ Done | | UX-2 | Explain identity validation failures | ✅ Done | | UX-3 | State the opaque identity contract | ✅ Done | | TEST-1 | Maintain independent golden vectors | ✅ Done | | TEST-2 | Cover equality-sensitive canonical values | ✅ Done | | TEST-3 | Cover validation and backend reuse boundaries | ✅ Done | ## Delivered files - [ROW_IDENTITY_V2.md](../docs/ROW_IDENTITY_V2.md) — normative wire contract. - `src/dvm/row_id_v2.rs` — registry, validation, scalar encoders, probe, and SQL entry points. - `tests/fixtures/row_id_v2_vectors.json` and `tests/row_id_v2_vectors.rs` — reviewable exact-byte corpus and spec checks. ## Exit criteria - [x] Normative V2 wire and probe specifications are checked in and linked. - [x] Registry entries accept only explicitly supported PostgreSQL 18 types. - [x] Structural families without a proven V2 contract are rejected. - [x] Typed encoding is exact, prefix-free, deterministic, and has no hash identity fallback. - [x] Numeric, interval, NULL, escaping, floating-point, network, bit-string, enum, and source-key validation rules have coverage. - [x] Resource limits and contextual errors are enforced. - [x] V1 storage, CDC, and DVM production paths remain unchanged. - [x] Version synchronization and repository lint checks pass. ## Follow-up v0.87.16 consumes this contract in storage and refresh paths. It must preserve the assigned bytes and require explicit recreation or migration for any V1 to V2 state transition.