Backup Run Not Recorded
URI: https://docs.ankatech.co/errors/backup-run-not-recorded
HTTP Status: 422 Unprocessable Content
When you see this
The environment host's attest-backup-offhost.sh declared that a backup archive was copied off the host, and the archive SHA-256 it sent is not the archive digest of any successful backup run this deployment has recorded. The platform accepts an off-host declaration only for an archive it knows, so that a declaration is always tied to one recorded backup; this one names none.
The request is well formed — the digest has the right shape — and what it asserts is not something the platform recorded, which is why it is a 422 rather than a 400 (RFC 9110 §15.5.21).
attest-backup-offhost.sh reports this answer as its exit code 5.
Common Causes
- The digest was mistyped, or measured over the wrong file — a payload (
-secrets.gpg,-hsm-tokens.tar.gz.gpg) instead of the archive (.tar.gz.gpg). - The copy at the destination is not byte-identical to the archive the run wrote: a partial or re-compressed transfer produces a different digest. That is the copy this check exists to catch.
- The run's own report was never recorded:
backup-env.shprinted a warning that the run is not recorded by the platform (the edge was unreachable, or the platform answered an error). A run the platform does not know cannot be declared. - The run did not succeed. Only a successful run has an archive; a refused or failed run wrote none.
- The archive belongs to another deployment.
Response Example
{
"type": "https://docs.ankatech.co/errors/backup-run-not-recorded",
"title": "Backup run not recorded",
"status": 422,
"detail": "No recorded successful backup run has an ARCHIVE with this SHA-256. Declare the off-host copy of an archive this deployment reported as backed up, using the digest measured at the destination; nothing was recorded.",
"timestamp": 1791339340,
"extensions": {
"requestId": "1d6f8a30-b47c-42e9-85a1-c03e9f7b2d46"
}
}
Content-Type: application/problem+json — the response follows RFC 9457 Problem Details. The instance member, omitted above, carries the request path.
The detail is written by the server and never echoes the submitted digest.
What this refusal leaves behind. Nothing is recorded: the Recovery readiness card on System Health keeps showing no off-host copy for the last successful backup. The refused declaration itself is written to the platform audit trail, so a declaration that did not match still leaves a record.
How to Resolve
- On the host, find the
Archive SHA-256linebackup-env.shprinted in the summary of the run you copied. It is the digest over the sealed archive, the same value the run reported. - At the destination, run
sha256sumon the copied.tar.gz.gpgand compare. If they differ, copy the archive again and verify it before declaring it. - Check that the run's report reached the platform: the run's last line says the run is recorded, and System Health's Recovery readiness card shows it as the last successful backup. If it was not recorded, run a new backup and copy that one.
- Declare again with the digest measured at the destination:
sudo attest-backup-offhost.sh <env> --archive-sha256 <digest>.
For full schema definitions, examples, and interactive testing, see the Developer Hub Reference.