# ConfigKit v0.7.0 This minor release adds structured comparison of completed configurations. Applications can inspect changes between two configuration files or the effective impact of a selected overlay, with ConfigKit handling comparison and safe value disclosure while applications own presentation. ## Changes - Add `Diff[T](left, right *Result[T]) ([]Difference, error)` through the public facade. It compares frozen effective inspection values from successful loads, including defaults and recorded application resolution, rather than source text or later mutations of `Result.Config`. - Return detached changed-region records containing a semantic path, safe left and right `ValueSnapshot` values, and `HiddenChanged`. Mappings compare recursively, sequences report atomic changes, and records follow canonical pointer order. Presence distinguishes additions and removals from explicit null; equal effective values produce no records regardless of provenance or loading history. - Protect both snapshots with sensitivity from both loads, including historical and dependency-derived classification. Compatible regions retain public siblings; incompatible structural replacements use complete-region masking where required. `HiddenChanged` identifies actual changes withheld by masking, rather than merely indicating that a snapshot contains redacted content. - Preserve visible public scalar changes when only historical sensitive descendants remain, including additions and removals. Historical explanation redaction and masking of incompatible present shapes remain intact. - Add maintained file-comparison and base-versus-overlay examples with consumer-owned formatting, plus an executable public API example. See the [consumer guide](../consumers/README.md#effective-configuration-diffs) and [configuration contract](../config.md#effective-configuration-diffs). ## Compatibility and upgrade No application-code or configuration migration is required from v0.6.0. Adopting the new API is optional. Loading, composition, inheritance, provenance, existing inspection, and secret-handling contracts remain unchanged. Load both configurations successfully before calling `Diff`; nil or uninitialized results return an error with no records. Comparison does not reopen sources, rerun callbacks, or reread environment variables. Typed secret references compare by configured reference name, not resolved credential bytes, so credential rotation behind an unchanged name is not reported. Returned snapshots describe changed regions, not cross-protected full-document context. Select this version and rebuild: ```sh go get gitea.maximumdirect.net/eric/ConfigKit@v0.7.0 ``` The consumer minimum remains Go 1.26.0. The YAML dependency remains `go.yaml.in/yaml/v4 v4.0.0-rc.6`, and the maintainer tool dependency remains ReleaseKit v0.3.0. Linux amd64 and arm64 remain release-validated targets; macOS remains best-effort. Publication follows the existing [release procedure](../release.md). [COPYRIGHT](https://gitea.maximumdirect.net/eric/ConfigKit/src/tag/v0.7.0/COPYRIGHT) | [LICENSE](https://gitea.maximumdirect.net/eric/ConfigKit/src/tag/v0.7.0/LICENSE) | [ATTRIBUTION](https://gitea.maximumdirect.net/eric/ConfigKit/src/tag/v0.7.0/docs/oss/attribution.md)