Files
MetaCrate/docs/release-provenance.md
Chili Palmer b71386dc31
Some checks failed
API and SemVer surface / api-surface (push) Failing after 13m11s
Native code generation / deterministic (push) Failing after 2m9s
Documentation / documentation (push) Failing after 1m39s
Imaging and meshing gate / native (push) Failing after 2m58s
Release platform and feature matrix / audit (push) Successful in 44s
Native Rust workspace compile / compile (push) Failing after 55s
Dependency and supply-chain audit / audit (push) Failing after 9m14s
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Failing after 9m22s
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Audit release licenses and provenance (#104)
2026-08-12 02:12:49 +00:00

5.4 KiB

Release license, provenance, and asset audit

MetaCrate treats every source-derived file, generated output, fixture, bundled asset, locked Rust package, and native component as release input. The canonical hand-reviewed policy is ci/provenance-policy.json; the native Rust metacrate-ci-matrix tool turns that policy and Cargo.lock into deterministic notices and distribution manifests.

Ownership model

Files authored for MetaCrate are BSD-3-Clause under LICENSE.md. That license retains the BSD attribution for the pinned LibreMetaverse public API, behavior, translated tests, fixtures, and algorithms. The exact upstream repository and commit are recorded in the policy, source-generator inventory, API ledgers, parity ledgers, and distribution manifest. The pinned upstream BSD text is shipped verbatim as licenses/LibreMetaverse-BSD-3-Clause.txt and verified against its recorded source hash.

The audit requires three independently generated provenance ledgers—compiled public API, upstream program sources, and upstream tests/fixtures—to identify that same pinned commit. This binds rewritten code and documentation mappings to the BSD source attribution instead of relying on filename conventions.

Exceptions to the default project-owned classification must be explicit materials in the policy. The audit recursively inventories every non-README file below codegen/inputs, tests/fixtures, and fuzz/corpus, rejects a missing or extra entry, validates its SHA-256, origin, license, and distribution class, and scans the complete release file list for binary/asset extensions. An image, mesh, audio file, native library, or viewer asset therefore cannot be added as an unreviewed opaque file.

The seven required inputs copied from LibreMetaverse's linden/ directory are CC-BY-SA-3.0, not BSD-3-Clause. They remain unmodified, are attributed to Linden Lab in NOTICE.md, and carry their exact hashes and license through the generated Rust headers. MetaCrate deliberately excludes the neighboring Linden textures, meshes, animations, gestures, clothing, body parts, and viewer binaries. The legal-code URI and hash of the upstream legal code are recorded in licenses/CC-BY-SA-3.0-NOTICE.md.

Locked dependency notices

provenance-report obtains the complete all-feature package graph from cargo metadata --locked, joins every registry package to its crates.io checksum in Cargo.lock, and reads license, copyright, copying, and notice files from the downloaded crate archives. Identical texts are stored once in the consolidated notice while every package records the filenames and hashes that apply to it. When a split package omits a repository-wide license file, the report uses a matching sibling package from the same repository. If an archive supplies no usable notice at all, the report emits a visible generated notice containing its declared SPDX expression, authors, repository, and SPDX legal-text links; packages are never silently omitted.

The generated artifacts are:

OpenJPEG, Opus, and ALSA are system libraries and are not redistributed by MetaCrate. Skia and the optional aoTuV/Lancer Vorbis/libogg sources can enter a binary through feature builds, so their package notices are included in the locked third-party notice. A downstream distributor that supplies a system library must add the exact notice belonging to the native package it ships.

Reproduction and gate

Fetch the immutable locked crate archives, regenerate, then audit:

cargo fetch --locked
cargo run --locked -p metacrate-ci-matrix -- provenance-report
cargo run --locked -p metacrate-ci-matrix -- \
  provenance-audit --evidence /tmp/metacrate-provenance-audit.json

The audit regenerates every report in memory and requires byte-for-byte identity with the checked-in files. Its JSON evidence records the source, material, generated-output, dependency, unique-notice, and native-component counts plus every generated report hash. Evidence creation is exclusive and never overwrites an earlier run. A reviewed representative result is retained at ci/evidence/provenance-audit.json; CI writes a fresh result into its uploaded artifact directory.

The Gitea supply-chain job runs only on ubuntu-latest, fetches the locked archives, runs this audit, then keeps the existing cargo-deny and cargo-machete gates. It runs for every source change because the distribution manifest intentionally covers the whole release source tree. Live-grid credentials, .env, network services, fuzz runners, and physical devices are not used by this deterministic issue gate.