Cross-Zome API Specification
Cross-zome contracts described here reflect the MVP split: zome_resource holds data; zome_gouvernance evaluates transitions. Post-MVP, typed rules for Unyt (EconomicAgreement, RAVE) and Flowsta (IdentityVerification) are specified in documentation/requirements/ndo_prima_materia.md §§6.6–6.7 and the integration stubs under documentation/requirements/post-mvp/ — see also governance-operator-architecture.md §1.3.
1. Resource Zome API
1.1 Data Access Functions
get_economic_resource
Retrieves a specific economic resource by its action hash.
#![allow(unused)] fn main() { #[hdk_extern] pub fn get_economic_resource( resource_hash: ActionHash, ) -> ExternResult<EconomicResource> }
Parameters:
resource_hash: ActionHash- The action hash of the resource to retrieve
Returns:
EconomicResource- The resource data structure
Errors:
WasmErrorGuest- If resource not found or access denied
Example:
#![allow(unused)] fn main() { let resource = call( CallTargetCell::Local, "zome_resource", "get_economic_resource".into(), None, &resource_hash, )?; }
get_economic_resource_with_state
Retrieves resource with full state transition history.
#![allow(unused)] fn main() { #[hdk_extern] pub fn get_economic_resource_with_state( resource_hash: ActionHash, ) -> ExternResult<ResourceWithState> }
Parameters:
resource_hash: ActionHash- Resource action hash
Returns:
ResourceWithState- Resource with state history
1.2 State Change Requests
request_resource_transition
Primary interface for requesting state changes through governance evaluation.
#![allow(unused)] fn main() { #[hdk_extern] pub fn request_resource_transition( request: GovernanceTransitionRequest, ) -> ExternResult<GovernanceTransitionResult> }
Parameters:
request: GovernanceTransitionRequest- Complete transition request
Returns:
GovernanceTransitionResult- Governance decision and results
Request Structure:
#![allow(unused)] fn main() { #[derive(Serialize, Deserialize, Debug, Clone)] pub struct GovernanceTransitionRequest { /// The action the requesting agent wants to perform pub action: VfAction, /// Current state of the resource being modified pub resource: EconomicResource, /// Agent requesting the state change pub requesting_agent: AgentPubKey, /// Additional context for the transition pub context: TransitionContext, } }
Result Structure:
#![allow(unused)] fn main() { #[derive(Serialize, Deserialize, Debug)] pub struct GovernanceTransitionResult { /// Whether the transition was approved pub success: bool, /// Updated resource state (if approved) pub new_resource_state: Option<EconomicResource>, /// Generated economic event for audit trail pub economic_event: Option<EconomicEvent>, /// Validation receipts from governance evaluation pub validation_receipts: Vec<ValidationReceipt>, /// Detailed reasons for rejection (if applicable) pub rejection_reasons: Option<Vec<String>>, /// Required next steps or additional validation needed pub next_steps: Option<Vec<String>>, } }
batch_state_transitions
Process multiple state transitions efficiently in a single call.
#![allow(unused)] fn main() { #[hdk_extern] pub fn batch_state_transitions( requests: Vec<GovernanceTransitionRequest>, ) -> ExternResult<Vec<GovernanceTransitionResult>> }
Parameters:
requests: Vec<GovernanceTransitionRequest>- Multiple transition requests
Returns:
Vec<GovernanceTransitionResult>- Results for each request in order
1.3 Query Functions
get_my_resources
Retrieves all resources where the calling agent is the custodian.
#![allow(unused)] fn main() { #[hdk_extern] pub fn get_my_resources() -> ExternResult<Vec<EconomicResource>> }
Returns:
Vec<EconomicResource>- Resources owned by the calling agent
get_resources_by_specification
Retrieves all resources conforming to a specific specification.
#![allow(unused)] fn main() { #[hdk_extern] pub fn get_resources_by_specification( spec_hash: ActionHash, ) -> ExternResult<Vec<EconomicResource>> }
Parameters:
spec_hash: ActionHash- Specification action hash
Returns:
Vec<EconomicResource>- Resources conforming to the specification
get_resources_by_state
Retrieves resources in a specific state.
#![allow(unused)] fn main() { #[hdk_extern] pub fn get_resources_by_state( state: ResourceState, ) -> ExternResult<Vec<EconomicResource>> }
Parameters:
state: ResourceState- State to filter by
Returns:
Vec<EconomicResource>- Resources in the specified state
2. Governance Zome API
2.1 State Transition Evaluation
evaluate_state_transition
Evaluates a state transition request and returns governance decision.
#![allow(unused)] fn main() { #[hdk_extern] pub fn evaluate_state_transition( request: GovernanceTransitionRequest, ) -> ExternResult<GovernanceTransitionResult> }
Parameters:
request: GovernanceTransitionRequest- Transition request to evaluate
Returns:
GovernanceTransitionResult- Governance evaluation result
Evaluation Process:
- Load applicable governance rules
- Check agent permissions and roles
- Evaluate all applicable rules
- Determine if transition is allowed
- Generate economic events if approved
2.2 Rule Processing
get_applicable_rules
Retrieves governance rules applicable to a specific resource and action.
#![allow(unused)] fn main() { #[hdk_extern] pub fn get_applicable_rules( resource_hash: ActionHash, action: VfAction, ) -> ExternResult<Vec<GovernanceRule>> }
Parameters:
resource_hash: ActionHash- Resource to get rules foraction: VfAction- Action being performed
Returns:
Vec<GovernanceRule>- Applicable governance rules
evaluate_rule
Evaluates a single governance rule against a transition request.
#![allow(unused)] fn main() { #[hdk_extern] pub fn evaluate_rule( request: GovernanceTransitionRequest, rule_hash: ActionHash, ) -> ExternResult<RuleEvaluationResult> }
Parameters:
request: GovernanceTransitionRequest- Transition requestrule_hash: ActionHash- Rule to evaluate
Returns:
RuleEvaluationResult- Rule evaluation result
2.3 Economic Event Generation
generate_economic_event
Generates an economic event for a completed state transition.
#![allow(unused)] fn main() { #[hdk_extern] pub fn generate_economic_event( request: GovernanceTransitionRequest, evaluation_result: &TransitionEvaluation, ) -> ExternResult<EconomicEvent> }
Parameters:
request: GovernanceTransitionRequest- Original transition requestevaluation_result: TransitionEvaluation- Internal evaluation result
Returns:
EconomicEvent- Generated economic event
2.4 Agent Permission Management
check_agent_permissions
Checks if an agent has permission to perform a specific action.
#![allow(unused)] fn main() { #[hdk_extern] pub fn check_agent_permissions( agent_pubkey: AgentPubKey, action: VfAction, ) -> ExternResult<AgentPermissions> }
Parameters:
agent_pubkey: AgentPubKey- Agent to check permissions foraction: VfAction- Action to check permissions for
Returns:
AgentPermissions- Permission check results
get_agent_roles
Retrieves all roles assigned to an agent.
#![allow(unused)] fn main() { #[hdk_extern] pub fn get_agent_roles( agent_pubkey: AgentPubKey, ) -> ExternResult<Vec<Role>> }
Parameters:
agent_pubkey: AgentPubKey- Agent to get roles for
Returns:
Vec<Role>- Agent's assigned roles
3. Interface Types
3.1 Request/Response Structures
GovernanceTransitionRequest
Complete request for state transition evaluation.
#![allow(unused)] fn main() { #[derive(Serialize, Deserialize, Debug, Clone)] pub struct GovernanceTransitionRequest { /// The action the requesting agent wants to perform pub action: VfAction, /// Current state of the resource being modified pub resource: EconomicResource, /// Agent requesting the state change pub requesting_agent: AgentPubKey, /// Additional context for the transition pub context: TransitionContext, } }
TransitionContext
Additional context information for state transitions.
#![allow(unused)] fn main() { #[derive(Serialize, Deserialize, Debug, Clone, Default)] pub struct TransitionContext { /// Target location for transport/move actions pub target_location: Option<String>, /// Quantity change for produce/consume actions pub quantity_change: Option<f64>, /// Target custodian for transfer actions pub target_custodian: Option<AgentPubKey>, /// Process notes and observations pub process_notes: Option<String>, /// Associated economic process if applicable pub process_context: Option<ActionHash>, /// Additional metadata pub metadata: HashMap<String, String>, } }
GovernanceTransitionResult
Comprehensive result from governance evaluation.
#![allow(unused)] fn main() { #[derive(Serialize, Deserialize, Debug)] pub struct GovernanceTransitionResult { /// Whether the transition was approved pub success: bool, /// Updated resource state (if approved) pub new_resource_state: Option<EconomicResource>, /// Generated economic event for audit trail pub economic_event: Option<EconomicEvent>, /// Validation receipts from governance evaluation pub validation_receipts: Vec<ValidationReceipt>, /// Detailed reasons for rejection (if applicable) pub rejection_reasons: Option<Vec<String>>, /// Required next steps or additional validation needed pub next_steps: Option<Vec<String>>, /// Processing metadata pub metadata: TransitionMetadata, } }
TransitionMetadata
Metadata about the transition processing.
#![allow(unused)] fn main() { #[derive(Serialize, Deserialize, Debug)] pub struct TransitionMetadata { /// Timestamp when evaluation started pub evaluation_started: Timestamp, /// Timestamp when evaluation completed pub evaluation_completed: Timestamp, /// Number of rules evaluated pub rules_evaluated: u32, /// Processing duration in milliseconds pub processing_duration_ms: u64, /// Governance engine version pub engine_version: String, } }
3.2 Validation Structures
RuleEvaluationResult
Result of evaluating a single governance rule.
#![allow(unused)] fn main() { #[derive(Serialize, Deserialize, Debug)] pub struct RuleEvaluationResult { /// Hash of the evaluated rule pub rule_hash: ActionHash, /// Type of governance rule pub rule_type: String, /// Whether the rule was passed pub passed: bool, /// Detailed reason for evaluation result pub reason: String, /// Rule-specific evaluation data pub evaluation_data: Option<serde_json::Value>, /// Timestamp of evaluation pub evaluated_at: Timestamp, } }
AgentPermissions
Permission check results for agent and action.
#![allow(unused)] fn main() { #[derive(Serialize, Deserialize, Debug)] pub struct AgentPermissions { /// Whether the permission was granted pub allowed: bool, /// Roles required for this action pub required_roles: Vec<String>, /// Current status of permission check pub status: String, /// Permission expiration (if applicable) pub expires_at: Option<Timestamp>, /// Additional permission constraints pub constraints: Vec<String>, } }
3.3 Error Handling
GovernanceError
Comprehensive error types for governance operations.
#![allow(unused)] fn main() { #[derive(Debug, thiserror::Error, Serialize, Deserialize)] pub enum GovernanceError { #[error("Permission denied: {0}")] PermissionDenied(String), #[error("Rule violation: {0}")] RuleViolation(String), #[error("Invalid state transition: {0}")] InvalidStateTransition(String), #[error("Agent not found: {0}")] AgentNotFound(String), #[error("Resource not found: {0}")] ResourceNotFound(String), #[error("Governance rule not found: {0}")] GovernanceRuleNotFound(String), #[error("Insufficient role: {0}")] InsufficientRole(String), #[error("Evaluation timeout: {0}ms")] EvaluationTimeout(u64), #[error("Cross-zome communication failed: {0}")] CrossZomeError(String), #[error("Data validation failed: {0}")] ValidationError(String), #[error("Configuration error: {0}")] ConfigurationError(String), } }
4. Usage Examples
4.1 Basic Resource Transfer
// TypeScript (Frontend) example
const transferResource = async (
resourceHash: string,
newCustodian: string,
notes: string
) => {
const request: GovernanceTransitionRequest = {
action: "TransferCustody",
resource: await getResource(resourceHash),
requestingAgent: await getMyAgentPubKey(),
context: {
targetCustodian: newCustodian,
processNotes: notes,
},
};
const result = await callZome<GovernanceTransitionResult>(
"zome_resource",
"request_resource_transition",
request
);
if (result.success) {
console.log("Transfer approved");
return result;
} else {
console.log("Transfer rejected:", result.rejectionReasons);
throw new Error("Transfer failed");
}
};
4.2 Complex Process Chain
#![allow(unused)] fn main() { // Rust backend example for process chaining pub async fn execute_transport_repair_chain( resource_hash: ActionHash, repair_location: String, final_destination: String, ) -> ExternResult<Vec<EconomicEvent>> { let agent_info = agent_info()?; let resource = get_economic_resource(resource_hash)?; // Step 1: Transport to repair location let transport_request = GovernanceTransitionRequest { action: VfAction::Move, resource: resource.clone(), requesting_agent: agent_info.agent_initial_pubkey, context: TransitionContext { target_location: Some(repair_location), process_notes: Some("Transport for repair".to_string()), ..Default::default() }, }; let transport_result = request_resource_transition(transport_request)?; if !transport_result.success { return Err(GovernanceError::RuleViolation( format!("Transport failed: {:?}", transport_result.rejection_reasons) ).into()); } // Step 2: Repair the resource let repair_request = GovernanceTransitionRequest { action: VfAction::Modify, resource: transport_result.new_resource_state.unwrap(), requesting_agent: agent_info.agent_initial_pubkey, context: TransitionContext { target_location: Some(repair_location), process_notes: Some("Maintenance repair".to_string()), ..Default::default() }, }; let repair_result = request_resource_transition(repair_request)?; if !repair_result.success { return Err(GovernanceError::RuleViolation( format!("Repair failed: {:?}", repair_result.rejection_reasons) ).into()); } // Step 3: Transport to final destination let final_transport_request = GovernanceTransitionRequest { action: VfAction::Move, resource: repair_result.new_resource_state.unwrap(), requesting_agent: agent_info.agent_initial_pubkey, context: TransitionContext { target_location: Some(final_destination), process_notes: Some("Transport after repair".to_string()), ..Default::default() }, }; let final_result = request_resource_transition(final_transport_request)?; if !final_result.success { return Err(GovernanceError::RuleViolation( format!("Final transport failed: {:?}", final_result.rejection_reasons) ).into()); } // Collect all generated events let mut events = Vec::new(); if let Some(event) = transport_result.economic_event { events.push(event); } if let Some(event) = repair_result.economic_event { events.push(event); } if let Some(event) = final_result.economic_event { events.push(event); } Ok(events) } }
4.3 Batch Processing
// TypeScript batch processing example
const batchUpdateResources = async (
updates: Array<{
resourceHash: string;
action: VfAction;
context: TransitionContext;
}>
) => {
const requests = updates.map(update => ({
action: update.action,
resource: await getResource(update.resourceHash),
requestingAgent: await getMyAgentPubKey(),
context: update.context,
}));
const results = await callZome<GovernanceTransitionResult[]>(
"zome_resource",
"batch_state_transitions",
requests
);
// Process results
const successful = results.filter(r => r.success);
const failed = results.filter(r => !r.success);
console.log(`Processed ${results.length} requests`);
console.log(`Successful: ${successful.length}`);
console.log(`Failed: ${failed.length}`);
if (failed.length > 0) {
console.error("Failed transitions:", failed);
}
return results;
};
5. Performance and Scalability
5.1 Rate Limiting
Rate limiting is enforced at the governance zome level:
#![allow(unused)] fn main() { // Rate limiting configuration pub const RATE_LIMITS: HashMap<&'static str, u32> = hashmap! { "evaluate_state_transition" => 100, // Per minute "check_agent_permissions" => 500, // Per minute "get_applicable_rules" => 200, // Per minute }; }
5.2 Batch Processing
For high-volume operations, use batch processing:
#![allow(unused)] fn main() { // Recommended batch sizes const OPTIMAL_BATCH_SIZE: usize = 10; const MAX_BATCH_SIZE: usize = 50; // Implementation validates and adjusts batch sizes pub fn validate_batch_size(size: usize) -> usize { if size > MAX_BATCH_SIZE { warn!("Batch size {size} exceeds maximum, truncating to {MAX_BATCH_SIZE}"); MAX_BATCH_SIZE } else { size.max(OPTIMAL_BATCH_SIZE) } } }
5.3 Caching Strategy
Cache frequently accessed data to improve performance:
#![allow(unused)] fn main() { // Cache configuration pub const CACHE_TTL_SECONDS: u64 = 300; // 5 minutes pub const RULE_CACHE_SIZE: usize = 100; pub const PERMISSION_CACHE_SIZE: usize = 200; }
This API specification provides a comprehensive reference for implementing cross-zome communication in the governance-as-operator architecture, with detailed examples and performance considerations for production deployment.