Reference#

CPEX 0.3 runs on the praxis-policy engine (PPE) 0.5.0. Rust hosts depend on the cpex facade, which re-exports PPE’s public surface; plugin authors use cpex::prelude. The Crate Map lists every crate and what it re-exports.

SurfaceEntry pointWhere
Rustcpex::PolicyEnginecrates/cpex, docs.rs/cpex
Pythoncpex.PolicyEngine (PluginManager is an alias)bindings/python
Gocpex.PolicyEnginego/cpex
C ABIcpex_engine_*, ABI version 3crates/cpex-ffi
Python pluginsisolated_venv kind (python-host feature)crates/cpex-hosts-python

Engine API docs are on docs.rs/praxis-policy/0.5.0 and docs.rs/praxis-policy-core/0.5.0.

Language bindings#

The Python package and the Go module wrap the same engine and install the same builtins, HTTP transport and secret providers. Both block private destinations by default and expose a host-side opt-in (allow_private_destinations=True in Python, cpex.WithPrivateDestinations() in Go). Both expose secret refresh (refresh_secrets / RefreshSecrets) and a last-success query, which a host using Vault calls on an interval. See Builtins and Configuration.

The Go package links libcpex_ffi and checks its ABI version at init. The Go module and the FFI artifact must come from the same CPEX release.

Supply-chain integrity#

The C FFI is distributed as signed prebuilt artifacts. A host that links the FFI rather than building from source verifies the signature on the artifact before use, so the binary boundary between the Rust core and a non-Rust host is not an unverified trust gap. The signing and verification process is documented in crates/cpex-ffi/RELEASE.md.

(The 0.1.x Python line had its own package-integrity verification for PyPI and Git installs; that mechanism is specific to the Python distribution and is documented in the 0.1.x docs.)

Upgrading#

Migrating to 0.3 maps every 0.2.x API, hook name and config key to its 0.3.0 form.