Decision (DeVaris, 2026-08-30): v0.20 ships the DISCLOSE option — the halt message tells the operator the first record under the new schema shape is not delivered. The no-drop design is the follow-up.
Current mechanism: the drift marker emits at the first new-shape DML's LSN (pgoutput delivers RelationMessages with WALStart 0, so the marker cannot carry the relation-message LSN — D1 deviation). That boundary DML is D4-skipped in-run and dropped at the wire on restart (subscription.go WALStart <= StartLSN guard). One record per halt episode, position claims it was covered.
No-drop design: deliver the boundary DML as a normal record immediately BEFORE the marker in the same batch, so the position's semantics hold and nothing is lost. Changes batch/ack semantics on the drift path — needs its own review cycle, not a squeeze into B1.
Ref: PR #329, design doc 20260829-dbz3-b1-schema-drift-escape-hatch.md (D1/D4/D5/FM3).
Decision (DeVaris, 2026-08-30): v0.20 ships the DISCLOSE option — the halt message tells the operator the first record under the new schema shape is not delivered. The no-drop design is the follow-up.
Current mechanism: the drift marker emits at the first new-shape DML's LSN (pgoutput delivers RelationMessages with WALStart 0, so the marker cannot carry the relation-message LSN — D1 deviation). That boundary DML is D4-skipped in-run and dropped at the wire on restart (subscription.go WALStart <= StartLSN guard). One record per halt episode, position claims it was covered.
No-drop design: deliver the boundary DML as a normal record immediately BEFORE the marker in the same batch, so the position's semantics hold and nothing is lost. Changes batch/ack semantics on the drift path — needs its own review cycle, not a squeeze into B1.
Ref: PR #329, design doc 20260829-dbz3-b1-schema-drift-escape-hatch.md (D1/D4/D5/FM3).