src/warehouse/release_changes.rs
//! Writer + reader for the **reversible release-change ledger**
//! (`release_changes`, task #32) — re-exported from the ONE definition in the
//! shared `nornir-release-ledger` edda leaf.
//!
//! Every MUTATING step of a release run records one `ReleaseChange` row WITH
//! the before-state needed to reverse it: a version bump carries the exact
//! pre-bump manifest text; a patch-strip carries the removed `[patch]` block; a
//! branch cut carries the SHA HEAD was at; a publish carries whether it landed on
//! an immutable registry (crates.io → can only be yanked, never un-published).
//!
//! A `release_id` groups one run's records. `ChangeRecorder::record` appends one
//! row (best-effort, but here it IS the safety net so callers should surface a
//! write error). `query_release_changes` reads a run's rows; `release undo`
//! reverses them newest-first (`seq` descending).
//!
//! ## Why this module is now one line
//!
//! The payload enum, the recorder, the sha256 canonicalisation and the Arrow
//! codec lived here AND, in a hand-maintained copy, in the release orchestrator
//! that actually performs the mutating steps — same table, same warehouse, two
//! codecs. PRE-PROMPT L5: consumed, never twinned. The definition is now in an
//! edda leaf naming only the backend-neutral [`Warehouse`](super::Warehouse)
//! seam (sync `append_arrow`/`scan_arrow`), and both halves re-export it, so
//! every `warehouse::release_changes::…` path resolves unchanged.
//!
//! Schema: [`super::iceberg_schema::release_changes`].
pub use nornir_release_ledger::release_changes::*;