Stable JSON contracts
colibri-contracts holds the stable, language-agnostic wire shapes shared
between Colibri (Rust) and Clawdie agents (TypeScript). It owns schemas and
(De)serialize, not business logic.
Why a separate contracts crate
Section titled “Why a separate contracts crate”- Prevent duplicated definitions between Rust and TypeScript lanes.
- Keep committed manifests in
manifests/parseable by both sides. - Centralize schema strings, field renaming aliases, and backward-compat defaults.
Active schemas
Section titled “Active schemas”| Schema | Rust struct | Purpose |
|---|---|---|
clawdie.interagent.run-manifest.v1 | RunManifest | Records a build/test run — role, agent, artifacts, summary. |
clawdie.runtime-version-inventory.v1 | RuntimeInventory | Host runtime snapshot — OS, package versions, npm/node/zot/pi. |
clawdie.provider-smoke.result.v1 | ProviderSmokeResult | DeepSeek cache-hit probe result and token accounting. |
Schema constants and structs live in crates/colibri-contracts/src/lib.rs.
Evolution rules
Section titled “Evolution rules”- The crate carries no logic — only
serdestructs and schema constants. - New fields are normally optional with
#[serde(default)]so old manifests still parse. RuntimeInventory.piis optional because not every host installspiorzot.HostStatus.rawis a catch-allserde_json::Valueso hostile collector output can be captured without forcing a schema bump.
Golden tests
Section titled “Golden tests”crates/colibri-contracts/tests/golden.rs parses every committed manifest in
manifests/ and asserts round-trip equality. The fixtures are intended to be
cross-platform — if a manifest produced on Linux differs from one produced
on FreeBSD 15, the difference must be understood and documented before it is
merged.
See also
Section titled “See also”- cost-model — how the provider-smoke result feeds cache-hit metering.
- runtime-inventory — where the runtime inventory is produced.