Summary
The agent is supposed to ride ciris-server for the WHOLE substrate — verify included — but today it can't: the agent loads libciris_verify_ffi.so from a separately-pinned ciris-verify wheel (ciris_adapters/ciris_verify/ffi_bindings/: jcs_canonicalize, operational_admit, hybrid_kex, key_grant, locale_merkle, self_enc, attestation). ciris-server bundles verify as a Rust cdylib inside its own wheel (symbols in ciris_server's .so), so a ffi_bindings that dlopens libciris_verify_ffi.so finds nothing in the ciris-server install → the agent must keep the standalone wheel → two verify lineages (bundled v9.0.0 vs standalone v5.1.3), the wire/canonical-hash skew (CIRISAgent#917).
For the agent to drop the standalone ciris-verify and ride us, ciris-server must PROVIDE the verify FFI surface the agent consumes, at the SAME version it bundles.
Ask
Ship/expose the verify FFI so ffi_bindings can source it from the ciris-server install. Two viable shapes (pick one):
- Ship the cdylib — include
libciris_verify_ffi.so (+ .dylib/.dll) in the ciris-server wheel (built from the same ciris-verify-ffi at the bundled tag, v9.0.0), and expose its path (e.g. ciris_server.verify_ffi_path()), so the agent's ffi_bindings loader finds it there instead of the standalone wheel. Simplest for the agent (its ctypes loader just repoints).
- pyo3 re-export — surface the verify functions the agent calls as
ciris_server pyo3 entries (jcs_canonicalize, self_enc_*, operational_admit, key_grant, hybrid_kex, locale_merkle, attestation). Cleaner API but a larger surface to wrap + keep in sync.
Recommend (1) — it's a packaging change (bundle the already-built FFI cdylib at the pinned tag), preserves the agent's existing ctypes bindings verbatim, and guarantees the FFI version == the bundled substrate version (no skew by construction).
Acceptance
- The ciris-server wheel contains
libciris_verify_ffi.{so,dylib,dll} at the bundled verify tag; a verify_ffi_path() (or documented location) resolves it.
- CIRISAgent#917 drops
ciris-verify from requirements and repoints ffi_bindings at the ciris-server-provided lib; jcs/attestation/etc. run against the SAME verify the substrate uses.
- Version-skew impossible: one verify, bundled + FFI, one tag.
Summary
The agent is supposed to ride ciris-server for the WHOLE substrate — verify included — but today it can't: the agent loads
libciris_verify_ffi.sofrom a separately-pinnedciris-verifywheel (ciris_adapters/ciris_verify/ffi_bindings/: jcs_canonicalize, operational_admit, hybrid_kex, key_grant, locale_merkle, self_enc, attestation). ciris-server bundles verify as a Rust cdylib inside its own wheel (symbols inciris_server's.so), so affi_bindingsthatdlopenslibciris_verify_ffi.sofinds nothing in the ciris-server install → the agent must keep the standalone wheel → two verify lineages (bundled v9.0.0 vs standalone v5.1.3), the wire/canonical-hash skew (CIRISAgent#917).For the agent to drop the standalone
ciris-verifyand ride us, ciris-server must PROVIDE the verify FFI surface the agent consumes, at the SAME version it bundles.Ask
Ship/expose the verify FFI so
ffi_bindingscan source it from the ciris-server install. Two viable shapes (pick one):libciris_verify_ffi.so(+.dylib/.dll) in the ciris-server wheel (built from the sameciris-verify-ffiat the bundled tag, v9.0.0), and expose its path (e.g.ciris_server.verify_ffi_path()), so the agent'sffi_bindingsloader finds it there instead of the standalone wheel. Simplest for the agent (its ctypes loader just repoints).ciris_serverpyo3 entries (jcs_canonicalize, self_enc_*, operational_admit, key_grant, hybrid_kex, locale_merkle, attestation). Cleaner API but a larger surface to wrap + keep in sync.Recommend (1) — it's a packaging change (bundle the already-built FFI cdylib at the pinned tag), preserves the agent's existing ctypes bindings verbatim, and guarantees the FFI version == the bundled substrate version (no skew by construction).
Acceptance
libciris_verify_ffi.{so,dylib,dll}at the bundled verify tag; averify_ffi_path()(or documented location) resolves it.ciris-verifyfrom requirements and repointsffi_bindingsat the ciris-server-provided lib; jcs/attestation/etc. run against the SAME verify the substrate uses.