astrid-runtime/astrid · error

{label} release metadata does not bind the authenticated leg

Error message

{label} release metadata does not bind the authenticated legacy release manifest

What it means

This error is thrown by verify_release_extension when the extension's legacy_release section fails to bind the downloaded legacy release manifest: either metadata_asset/metadata_blake3 in the extension do not match pointer.release, or the BLAKE3 hash of the actually-downloaded legacy manifest bytes does not equal the metadata_blake3 recorded in the extension. This cryptographically ties the legacy manifest you received to the release metadata, so a tampered or wrong manifest is rejected.

Source

Thrown at crates/astrid-cli/src/commands/update_channel.rs:671

        .with_context(|| format!("{label} release metadata is not UTF-8"))?;
    let extension: ReleaseExtension = toml::from_str(text)
        .with_context(|| format!("{label} release metadata is invalid TOML"))?;
    ensure!(
        extension.schema_version == 1
            && extension.kind == expected_kind
            && extension.product == PRODUCT
            && extension.repository == REPOSITORY,
        "{label} release metadata identity is invalid"
    );
    canonical_version(&extension.version)?;
    ensure!(
        extension.version == pointer.release.version
            && extension.tag == pointer.release.tag
            && extension.source_commit == pointer.release.source_commit
            && extension.release_workflow_identity == pointer.release.release_workflow_identity,
        "{label} release metadata does not match the authenticated legacy release"
    );
    ensure!(
        extension.legacy_release.metadata_asset == pointer.release.metadata_asset
            && extension.legacy_release.metadata_blake3 == pointer.release.metadata_blake3
            && blake3::hash(legacy_manifest_bytes).to_hex().as_str()
                == extension.legacy_release.metadata_blake3,
        "{label} release metadata does not bind the authenticated legacy release manifest"
    );
    validate_targets_for(
        &extension.targets,
        expected_targets,
        &extension.version,
        &format!("{label} release metadata"),
    )?;
    Ok(extension
        .targets
        .iter()
        .find(|entry| entry.triple == target)
        .with_context(|| format!("{label} release metadata target set is incomplete"))?
        .blake3

View on GitHub (pinned to affd8760f4)

Solutions

  1. Re-download both the legacy manifest and the extension metadata from the authenticated release and retry — a transient corruption is the most common cause
  2. Verify the legacy manifest's blake3 hash manually and compare with the metadata asset name/hash recorded in the channel pointer
  3. Republish the release so extension metadata and legacy manifest are generated from the same pipeline run
  4. If operating a mirror, ensure assets are served byte-identical (verify checksums after sync)

Example fix

// before: serving a re-uploaded manifest without updating extension metadata
legacy_release.metadata_blake3 = "<hash of OLD manifest>"  // downloaded manifest is new
// after: regenerate metadata after the manifest is final
legacy_release.metadata_blake3 = blake3::hash(final_manifest_bytes).to_hex()
Defensive patterns

Strategy: validation

Validate before calling

fn manifest_is_bound(ext: &ReleaseExtension, manifest_bytes: &[u8], pointer: &ChannelPointer) -> bool {
    ext.legacy_release.metadata_asset == pointer.release.metadata_asset
        && blake3::hash(manifest_bytes).to_hex().as_str() == ext.legacy_release.metadata_blake3
}

Try / catch

match verify_release_extension(&bytes, &manifest, &pointer, target, kind, targets, label) {
    Ok(blake3) => proceed(blake3),
    Err(e) if e.to_string().contains("does not bind") => {
        eprintln!("legacy manifest corrupted or mismatched; re-downloading assets");
        redownload_and_retry();
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling resolve_target_blake3 / verify_musl_extension / verify_windows_extension when the legacy manifest bytes were corrupted in transit, the wrong manifest asset was downloaded, the extension's legacy_release.metadata_asset or metadata_blake3 differ from pointer.release, or the extension metadata was regenerated without updating the manifest hash.

Common situations: Partial/truncated download of the legacy manifest (hash differs); a mirror serving a modified manifest; release pipeline rebuilt the manifest after the extension metadata was signed; pointer advanced to a release whose metadata_asset name changed.

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 astrid-runtime/astrid@affd8760f4 (2026-09-09). Data as JSON: /api/errors/4dbabd8937fe5672. Report an issue: GitHub.