# monSQLize v3.1.0-rc.0

> Release status: Local rehearsal candidate; not published, tagged, pushed, or committed.
> Candidate date: 2026-07-15

## Purpose

This candidate validates monSQLize against the identity-bound local `schema-dsl@3.0.0-rc.0` tarball. npm `latest` remains `monsqlize@3.0.0`; final `3.1.0` publication requires schema-dsl v3 GA plus the repository's normal release authority and external checks.

## Changes

- Pins the rehearsal dependency to `schema-dsl@3.0.0-rc.0` and continues to use only the isolated `schema-dsl/runtime` integration for Model compilation and validation.
- Narrows the upstream validation bridge to `valid`, `data`, and canonical `errors[].path/message/keyword`; monSQLize no longer consumes schema-dsl's deprecated `field/type/expected` aliases.
- Keeps `Model.validate()` public results stable as `{ valid, errors: [{ field, message }], data }`, mapping `field` from upstream `path`.
- Persists successful normalized `data` for `insertOne`, `insertMany`, `insertBatch`, `replaceOne`, `findOneAndReplace`, and hydrated document `save()`.
- Applies bulk defaults before before-hooks, performs schema normalization before timestamps/version fields, and validates replacements before optimistic-lock reads.
- Rejects valid results whose normalized `data` is null, primitive, or an array before any driver operation. Failed validation data snapshots are never written.

## Deliberate boundaries

- Update operators and pipelines do not represent a complete final document and are not included in normalized-data persistence.
- `isRequired()` / `isOptional()` are not required by monSQLize and are not added to schema-dsl for this migration.
- This candidate is evidence only. It is not a release authorization and must not be published.
