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
- Re-initialize/rotate the execution_verification_nonce ledger to the new manifest_version and manifest_digest, then retry.
- Rebuild the batch from the currently deployed manifest metadata so version and digest match the ledger.
- Verify the digest computation is deterministic (canonical serialization) across build environments.
- 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
- Use deterministic canonical serialization when computing manifest digests.
- Rotate/reinitialize the ledger as part of the manifest upgrade runbook.
- Never reuse batches built under an older manifest after a deploy.
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
- Replacement scan manifest identity changed
- Verified finalized transaction count advanced without an act
- AX fills total_count changed during pagination: expected {ex
- AX fills pagination returned more unique rows ({}) than tota
- AX fills pagination returned {} unique rows, expected {total
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/c26698125af12348.
Report an issue: GitHub.