nautechsystems/nautilus_trader · error

Verified action manifest identity changed

Error message

Verified action manifest identity changed

What it means

Thrown when the manifest_version or manifest_digest in the batch does not match the values stored in the canonical nonce ledger. The ledger pins the verified-action manifest identity; any change (new manifest deployed, digest recomputed differently) must go through re-initialization, otherwise evidence continuity would break.

Source

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

            .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
                FROM execution_verification_nonce
                WHERE chain_id = $1 AND wallet_address = $2
                FOR SHARE
                ",
            )
            .bind(chain_id)
            .bind(batch.wallet_address)
            .fetch_optional(&mut *transaction)
            .await
            .map_err(|e| anyhow::anyhow!("Failed to read verified action nonce ledger: {e}"))?
            .ok_or_else(|| anyhow::anyhow!("Canonical nonce ledger is not initialized"))?;
        anyhow::ensure!(
            manifest_version == batch.manifest_version && manifest_digest == batch.manifest_digest,
            "Verified action manifest identity changed"
        );
        let intent_nonce = sqlx::query_scalar::<_, Option<i64>>(
            "
            SELECT nonce
            FROM execution_intent
            WHERE id = $1 AND chain_id = $2 AND wallet_address = $3 AND active
            FOR UPDATE
            ",
        )
        .bind(batch.intent_id)
        .bind(chain_id)
        .bind(batch.wallet_address)
        .fetch_optional(&mut *transaction)
        .await
        .map_err(|e| anyhow::anyhow!("Failed to lock intent for verified action: {e}"))?
        .ok_or_else(|| anyhow::anyhow!("Active verified-action intent was not found"))?;

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Re-initialize/rotate the execution_verification_nonce ledger to the new manifest_version and manifest_digest, then retry.
  2. Rebuild the batch from the currently deployed manifest metadata so version and digest match the ledger.
  3. Verify the digest computation is deterministic (canonical serialization) across build environments.
  4. Drain or discard in-flight batches created under the old manifest before upgrading.

Example fix

// before: stale manifest metadata in batch
let batch = ExecutionVerificationBatch { manifest_version: "v1".into(), manifest_digest: old_digest, .. };
// after: derive from the deployed manifest
let manifest = load_deployed_manifest();
let batch = ExecutionVerificationBatch { manifest_version: manifest.version.clone(), manifest_digest: manifest.canonical_digest(), .. };
Defensive patterns

Strategy: validation

Validate before calling

// Rust: compare manifest identity with the ledger before building the batch
let (version, digest) = fetch_ledger_manifest_identity(&db, chain_id, wallet).await?;
anyhow::ensure!(
    version == manifest.version && digest == manifest.canonical_digest(),
    "manifest drift: ledger=({version},{digest}) local=({}, {})", manifest.version, manifest.canonical_digest()
);

Prevention

When it happens

Trigger: Calling record_execution_verification_batch after the execution verification manifest was updated (version bump or digest change) without re-initializing the nonce ledger, or with a batch built from stale manifest metadata.

Common situations: Deploying a new manifest version while in-flight batches still carry the old version/digest; canonicalization differences (JSON key order, serialization) producing a different digest for the same manifest; mixing environments where ledgers hold different digests.

Understand the failure class

Background: Checksum mismatch errors: "checksum verification failed", "digest mismatch", "expected vs actual checksum" — what they mean and how to fix them — this error's family across 41 libraries.

Related errors


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