The heimdall command line
Heimdall is a defensive sandbox. Milestone 1 runs wasm jobs only.
heimdall run --job wasm --module <guest.wasm> --trust-root <root.der>... --in <dir> --out <dir>
[--policy <file>] [--pin-out <file>] [--pin-blake3 <hex>]
[--job-id <32 hex>] [--nonce <64 hex>] [--param key=value]...
heimdall verify-result <out>/result.signed --key <key file | key record>
[--files <dir>] [--job-id <32 hex> --nonce <64 hex>]
--job nativeand everyheimdall profile ...verb printnot in milestone 1and exit 2.--modulenames the guest; its signature<guest>.wasm.p7sand hash pin<guest>.wasm.blake3sit beside it and are verified against the--trust-rootcertificates before load. There is no unsigned mode: without a trust root the job does not start.--in,--outand--policyfollow RUN.md and POLICY.md.--job-idand--noncelet the caller bind the result to its own request; both are random when absent and printed either way.runprintspinned-key:,job-id:,nonce:,result:andverdict:lines on stdout.--pin-outalso writes the pinned key record to a new file.verify-resultchecks the format, the pinned key id and boot id, the Ed25519 signature and the result's well-formedness; with--job-idand--nonce, that the result is for that job; and that the files in--files(default:files/beside the result file, when it exists) are exactly the listed outputs with matching sha256 and length.
Exit codes
| Code | run | verify-result |
|---|---|---|
| 0 | the job ran and was Accepted | the result verified and says Accepted |
| 1 | — | the result did not verify (signature, key, boot, ticket, outputs) |
| 2 | usage error, or not in milestone 1 | usage error |
| 3 | the job could not start (policy, trust roots, guest load, input, out dir, --pin-out) | the result or key file could not be read, or the key record is malformed |
| 4 | the job ran and was Refused (the signed result was written) | the result verified and says Refused |