Verify what you installed
Check urna release files with SHA-256 digests, GitHub attestations and the signed tag, and see which checks each channel and artifact actually has.
This page lists what each urna release artifact can be checked against and the command that checks it. The coverage is not uniform: build provenance exists for the five binary archives only, and the npm package and the PyPI wheels have no provenance at all. The examples use v0.5.1.
A matching digest proves the bytes are the ones the release published. An attestation proves which repository and workflow produced them. Neither says anything about a .urna file you open later; that is what urna validate and the citation hashes are for.
What each artifact has
| Artifact | Per-file .sha256 | In sha256.sum | SLSA build provenance | GitHub release attestation |
|---|---|---|---|---|
the five archives (urna-<target>.tar.xz, urna-x86_64-pc-windows-msvc.zip) | yes | yes | yes | yes |
urna-embedder-payload.tar.gz | yes | no | no | yes |
urna.cdx.xml (CycloneDX SBOM) | no | no | no | yes |
urna-npm-package.tar.gz | no | yes | no | yes |
urna.rb, sha256.sum, dist-manifest.json | no | no | no | yes |
What each install channel checks on its own:
| Channel | What it checks | Provenance |
|---|---|---|
install.sh, install.ps1 | archive and payload against their .sha256, before writing | not checked; verify the archive yourself |
urna setup | payload against its .sha256, while streaming | not checked |
| Homebrew | the archive against the SHA-256 pinned in the formula | not checked |
npm @urna/cli | nothing beyond HTTPS; the wrapper checks no digest | none exists: @urna/cli@0.5.1 has registry signatures but no npm provenance |
cargo binstall | nothing beyond HTTPS | not checked |
cargo install | crates.io registry checksums | not applicable (built from source on your machine) |
| PyPI wheels | pip's hashes | none exists: 0.5.0 and 0.5.1 carry no PEP 740 attestations |
The payload and the SBOM have no build provenance
Only the five archives get a SLSA provenance attestation. The embedder payload, which carries Python code that runs at query time, and the SBOM have a release attestation and, for the payload, a checksum, but gh attestation verify finds nothing for them. Check them with gh release verify-asset as shown below. See known limits.
Check a digest
Each archive and the payload have a <name>.sha256 file in sha256sum format (<hex> *<name>):
sha256sum -c urna-x86_64-unknown-linux-musl.tar.xz.sha256
sha256sum -c urna-embedder-payload.tar.gz.sha256On macOS, use shasum -a 256 -c with the same file. sha256.sum covers the five archives and the npm package in one file:
sha256sum -c --ignore-missing sha256.sumA digest fetched from the same server as the file catches a corrupted or truncated download. It does not catch a file replaced together with its digest; the attestations below do.
Check build provenance for an archive
The release workflow signs a SLSA provenance statement for each archive with GitHub's attestation service. It binds the archive's digest to the workflow run in hoffresearch/urna that built it. Verify with the GitHub CLI:
gh attestation verify urna-x86_64-unknown-linux-musl.tar.xz --repo hoffresearch/urnaThe statement's subjects also include the archive's .sha256, its README.md and the urna binary inside it, so the same command accepts an extracted binary.
Check the payload, the SBOM and the other assets
Every asset of the release is a subject of GitHub's release attestation. Verify any of them against the tag:
gh release verify-asset v0.5.1 urna-embedder-payload.tar.gz --repo hoffresearch/urna
gh release verify-asset v0.5.1 urna.cdx.xml --repo hoffresearch/urnaThis proves the file is the one attached to the v0.5.1 release. It says nothing about how the file was built.
GitHub marks the v0.5.0 and v0.5.1 releases as immutable, a setting that locks a published release's assets and tag.
Read the dependency list out of the binary
The binaries are built with cargo-auditable, which embeds the resolved dependency tree in a .dep-v0 section. cargo audit reads it back and checks it against the RustSec advisory database:
cargo audit bin ~/.local/bin/urnaThe full dependency list is also in the SBOM, urna.cdx.xml.
Check the release tag
Release tags are annotated and SSH-signed. The release workflow verifies the signature against .github/allowed_signers before anything builds. Check it yourself from a checkout:
git clone https://github.com/hoffresearch/urna && cd urna
git -c gpg.ssh.allowedSignersFile=.github/allowed_signers verify-tag v0.5.1The pip wheel and the npm package
Neither has a provenance statement today. For the wheel, pip checks each file against the hash PyPI serves, and nothing ties the wheel to a workflow run. The npm wrapper downloads the release archive over HTTPS and checks no digest. When you need provenance, download the release archive yourself, verify it as above, and put the binary on PATH (see installation). You can also verify a binary installed by another channel against the attestation, since the provenance subjects include the binary.
To install on a machine with no network after verifying here, see air-gapped install.
Air-gapped install and queries
Install urna on a machine with no network: copy the release files, point the installers at file://, build the Python env from a local wheelhouse.
The terminal explorer
Open a .urna file in urna tui, read its manifest and sections, ask it questions offline, check the install, and learn every key binding.