Renames interfaces to contracts, tightens `depends_on` slot validation, and fixes macOS container builds.
Released on July 13, 2026
Breaking changes
- The
conforms_tomanifest field has been renamed toimplementsas part of a broader rename of "interfaces" to "contracts"; renameconforms_totoimplementsin yourpeppy.json5and update any "interface" wording to "contract". - Dependency slots (
depends_on) now require a single producer each, replacing the previousfrom_anybinding model, and peppy now fails validation whenever adepends_onslot is left unfulfilled; update your bindings so every slot names exactly one producer.
Container builds and runs (macOS)
- macOS container builds no longer silently default to
$HOMEand now use the current working directory. - The peppy data root is now mounted into the Lima VM so container builds and runs can access it.
- Fixed a hang where restarting the Lima VM blocked the async runtime while registering a host mount for the first time.
- Container Python bindings no longer ship stale native extensions after shared-crate changes.
Validation and output
- Contract (
implements) validation failures now report per-slot coverage mismatches instead of a single combined string. - The CLI info output formatting has been simplified.
Documentation
- The advanced guides now include Python examples alongside the existing Rust examples.
- The Python async examples now wrap
select!in a loop and hold references to asyncio tasks so they are not cleaned up or garbage-collected prematurely.