# v0.38.0 — EC-01 Correctness Sprint (Hard Gate)

> **Full technical details:** [v0.38.0.md-full.md](v0.38.0.md-full.md)

**Status: Released** | **Scope: Medium** | **Release Gate: EC-01 property convergence proof passed**

> **v0.38.0 will NOT ship until EC-01 (join phantom rows) is proven closed** with
> a comprehensive DIFF-vs-FULL property test suite covering Q07/Q15-style joins.
> This is a dedicated correctness sprint with a single focus: make join deltas
> always-deduplicated and prove convergence.

---

## What is this?

EC-01 has been labeled "critical" since v0.20.0 (6+ releases) but keeps sliding.
**v0.38.0 stops the deferral pattern.** This release is explicitly scoped to
close EC-01 and nothing else. There are no other features, no operational docs,
no SQLSTATE rollout — just the join phantom rows fix and its proof.

The release is gated: v0.38.0 will be tagged only when:
1. Join deltas unconditionally return `is_deduplicated: true` (or are cleaned
   by unconditional PH-D1) for all join shapes
2. A property generator runs thousands of random insert/update/delete sequences
   and proves DIFF result set == FULL result set for every cycle
3. Q07 and Q15 no longer need to be in the skip allowlist
4. All prior phantom-row accumulation is resolved

---

## EC-01 Correctness: The Lead (and Only) Item

**C38-1 — Unconditional PH-D1 cleanup plus join row-id convergence (P0, L effort).**

Join deltas still return `is_deduplicated: false`, allowing phantom rows to
accumulate across cycles. v0.38.0 fixes this by:

1. Making PH-D1 cleanup unconditional for all non-deduplicated join outputs
2. Reworking the join row-id formula so Part 1a, Part 1b, and Part 2 converge
   on the same logical identity across pre/post images
3. Wiring `RowIdSchema` verification into the DVM planner so incompatible
   pipelines fail at plan time, not at result time

**Verification:** DIFF-vs-FULL equivalence test, not just absence of obvious
duplicates. After every refresh cycle, the result set must be byte-identical to
a full refresh.

---

## Test Coverage: EC-01 Property Generator (Blocking Gate)

**T-C38-1 — EC-01 DIFF-vs-FULL property generator for joins (P0, L effort).**

Add a dedicated property generator that:
- Runs thousands of random insert/update/delete sequences
- Covers left/right co-deletes, scalar-subquery joins, Q07/Q15-inspired shapes
- After every cycle, compares DIFF result set against FULL result set
- Fails the release if any row-set divergence is detected

This test now runs as `e2e_ec01_property_tests` and must pass with 100%
success before v0.38.0 is tagged.

---

## What's NOT in v0.38.0

Operational truthfulness, backpressure semantics, wake docs, SQLSTATE rollout,
generated configuration, and all other items from the previous v0.38.0 plan have
moved to **v0.39.0** so this release can maintain singular focus on EC-01.

**Why?** Correctness is the foundation. Operational polish without correctness
is just prettier wrong answers.

---

## Release Confidence

> **Release-order note:** The old embedding-pipeline v0.38.0 plan is not being
> dropped. It moves to v0.41.0+ after the hardening arc in v0.38.0-v0.40.0.
>
> **Deferral protection:** If EC-01 is not closed when v0.38.0 window closes,
> the release is postponed, not the feature. No more "EC-01 will ship next time".

---

*Previous: [v0.37.0 — Scheduler Modularisation, pgVectorMV & OpenTelemetry](v0.37.0.md)*
*Next: [v0.39.0 — Distributed Hardening & Diagnostic Depth](v0.39.0.md)*
