Continuous integration
CI should fail at the earliest useful boundary and still prove the final artifact. Separate fast workspace feedback from packaging and end-to-end release jobs.
Pull-request gates
Run for every Rust change:
cargo fmt --all -- --check
cargo check --locked --workspace
cargo test --locked --workspace
cargo clippy --locked --workspace --all-targets --all-features -- -D warnings
Also build each capsule with its checked-in target configuration. A host-only workspace pass does not prove the WebAssembly component compiles.
Contract gates
When SDK or WIT inputs change:
- verify generated WIT mirrors are current;
- build every consuming capsule;
- compare the public API and WIT contract surface;
- reject an unversioned incompatible change;
- test both the oldest and newest supported runtime where the range spans them.
Artifact gates
For each release candidate:
- build from a clean checkout with
--locked; - produce the
.capsule, not only raw.wasm; - inspect the package manifest;
- calculate and record its digest;
- install into an isolated AOS home;
- execute success and denial smoke tests;
- upload only after every capsule passes.
Run matrix jobs for Linux and macOS when host tooling differs. Do not claim Windows support from a Rust cross-compile alone; the product needs state paths, IPC, services, installer, and end-to-end tests on Windows.
Product-site gates
The website is part of the release contract. It must pass both:
npm run check
npm run build
Validate that installer metadata names the same AOS version as release assets,
that the command downloads the product rather than a standalone runtime, and
that the developer-guide index contains working /developers/... URLs.
Secrets and logs
Use least-privilege workflow tokens, pin third-party actions to reviewed revisions according to repository policy, and never echo signing material. Keep release jobs protected from untrusted fork code.