astrid-runtime/astrid · error

capsule '{}' is {}; --yes configures values but does not app

Error message

capsule '{}' is {}; --yes configures values but does not approve install authority. Re-run with --approve-untrusted after reviewing the artifact

What it means

authority_decision implements the capsule install-authority consent flow. A capsule whose provenance is not automatically trusted requires explicit operator approval. Passing `--yes` silently is deliberately rejected: automated 'yes to all' must never grant install authority. The error names the capsule, its provenance label, and the exact flag to use after reviewing the artifact.

Source

Thrown at crates/astrid-cli/src/commands/capsule/install/authority.rs:38

) -> anyhow::Result<AuthorityDecision> {
    if matches!(
        inspection.provenance,
        ArtifactProvenance::LocalRuntime { .. }
    ) {
        return Ok(AuthorityDecision::Automatic);
    }
    if BATCH_MODE.load(Ordering::Relaxed) {
        return Ok(AuthorityDecision::OperatorDistribution {
            content_digest: inspection.content_digest.clone(),
        });
    }
    if prompt.approve_untrusted {
        return Ok(AuthorityDecision::ExplicitApproval {
            content_digest: inspection.content_digest.clone(),
        });
    }
    if prompt.yes {
        bail!(
            "capsule '{}' is {}; --yes configures values but does not approve install authority. Re-run with --approve-untrusted after reviewing the artifact",
            inspection.capsule_id,
            inspection.provenance.label()
        );
    }

    eprintln!();
    eprintln!(
        "Capsule {} {} is {}.",
        inspection.capsule_id,
        inspection.version,
        inspection.provenance.label()
    );
    if let Some(signer) = inspection.provenance.signer() {
        eprintln!("  Signer: {signer}");
    }
    eprintln!("  Content: {}", inspection.content_digest);
    if inspection.capability_expansions.is_empty() {

View on GitHub (pinned to affd8760f4)

Solutions

  1. Review the capsule first (digest, signer, capability expansions), then re-run with `--approve-untrusted` instead of `--yes`.
  2. If this is an operator-managed distribution, run through the batch/distribution path where BATCH_MODE grants OperatorDistribution authority.
  3. Only approve if the artifact is trusted: verify the content digest against the publisher's published checksum.
  4. If the capsule should be inherently trusted (locally built runtime artifact), check why its provenance is not LocalRuntime (e.g. it was downloaded rather than built locally).
  5. In CI, use the intended non-interactive approval flag (--approve-untrusted) explicitly after verifying the artifact, rather than --yes.

Example fix

// before
astrid capsule install ./third-party.capsule --yes
// after
# inspect digest/signer, then:
astrid capsule install ./third-party.capsule --approve-untrusted
Defensive patterns

Strategy: validation

Validate before calling

fn will_reject_yes(yes: bool, approve_untrusted: bool, batch_mode: bool, provenance_local: bool) -> bool {
    !provenance_local && !batch_mode && yes && !approve_untrusted
}
// if will_reject_yes(...), pass --approve-untrusted instead of --yes

Try / catch

if ! astrid capsule install "$ART" --yes 2>&1 | grep -q 'does not approve install authority'; then
  echo "untrusted capsule: review then pass --approve-untrusted"
fi

Prevention

When it happens

Trigger: Installing (via install_from_local_path_for_principal, unpack_via_lib, or daemon_install_authority) a capsule whose provenance is not LocalRuntime, with ManualInstallOptions.yes == true and approve_untrusted == false, outside BATCH_MODE. The bail fires before the interactive prompt is shown.

Common situations: CI or scripts pipe `yes | astrid capsule install ...` or pass -y expecting it to skip all prompts; a developer aliases the install command with --yes and hits an untrusted third-party capsule; installing a capsule signed by an unknown signer after a dependency update.

Related errors


AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09). Data as JSON: /api/errors/c07a5862190f0472. Report an issue: GitHub.