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:
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);