nautechsystems/nautilus_trader · error

Verified action requires the configured provider identities

Error message

Verified action requires the configured provider identities

What it means

A validation guard requiring the batch to carry the configured redundancy topology: exactly 3 provider_ids, exactly 3 operator_ids, and at least 3 failure_domain_ids. The library enforces this shape so recorded verified-action evidence proves quorum across the expected provider/operator/failure-domain sets.

Source

Thrown at crates/adapters/blockchain/src/cache/database.rs:6052

            assignment.nonce
        );
        transaction
            .commit()
            .await
            .map_err(|e| anyhow::anyhow!("Failed to commit verified nonce assignment: {e}"))?;
        Ok(())
    }

    /// Appends one verified decision batch before an action on an existing active intent.
    pub(crate) async fn record_execution_verification_batch(
        &self,
        batch: &ExecutionVerificationBatch<'_>,
    ) -> anyhow::Result<()> {
        anyhow::ensure!(
            !batch.decision_class.trim().is_empty() && !batch.decisions.is_empty(),
            "Verified action requires a decision class and evidence"
        );
        anyhow::ensure!(
            batch.provider_ids.len() == 3
                && batch.operator_ids.len() == 3
                && batch.failure_domain_ids.len() >= 3,
            "Verified action requires the configured provider identities"
        );
        let chain_id = i32::try_from(batch.chain_id)
            .context("Verification chain ID exceeds PostgreSQL INTEGER")?;
        let nonce =
            i64::try_from(batch.nonce).context("Execution nonce exceeds PostgreSQL BIGINT")?;
        let mut transaction = self
            .pool
            .begin()
            .await
            .map_err(|e| anyhow::anyhow!("Failed to start verified action evidence: {e}"))?;
        let (manifest_version, manifest_digest, revision) =
            sqlx::query_as::<_, (String, String, i64)>(
                "
                SELECT manifest_version, manifest_digest, revision

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Collect responses from exactly 3 configured providers and 3 operators before building the batch.
  2. Attach failure-domain ids to every response so at least 3 distinct domains are present.
  3. If the topology intentionally changed, update the batch construction to match the new configured counts.

Example fix

// before: submit with whatever came back
let batch = build_batch(responses);
record_execution_verification_batch(&db, &batch).await?;
// after: gate on the required counts
anyhow::ensure!(responses.providers.len() == 3 && responses.operators.len() == 3 && distinct_failure_domains(&responses) >= 3, "insufficient quorum responses");
let batch = build_batch(responses);
record_execution_verification_batch(&db, &batch).await?;
Defensive patterns

Strategy: validation

Validate before calling

// Rust
fn has_quorum_ids(batch: &ExecutionVerificationBatch) -> bool {
    batch.provider_ids.len() == 3
        && batch.operator_ids.len() == 3
        && batch.failure_domain_ids.len() >= 3
}

Type guard

fn identities_complete(batch: &ExecutionVerificationBatch) -> bool { has_quorum_ids(batch) }

Prevention

When it happens

Trigger: Calling record_execution_verification_batch where provider_ids.len() != 3, operator_ids.len() != 3, or failure_domain_ids.len() < 3.

Common situations: Configuration changed the expected number of providers/operators but the batch assembler still collects the old count; a provider was offline so only 2 responses were gathered; failure-domain metadata not attached to some decisions.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/d8adbe05495d88a1. Report an issue: GitHub.