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