From b36f2300d6f67ce62ab8aece722697a3a85ad3e4 Mon Sep 17 00:00:00 2001 From: Vignesh Narayanaswamy Date: Mon, 22 Jun 2026 21:25:30 -0700 Subject: [PATCH] chore: bump version to 0.7.6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Release the unreleased delta since v0.7.4: - #26 — skip schema DDL on write-init when tables exist + SQL fallback for the bulk write path, so a least-privilege role (INSERT/UPDATE/SELECT) can write without schema-ownership DDL grants. - #23 — propagate connector-discovered status to the model row. Also relabels the stale top "Unreleased" CHANGELOG block as v0.7.4 (it shipped in the v0.7.4 release but was never relabeled). Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 8 +++++++- pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9e7cb8..948474e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog -## Unreleased +## v0.7.6 + +- fix: `SnowflakeLedgerBackend` skips schema DDL (`CREATE SCHEMA`/`CREATE TABLE`/`ALTER`) on write-mode init when the schema + tables already exist (probed via `SELECT`-only `INFORMATION_SCHEMA`). Snowflake checks the `CREATE` privilege even for `IF NOT EXISTS`, so this lets a least-privilege deployment with only `INSERT/UPDATE/SELECT` write without holding schema-ownership-level DDL grants. Fresh deployments still auto-provision; introspection failure falls back to the `CREATE` path. (#26) +- fix: the bulk write path (`_flush_models_pandas`/`_flush_snapshots_pandas`) falls back to the DDL-free SQL `MERGE`/`INSERT` path when the role can't create the temporary staging table (SQLSTATE 42501), instead of failing the write. The entire write path now requires only `INSERT/UPDATE/SELECT`. (#26) +- fix: connector-discovered `status` propagates to the model row on `Ledger.add()` (`metadata['status']` contract, `ModelStatus` enum validation, dedup-skip self-correction). (#23) + +## v0.7.4 - perf: `SnowflakeLedgerBackend.composite_summary()` computes the full composite inventory in ONE self-contained SQL statement over MODELS + SNAPSHOTS (CTE-based event replay), replacing the previous delegation to an externally-managed `V_COMPOSITES` view. Removes the undocumented requirement that deployments create that view, and replicates the SDK fallback semantics exactly (membership baseline from `member_of` dependency links + `member_added`/`member_removed` replay with latest-op-wins; distinct-id open-observation set semantics). Measured against a production-scale ledger (28.8k models / 212k snapshots): 92.6s sequential fallback → sub-second warm (~0.3-0.6s). diff --git a/pyproject.toml b/pyproject.toml index 6ab422f..731f637 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "model-ledger" -version = "0.7.4" +version = "0.7.6" description = "Developer-first model inventory and governance framework for SR 11-7, EU AI Act, and NIST AI RMF compliance" readme = "README.md" requires-python = ">=3.10"