Trust Activation Exchange
Carry a remote trust activation across the boundary as one signed exchange that stays visibility-only until you activate and review it.
On this page
One operator's reviewed trust activation can travel to a partner while the decision to trust it stays with the partner. The receiving side sees the listing at once and admits runtime traffic for it only after its own local activation and a person's review.
A trust activation exchange (chio.federation-activation-exchange.v1, FederationActivationExchangeArtifact) names the source and target operators and the listing. It references the activation, the listing, and the governing charter by digest, and carries a trust scope, a delegation control, and an import control.
σcontract validκactivated locallyτreviewed by a person
The exchange makes a listing visible, nothing more
Their operator sends a signed chio.federation-activation-exchange.v1 that names its trust activation, the listing, and the governing charter by sha256 digest. Your side validates the contract and shows the listing. prohibitAmbientRuntimeAdmission holds every runtime call until you act. Exchange fields.
An exchange shares visibility, and runtime trust stays with the receiver
Each reference in the exchange names the operator that published the artifact and its sha256 digest, so the receiver can fetch the artifact and confirm it is the one the source reviewed.
Local activation and manual review are acts the receiving operator performs on its own side. Until both happen, the listing is visible and prohibitAmbientRuntimeAdmission keeps any call from being admitted on the strength of visibility. After them, admission is still bounded by the trust scope: its namespace, the subject operator, and the actor kinds and admission classes it allows.
The validator refuses any exchange that relaxes a control
An exchange is valid only when all five import-control flags are true, both delegation-control flags are true, and maxHops is above zero. Every exchange that validates therefore carries the same floor, whichever operator wrote it:
- Explicit local activation. The receiver activates the listing itself (
explicitLocalActivationRequired). - Manual review. A person on the receiving side reviews it (
manualReviewRequired). - Fresh inputs. The receiver rejects stale inputs (
rejectStaleInputs). - Visibility without trust. The exchange may be seen before it is trusted (
allowVisibilityWithoutRuntimeTrust), and visibility alone admits nothing (prohibitAmbientRuntimeAdmission).
Explicit local activation and manual review are requirement TRUSTMAX-01 in the qualification matrix on Federation Assurance.
The reference exchange validates, and three altered copies are refused
The federation guide project loads the published reference exchange, validates it, then hands the same validator copies that drop one control each or change the schema.
Validate a trust activation exchange
Load the reference exchange, validate it, and watch the same validator refuse an exchange that drops explicit local activation or manual review.
Complete the project setup, then run the program from federation-guide/. The download includes every constructor and input.
cargo run --locked --bin activationreference exchange fex-1: valid; origin-operator to consumer-operator for listing listing-liability-provider-1 import control: local activation required, manual review required exchange without explicit local activation: refused (invalid exchange: federation imports must require explicit local activation) exchange without manual review: refused (invalid exchange: federation imports must require manual review) unsupported schema: refused (unsupported schema: chio.federation-activation-exchange.v0)
The exchange is the published standards example with declared artifact references. Validation checks the contract, not the referenced artifacts; a receiver still resolves and reviews each reference before activating anything locally.
Read the complete program 45 lines · complete file
//! Validate a federation activation exchange and show that visibility never
//! becomes runtime trust without explicit local activation and manual review.
use chio_federation::activation::{
validate_federation_activation_exchange, FederationActivationExchangeArtifact,
};
use chio_federation::error::FederationContractError;
use serde_json::Value;
fn receive(value: Value) -> Result<FederationActivationExchangeArtifact, FederationContractError> {
let exchange: FederationActivationExchangeArtifact = serde_json::from_value(value)
.map_err(|e| FederationContractError::InvalidExchange(e.to_string()))?;
validate_federation_activation_exchange(&exchange)?;
Ok(exchange)
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let reference: Value = serde_json::from_slice(&std::fs::read("activation-exchange.json")?)?;
let exchange = receive(reference.clone())?;
assert!(exchange.import_control.explicit_local_activation_required);
assert!(exchange.import_control.manual_review_required);
println!(
"reference exchange {}: valid; {} to {} for listing {}",
exchange.exchange_id,
exchange.source_operator_id,
exchange.target_operator_id,
exchange.listing_id
);
println!("import control: local activation required, manual review required");
let mut ambient = reference.clone();
ambient["importControl"]["explicitLocalActivationRequired"] = false.into();
let err = receive(ambient).unwrap_err();
assert!(matches!(err, FederationContractError::InvalidExchange(_)));
println!("exchange without explicit local activation: refused ({err})");
let mut unreviewed = reference.clone();
unreviewed["importControl"]["manualReviewRequired"] = false.into();
let err = receive(unreviewed).unwrap_err();
assert!(matches!(err, FederationContractError::InvalidExchange(_)));
println!("exchange without manual review: refused ({err})");
let mut wrong_schema = reference;
wrong_schema["schema"] = "chio.federation-activation-exchange.v0".into();
let err = receive(wrong_schema).unwrap_err();
assert!(matches!(err, FederationContractError::UnsupportedSchema(_)));
println!("unsupported schema: refused ({err})");
Ok(())
}Open the source file. Each program asserts its expected refusals; keys, timestamps, and digests change between runs.
You should see the reference exchange accepted with both import requirements named, then three refusals, each stating the control or schema that failed.
A receiving operator runs the same validator from the command line on an exchange it was sent, before anyone starts the review:
chio federation activation verify --exchange activation-exchange.jsonexchange fex-1, origin-operator to consumer-operator listing listing-liability-provider-1 import local activation required, manual review required, stale inputs rejected runtime visibility only; no call is admitted until you activate locally delegation 2 hops, attenuation required valid chio.federation-activation-exchange.v1
The delegation control bounds how far an exchange travels
The delegation control names the delegating and delegate operators and how many further hops the delegate may make. Each hop must narrow what it passes on (attenuationRequired), and the delegate sees the listing without trusting it until it activates locally (visibilityOnlyUntilLocalActivation). The reference exchange allows two hops from origin-operator to consumer-operator.
Read more in Cross-operator delegation.
Search for maxHops, sha256, or manualReviewRequired.
Exchange fields
Field names are as they serialize. The types are defined in crates/trust/chio-federation/src/artifacts.rs and validated in crates/trust/chio-federation/src/activation.rs.
FederationArtifactReference
| Field | Holds | Rule |
|---|---|---|
kind | enum | one of trust_, listing, listing_report, governance_, governance_case, open_, open_, portable_, portable_, cross_ |
schema | schema id | the referenced artifact's schema |
artifactId | id | the referenced artifact's id |
operatorId | operator id | the operator that published it |
sha256 | 64-character hex | digest of the referenced artifact |
uri | URI, optional | where the artifact can be fetched |
FederationTrustScope
| Field | Holds | Rule |
|---|---|---|
namespace | registry namespace | the namespace the exchange is scoped to |
subject | operator id | the operator the scope is about |
allowed | list | listing actor kinds the receiver may activate |
allowed | list | admission classes the receiver may grant |
policyReference | string, optional | a free-form policy reference |
FederationDelegationControl
| Field | Holds | Rule |
|---|---|---|
delegator | operator id | who delegates |
delegate | operator id | who receives |
maxHops | integer | further hops the delegate may make; refused when 0 |
attenuation | boolean | each hop must narrow; refused when false |
visibility | boolean | the delegate sees without trusting until it activates locally; refused when false |
FederationImportControl
| Field | Holds | Rule |
|---|---|---|
explicit | boolean | the receiver must activate locally; refused when false |
manual | boolean | a person must review; refused when false |
reject | boolean | the receiver rejects stale inputs; refused when false |
allow | boolean | the exchange may be seen without being trusted; refused when false |
prohibit | boolean | visibility admits no runtime traffic; refused when false |
Reference exchange
The published standards example ships with the federation guide project, and the validator in the run loads this file.
{
"schema": "chio.federation-activation-exchange.v1",
"exchangeId": "fex-1",
"issuedAt": 1743552000,
"expiresAt": 1743638400,
"sourceOperatorId": "origin-operator",
"targetOperatorId": "consumer-operator",
"listingId": "listing-liability-provider-1",
"activationRef": {
"kind": "trust_activation",
"schema": "chio.registry.trust-activation.v1",
"artifactId": "activation-1",
"operatorId": "origin-operator",
"sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"uri": "https://origin-operator.chio.example/artifacts/activation-1"
},
"listingRef": {
"kind": "listing",
"schema": "chio.registry.listing.v1",
"artifactId": "listing-liability-provider-1",
"operatorId": "origin-operator",
"sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"uri": "https://origin-operator.chio.example/artifacts/listing-liability-provider-1"
},
"governingCharterRef": {
"kind": "governance_charter",
"schema": "chio.registry.governance-charter.v1",
"artifactId": "charter-1",
"operatorId": "origin-operator",
"sha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"uri": "https://origin-operator.chio.example/artifacts/charter-1"
},
"scope": {
"namespace": "registry.chio.example/liability",
"subjectOperatorId": "origin-operator",
"allowedActorKinds": [
"liability_provider"
],
"allowedAdmissionClasses": [
"reviewable",
"bond_backed"
],
"policyReference": "policy/federation/default"
},
"delegationControl": {
"delegatorOperatorId": "origin-operator",
"delegateOperatorId": "consumer-operator",
"maxHops": 2,
"attenuationRequired": true,
"visibilityOnlyUntilLocalActivation": true
},
"importControl": {
"explicitLocalActivationRequired": true,
"manualReviewRequired": true,
"rejectStaleInputs": true,
"allowVisibilityWithoutRuntimeTrust": true,
"prohibitAmbientRuntimeAdmission": true
},
"note": "Shares one reviewed trust activation without widening runtime trust."
}