# v0.83.0 — DVM Semantic Fidelity Gate

> **Status:** Planned
> **Scope:** Very Large
> **Blocked by:** [v0.82.0](v0.82.0.md)
> **Driven by:** August 2026 pre-scaling hardening review
> **Renumbered:** previously planned as v0.81.2. It rejects query forms that
> are accepted today and changes the persisted composite row-identity encoding,
> forcing reinitialisation of affected stream tables — breaking changes that do
> not belong in a patch release.

## Theme

Make DIFFERENTIAL and IMMEDIATE results obey PostgreSQL semantics across the
currently supported operator surface. Where a proof is not yet available,
AUTO must use FULL and explicit incremental modes must fail with an actionable
error. Silent approximation is never an acceptable fallback.

## Non-Goals

- No new SQL operators or aggregate families.
- No expansion of the documented DVM support matrix.
- No performance work unless it is required to preserve semantics safely.

## Items

### DVM-81-1: Set-Operation State Is Not User Data

Separate INTERSECT and EXCEPT multiplicity state from the user-visible stream
table. Direct `SELECT` results must exactly match PostgreSQL, including invisible
values and the repeated rows required by `INTERSECT ALL` and `EXCEPT ALL`.
Preserve one-sided counts when visibility crosses zero so later changes can
restore rows correctly.

Until that representation is proven, AUTO uses FULL and explicit DIFFERENTIAL
or IMMEDIATE creation rejects these forms.

### DVM-81-2: Positional and NULL-Safe Set Semantics

Bind set-operation branches by ordinal position, not by the first branch's
column names. Initialize and update state with NULL-safe equality using `IS NOT
DISTINCT FROM`, including composite rows and branches with different aliases.

### DVM-81-3: Nullable Aggregate Fidelity

Track non-NULL input counts for every algebraically maintained non-DISTINCT
`SUM`, not only FULL JOIN cases. Preserve SQL's NULL result for non-empty groups
whose inputs are all NULL and for groups whose final non-NULL value is removed.
Cover `FILTER` and expressions that wrap `SUM` in `COALESCE`.

Cast statistical aggregate operands to their accumulator type before computing
squares or cross-products so valid `STDDEV`, `VAR`, `CORR`, `COVAR`, and `REGR`
inputs cannot overflow in a narrower source type.

### DVM-81-4: Scalar Subquery Cardinality

Remove injected `LIMIT 1` behavior from scalar-subquery snapshots. A defining
query that produces multiple scalar rows must raise PostgreSQL's cardinality
error atomically, without changing stream-table data or advancing its frontier.

### DVM-81-5: LATERAL Dependency and Identity Safety

Reject unsupported IMMEDIATE LATERAL inner-source mutations until transition
tables drive the affected-outer-row branch correctly. Compute the complete set
of outer dependencies and identity keys, preserve required hidden identity
state, and never emit a broad `TRUE` deletion join when projected output does
not retain outer identity.

LATERAL precomputation is allowed only when all outer references are covered or
functionally determined by its grouping keys.

### DVM-81-6: Volatility and Rewrite Validation Fail Closed

Treat STABLE expressions as unsupported for incremental maintenance unless an
operator-specific proof shows unchanged rows remain semantically valid. AUTO
uses FULL; explicit DIFFERENTIAL and IMMEDIATE reject unsafe cases.

Complete volatility inspection across ORDER BY, FROM, GROUP BY, HAVING,
LIMIT/OFFSET, LATERAL, JSON_TABLE-like expressions, and overloaded operators.
An uninspectable expression or AST conversion failure must return a controlled
fallback/error, never silently substitute `TRUE` or `NULL`.

### DVM-81-7: Sound Circular Monotonicity Admission

Conservatively reject LEFT/FULL joins, scalar subqueries, and LATERAL subqueries
inside circular dependencies unless a specific monotonicity proof exists.
Admission rules must reflect whether adding input can remove or replace output,
not merely recurse through child operators.

### DVM-81-8: Collision-Free Row Identity Encoding

Replace delimiter-only composite hash encoding with an unambiguous framed or
escaped encoding. Define migration behavior for persisted row IDs and CDC
primary-key hashes so existing stream tables are safely reinitialized when the
encoding changes.

## Release Gate

v0.83.0 will not ship until all of the following pass:

- Direct reads match PostgreSQL for INTERSECT, EXCEPT, and both ALL variants
  across initialization and repeated visibility-boundary crossings.
- Differing branch aliases and NULL-containing composite rows pass every set
  operation in FULL and incremental modes.
- Property tests compare DIFFERENTIAL with FULL after every INSERT, UPDATE, and
  DELETE for nullable SUM, scalar subqueries, and LATERAL queries.
- Scalar cardinality violations leave data and frontiers unchanged, then recover
  after the source is corrected.
- Volatile and STABLE expressions in every supported clause either prove safe or
  produce the documented FULL fallback/rejection.
- Circular queries containing non-monotone operators are rejected while the
  proven monotone fragment remains accepted.
- Statistical aggregate boundary tests and adversarial composite-key hashing
  pass with production types and production hash functions.

Any unexplained DIFFERENTIAL-versus-FULL mismatch is a release blocker.
