lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

commit e465fa1b13daf879b43e522a05ee30abc9d215e1
parent 35c713d3fe1ca8daa1e25e2d1a43d697a7de6760
Author: triesap <tyson@radroots.org>
Date:   Wed, 15 Jul 2026 06:22:38 +0000

trade: align workflow states with V1 vocabulary

- Replace revision and RHI-specific workflow states with the V1 pending-validation state.
- Add the validation-expired trade workflow state to the exported DTO vocabulary.
- Rename pending RHI commitment confidence to awaiting validation.
- Keep revision event removal for the next protocol cutover slice.

Diffstat:
Mcrates/trade/src/dto.rs | 4++--
Mcrates/trade/src/order.rs | 18+++++++++---------
Mcrates/trade/src/projection.rs | 7++++---
Mcrates/trade/src/validation_receipt.rs | 11+++++++----
Mcrates/trade/src/workflow.rs | 22+++++++++++-----------
5 files changed, 33 insertions(+), 29 deletions(-)

diff --git a/crates/trade/src/dto.rs b/crates/trade/src/dto.rs @@ -286,11 +286,11 @@ mod tests { [ "missing", "requested", - "revision_proposed", - "agreed_pending_rhi", + "agreed_pending_validation", "committed", "declined", "cancelled", + "validation_expired", "invalid", ] ); diff --git a/crates/trade/src/order.rs b/crates/trade/src/order.rs @@ -1260,7 +1260,7 @@ fn reduce_listing_inventory_accounting_records( }, ); match projection.status { - RadrootsTradeWorkflowState::AgreedPendingRhi => { + RadrootsTradeWorkflowState::AgreedPendingValidation => { for (agreement_event_id, economics) in projection .agreement_event_id .iter() @@ -1296,8 +1296,8 @@ fn reduce_listing_inventory_accounting_records( } RadrootsTradeWorkflowState::Missing | RadrootsTradeWorkflowState::Requested - | RadrootsTradeWorkflowState::RevisionProposed | RadrootsTradeWorkflowState::Committed => {} + RadrootsTradeWorkflowState::ValidationExpired => {} } } @@ -1515,7 +1515,7 @@ fn negotiation_projection( let mut projection = request_projection( order_id, request, - RadrootsTradeWorkflowState::RevisionProposed, + RadrootsTradeWorkflowState::Requested, ); projection.pending_revision_event_id = Some(proposal.event_id.clone()); projection.economics = Some(proposal.payload.economics.clone()); @@ -1590,7 +1590,7 @@ fn decided_projection( let mut projection = request_projection( order_id, request, - RadrootsTradeWorkflowState::AgreedPendingRhi, + RadrootsTradeWorkflowState::AgreedPendingValidation, ); projection.decision_event_id = Some(decision.event_id.clone()); projection.economics = Some(request.payload.economics.clone()); @@ -1641,7 +1641,7 @@ fn revision_decision_projection( let mut projection = request_projection( order_id, request, - RadrootsTradeWorkflowState::AgreedPendingRhi, + RadrootsTradeWorkflowState::AgreedPendingValidation, ); projection.economics = Some(proposal.payload.economics.clone()); projection.agreement_event_id = Some(decision.event_id.clone()); @@ -4488,7 +4488,7 @@ mod tests { ); assert_eq!( pending_revision.status, - RadrootsTradeWorkflowState::RevisionProposed + RadrootsTradeWorkflowState::Requested ); assert_eq!( pending_revision.pending_revision_event_id, @@ -5261,7 +5261,7 @@ mod tests { assert_eq!( projection.status, - RadrootsTradeWorkflowState::AgreedPendingRhi + RadrootsTradeWorkflowState::AgreedPendingValidation ); assert_eq!(projection.decision_event_id, Some(event_id(2))); assert_eq!(projection.agreement_event_id, Some(event_id(2))); @@ -5295,7 +5295,7 @@ mod tests { assert_eq!( projection.status, - RadrootsTradeWorkflowState::AgreedPendingRhi + RadrootsTradeWorkflowState::AgreedPendingValidation ); assert_eq!(projection.agreement_event_id, Some(event_id(4))); assert_eq!( @@ -5346,7 +5346,7 @@ mod tests { assert_eq!( projection.status, - RadrootsTradeWorkflowState::AgreedPendingRhi + RadrootsTradeWorkflowState::AgreedPendingValidation ); assert_eq!(projection.agreement_event_id, Some(event_id(2))); } diff --git a/crates/trade/src/projection.rs b/crates/trade/src/projection.rs @@ -891,11 +891,11 @@ fn trade_workflow_status_label(status: &RadrootsTradeWorkflowState) -> &'static match status { RadrootsTradeWorkflowState::Missing => "missing", RadrootsTradeWorkflowState::Requested => "requested", - RadrootsTradeWorkflowState::RevisionProposed => "revision_proposed", - RadrootsTradeWorkflowState::AgreedPendingRhi => "agreed_pending_rhi", + RadrootsTradeWorkflowState::AgreedPendingValidation => "agreed_pending_validation", RadrootsTradeWorkflowState::Committed => "committed", RadrootsTradeWorkflowState::Declined => "declined", RadrootsTradeWorkflowState::Cancelled => "cancelled", + RadrootsTradeWorkflowState::ValidationExpired => "validation_expired", RadrootsTradeWorkflowState::Invalid => "invalid", } } @@ -905,8 +905,9 @@ fn trade_rhi_state_label( validation_receipt_event_id: Option<&RadrootsEventId>, ) -> &'static str { match status { - RadrootsTradeWorkflowState::AgreedPendingRhi => "pending", + RadrootsTradeWorkflowState::AgreedPendingValidation => "pending", RadrootsTradeWorkflowState::Committed => "final", + RadrootsTradeWorkflowState::ValidationExpired => "expired", RadrootsTradeWorkflowState::Invalid if validation_receipt_event_id.is_some() => "invalid", RadrootsTradeWorkflowState::Invalid => "invalid", _ => "not_required", diff --git a/crates/trade/src/validation_receipt.rs b/crates/trade/src/validation_receipt.rs @@ -98,7 +98,7 @@ impl RadrootsTradeValidationAuthority { #[serde(rename_all = "snake_case")] pub enum RadrootsTradeCommitmentConfidence { LocalOnly, - PendingRhi, + AwaitingValidation, CommittedByTrustedService, CommittedByCryptographicProof, CommittedByTrustedServiceAndProof, @@ -109,7 +109,7 @@ impl RadrootsTradeCommitmentConfidence { pub const fn as_str(self) -> &'static str { match self { Self::LocalOnly => "local_only", - Self::PendingRhi => "pending_rhi", + Self::AwaitingValidation => "awaiting_validation", Self::CommittedByTrustedService => "committed_by_trusted_service", Self::CommittedByCryptographicProof => "committed_by_cryptographic_proof", Self::CommittedByTrustedServiceAndProof => "committed_by_trusted_service_and_proof", @@ -120,7 +120,7 @@ impl RadrootsTradeCommitmentConfidence { pub fn from_label(value: &str) -> Option<Self> { match value { "local_only" => Some(Self::LocalOnly), - "pending_rhi" => Some(Self::PendingRhi), + "awaiting_validation" => Some(Self::AwaitingValidation), "committed_by_trusted_service" => Some(Self::CommittedByTrustedService), "committed_by_cryptographic_proof" => Some(Self::CommittedByCryptographicProof), "committed_by_trusted_service_and_proof" => { @@ -1736,7 +1736,10 @@ mod tests { fn commitment_confidence_contract_uses_stable_snake_case_labels() { for (confidence, label) in [ (RadrootsTradeCommitmentConfidence::LocalOnly, "local_only"), - (RadrootsTradeCommitmentConfidence::PendingRhi, "pending_rhi"), + ( + RadrootsTradeCommitmentConfidence::AwaitingValidation, + "awaiting_validation", + ), ( RadrootsTradeCommitmentConfidence::CommittedByTrustedService, "committed_by_trusted_service", diff --git a/crates/trade/src/workflow.rs b/crates/trade/src/workflow.rs @@ -31,11 +31,11 @@ use crate::validation_receipt::{ pub enum RadrootsTradeWorkflowState { Missing, Requested, - RevisionProposed, - AgreedPendingRhi, + AgreedPendingValidation, Committed, Declined, Cancelled, + ValidationExpired, Invalid, } @@ -230,7 +230,7 @@ fn validate_receipt_binding( receipt: &RadrootsTradeWorkflowValidationReceiptRecord, ) -> bool { let mut valid = true; - if projection.status != RadrootsTradeWorkflowState::AgreedPendingRhi { + if projection.status != RadrootsTradeWorkflowState::AgreedPendingValidation { projection.issues.push( RadrootsOrderIssue::ValidationReceiptWithoutPendingAgreement { event_id: receipt.event_id.clone(), @@ -354,16 +354,16 @@ mod tests { (RadrootsTradeWorkflowState::Missing, "missing"), (RadrootsTradeWorkflowState::Requested, "requested"), ( - RadrootsTradeWorkflowState::RevisionProposed, - "revision_proposed", - ), - ( - RadrootsTradeWorkflowState::AgreedPendingRhi, - "agreed_pending_rhi", + RadrootsTradeWorkflowState::AgreedPendingValidation, + "agreed_pending_validation", ), (RadrootsTradeWorkflowState::Committed, "committed"), (RadrootsTradeWorkflowState::Declined, "declined"), (RadrootsTradeWorkflowState::Cancelled, "cancelled"), + ( + RadrootsTradeWorkflowState::ValidationExpired, + "validation_expired", + ), (RadrootsTradeWorkflowState::Invalid, "invalid"), ] { assert_eq!(serde_json::to_value(&state).unwrap(), wire_name); @@ -620,7 +620,7 @@ mod tests { assert_eq!( projection.status, - RadrootsTradeWorkflowState::AgreedPendingRhi + RadrootsTradeWorkflowState::AgreedPendingValidation ); assert!(!projection.lifecycle_terminal); assert_eq!(projection.agreement_event_id, Some(event_id(2))); @@ -723,7 +723,7 @@ mod tests { let projection = reduce_trade_workflow_records(&order_id(), records); assert_eq!( projection.status, - RadrootsTradeWorkflowState::AgreedPendingRhi + RadrootsTradeWorkflowState::AgreedPendingValidation ); assert_eq!(projection.agreement_event_id, Some(event_id(4))); assert_eq!(projection.pending_inventory_reservations[0].bin_count, 1);