Repository navigation
Releases
Releases · TrianaLab/aval
v0.4.0
Minor Changes
- 4c8029a:
run --pushandpushsign keyless from a laptop: without--keyor$SIGSTORE_ID_TOKENand with a terminal (or with the new--loginflag), they open the interactive Sigstore login in the browser (oauth2.sigstore.dev, client idsigstore;$SIGSTORE_OIDC_ISSUERand$SIGSTORE_OIDC_CLIENT_IDoverride them) right before signing, after the test ran. The token is used for that signature only and never stored. Without a terminal and without--login, a run with no key and no token still fails fast with exit 2.--keyand--loginexclude each other.
Patch Changes
- b619b24: More than 64 attestations for a fingerprint now prints an
aval: SECURITY:line naming the cap, as a possible flooding attempt; the outcome stayserrorand the test runs. Aval's own CI and release jobs fail when a verify report lists a verification failure inrejected, even when a trusted result verified.
v0.3.0
Minor Changes
- 4b68dd5:
aval stats --registry <repo> [--test <id>] [--since <duration|date>] [--by test|repository] [--output text|json]reads the run records in the registry and aggregates them on demand: runs, hit rate, misses by cause, verification failures, shadow false hits, and total and saved test time, per test (or per source repository with--by repository) and in total. It writes nothing. Records that are unreadable, oversized, malformed or inconsistent are skipped and counted; reading stops after 1000 records or 64 pages per listing, with a warning. New format, provisional:aval.trianalab.io/stats-report/v1(pkg/evidenceaddsStatsReport,TestStats,RepositoryStats,RunStats,MissCauses,StatsReportVersionandStatsUnknownRepository). Run records gain the optionalverifiedResultandrepository(--repositoryonaval runandaval record; records without it count asunknown), andevidence.ParseRunRecordnow rejects inconsistent records (reused: truerequires outcomeverifiedandtestDurationMs0;verifiedResultrequires outcomeverified), soaval recordrefuses a hand-edited record that claims a reuse that never happened. Docs explain pruning old records with ORAS. - 6351105: Registry I/O is bounded.
run,verifyandpushtake--registry-timeout(default1m). A registry that stalls past the timeout gives outcomeerror, andaval runstill runs the test. Lookup follows at most 64 referrers pages. A listed attestation whose manifest was deleted (404) counts as absent: the remaining candidates can still be reused, and the outcome is a miss if every candidate is gone. One credential store and one auth cache are shared by every registry call. The keyless trusted root (a TUF fetch whentrustedRootis not pinned) is loaded only when a candidate's bundle carries a certificate. After pushing,pushandrun --pushconfirm that the new digest is listed among the referrers, re-pushing up to three times, and fail if it never appears. - 7cd688f: Aval detects mutable references in a test's inputs and refuses to reuse them. A static, offline scanner reads the files in the contract scope and
runner.command, one detector per ecosystem: container images without a digest (Compose and Kubernetesimage:, DockerfileFROMandCOPY --from,docker runandpodman run, compose files the command uses but the scope does not hold), Go (go.modwithoutgo.sum,go install pkg@latest), npm, yarn, pnpm and bun (package.jsonwithout a lockfile, unpinnednpm iandnpx), Python (unpinnedrequirements*.txtentries, missing hashes, Poetry and Pipenv without a lockfile, unpinnedpip install), Rust (Cargo.tomlwithoutCargo.lock), Java (Maven and GradleSNAPSHOT,LATEST,RELEASE, dynamic versions and ranges), Ruby (GemfilewithoutGemfile.lock), PHP (composer.jsonwithoutcomposer.lock), OS packages (apt-get installandapk addwithout versions), remote scripts (curl … | sh, remoteADDwithout--checksum) and git (git clonewithout a commit, submodules that track a branch). Forhermeticandcontrolled-environmentcontracts any unacknowledged finding makes the lookup amiss(exit 4 forverify) whose reason lists each reference, the test runs, andrun --pushandpushdo not publish (exit 1).external-dependenciescontracts get the findings as information;non-deterministicis unchanged.aval runprints each finding as amutable:line (--fingerprint-onlyprints them on stderr). Contract format change, additive withinaval.trianalab.io/v1: the optionalscope.allowMutablelist (refandreason) acknowledges a reference by the exact text Aval reports. It is part of the contract hash; contracts without it keep their fingerprint, and the manifest staysaval-fingerprint/v1. Olderavalbinaries reject contracts that use the new field. A contract whose scope holds a mutable reference that earlier versions reused now misses until the reference is pinned or acknowledged. Guide: "Pin your dependencies" (docs/pinning.md). - 0e259b7: Aval resolves declared artifacts to immutable ids at fingerprint time. The optional
scope.resolvelist takeskind: referenceentries for container images (image, tag to manifest or index digest), npm, PyPI, Go modules (through the module proxy,h1:hash), Maven, crates.io, RubyGems, git (ref to commit withgit ls-remote) and plain URLs (sha256 of the download, up to 256 MiB). Each resolves a tag, a version range or a branch to its digest, checksum or commit, which goes into the manifest as aresolve <kind> <reference> <version> <id>line: a repushed tag, a new release inside a range or a moved branch changes the fingerprint. Resolution is opt-in and stateless, bounded by a 2-minute deadline; a reference that cannot be resolved fails the fingerprint, so nothing is looked up, the test runs and nothing is published, and the reason names the reference.aval run --explainprints the time each lookup took on stderr.scope.resolvenever clears a finding of the mutable-reference scanner: it makes a move change the fingerprint, and the reference still blocks reuse until it is pinned in place or accepted withscope.allowMutable.scope.resolvebinds the named artifact, not its transitive dependencies. Registries come from$npm_config_registry,$GOPROXY,$AVAL_PYPI_URL,$AVAL_MAVEN_URL,$AVAL_CRATES_INDEXand$AVAL_RUBYGEMS_URL; credentials from the Docker config,~/.npmrctokens,~/.netrcmachine entries and git, sent only over https or to a loopback host. Format changes, additive: the contract field withinaval.trianalab.io/v1(older binaries reject contracts that use it), and theresolvemanifest lines withinaval-fingerprint/v1, which only contracts with the field have; every other manifest is unchanged. Guide: "Resolve references" (docs/resolve/). - 8d4b8d8: Run statistics in the registry.
aval run --recordpublishes one run record per run, for every outcome, with the test id, fingerprint, outcome, whether the result was reused, the result, the test duration, the saved duration, the aval version, a timestamp and an optional--ci-run-url. Records hang off a per-test stats anchor taggedstats-<test id>, never off a fingerprint anchor.runandverifynever read them, so a record cannot cause reuse or count toward the candidate cap. Recording is best-effort: a record that cannot be published, for example without write credentials, is a warning and never changes the exit code.--record-filewrites the record to a file andaval recordpublishes it later. New format identifiers, provisional:aval.trianalab.io/run-record/v1,application/vnd.trianalab.aval.run.v1(+jsonfor the layer) andapplication/vnd.trianalab.aval.stats.v1.pkg/evidenceaddsRunRecord,ParseRunRecordand these constants. - ff2a2c8: A contract can depend on other contracts in the same repository. The optional
scope.contractslist takes paths to otheraval.yamlfiles, relative to the contract (../backend/aval.yaml). Each referenced contract is fingerprinted from its own directory and scope, and its fingerprint goes into the manifest as acontract <path> <name> <fingerprint>line, transitively: a change inside a referenced contract's scope makes the dependent miss and run, a change outside it does not. References must stay inside the git working tree of the contract (the nearest directory with a.gitentry); a missing, invalid, symlinked or cyclic reference, or more than 8 levels or 64 contracts, fails the fingerprint, so the test runs. A referenced contract's mutable references block the dependent's reuse unless the referenced contract's ownscope.allowMutableaccepts them.aval run --explainprints the dependency tree after the manifest. Format changes, additive: the contract field withinaval.trianalab.io/v1(older binaries reject contracts that use it), and thecontract <path>manifest lines withinaval-fingerprint/v1, which only contracts with the field have; every other manifest is unchanged. Guide: "Depend on another part of the repo". - 6b94c21: One-line installers:
scripts/get-aval.sh(Linux and macOS,curl | bash) andscripts/install.ps1(Windows,irm | iex). Both refuse a download whose sha256 does not match the release'schecksums.txt, and verify the release signature (cosign) and SLSA provenance (gh attestation verify) when those tools are installed. See docs/install.md.
Patch Changes
- 0553f1e:
scope.allowMutableentries take an optionalfile:(the path a finding prints, relative to the contract, orrunner.command): the entry then accepts the reference in that file only. A ref-only entry still accepts a reference that one file reports; when several files report it (generic refs such asresources[0]orpatches[0]repeat across kustomizations), nothing is accepted and the finding asks forfile:. Withscope.contracts, each contract's entries apply to its own findings. The scanner also reports kustomizehelmChartsentries other than a local chart in the scope, and patches given by a path outside the scope; checks instructions behindONBUILD; uses the# escape=character when it splits heredoc words; and no longer reports arangeloop's key variable used as a key directly underlabels:orannotations:in a Helm template. Since the previous release, image refs in JSON files ("image": "postgres:16",) no longer end in",: update an acknowledgement written with the trailing characters to the bare reference (postgres:16). - 2df8ee2: A signer the trust policy lists but below
minTrustLevelis now reported asmiss(exit 4), and with outcomemissin the verify report'srejectedlist, instead ofverification-failed(exit 5). Such an attestation is still never reused, and a false claim from that signer staysverification-failed. The report stays `aval.trianalab.i...
v0.2.0
Minor Changes
- 0148c76: Formats are frozen. The contract and policy
apiVersionis nowaval.trianalab.io/v1and the verify reportversionisaval.trianalab.io/verify-report/v1;aval.dev/v1alpha1contracts and policy files are rejected, so change that line in yours. The contract hash coversapiVersion, so results published before are misses and each test runs once. The predicate type (https://aval.trianalab.io/attestation/execution/v2), media and artifact types (application/vnd.trianalab.aval.execution.v2,application/vnd.trianalab.aval.fingerprint.v1) and predicateschemaVersionv2are unchanged and now frozen, so attestations written by v0.1.0 keep a valid, readable format. Compatibility rules (additive changes within a version, what needs a new version, how consumers treat unknown fields and values, deprecation) are indocs/artifact-format.md, and golden files guard the JSON shape of the statement, predicate and verify report.
Patch Changes
- c17dc26:
aval runandaval verifyescape newlines and control characters in reasons printed as text and on stderr, so text from an untrusted attestation cannot start a log line of its own. Aval's own CI now reuses its signed e2e results, and a release requires a verified e2e attestation for its commit. - 59b9b66:
pkg/evidenceis semver-stable Go API: within a major version it changes additively only, and CI fails when an exported identifier is removed or changes type or signature without a new major module path.examples/evidence-consumeris a separate module that consumes Aval evidence throughpkg/evidencealone, with its own signature verifier. The policy is indocs/integrations.md. - bbf9e55: Fingerprinting fails closed in two more cases: a
scope.sourceglob that matches no file (a typo, or a name that differs on disk by case or Unicode form), and a file excluded only because a trailing**inexcludematched zero segments (build/**against a file namedbuild). Trees that fingerprinted before and still do keep the same fingerprint. A table-driven false-hit corpus now pins every kind of relevant and irrelevant change.
v0.1.0
Minor Changes
- a6d2b1a: First release: signed
avalbinaries for Linux, macOS and Windows with checksums, SBOMs and SLSA provenance.aval --versionprints the release version.
Patch Changes
- 59664a3: Dependency updates:
oras.land/oras-go/v22.6.4 to 2.7.0; GitHub Actionsactions/checkoutto v7.0.1,actions/setup-goto v7.0.0,actions/upload-artifactto v7.0.2,actions/download-artifactto v8.0.2 andactions/dependency-review-actionto v5.0.0 (Node 24 runtime).