Files
orca/config/dependency-security.md
T
Neil 2078db93ec ci: check dependency vulnerabilities on PRs and stable releases (#31858)
* ci: audit dependency security without gating releases

* ci: audit stable release tags instead of running daily

* ci: isolate release audit data and fix integration checks

* ci: require exact audit inputs and ignore candidate archive attributes
2026-10-22 00:43:07 -07:00

2.7 KiB

Dependency security checks

pnpm check:dependencies audits the desktop, mobile, cloud, docs, and isolated audit-tool lockfiles, including development and optional dependencies. It does not install those workspaces or execute their pnpm hooks. High/critical advisories and scanner failures fail the check; lower severities remain visible in JSON reports under tmp/dependency-security/.

The Linux workflow runs on dependency-change PRs, manually, and when cutting a stable desktop release. There is no daily schedule. The release check scans the exact release tag in parallel with builds and must pass before the release is published; RC releases skip it. Stable releases audit the desktop and embedded mobile-web lockfiles plus native Rust. Cloud, docs, and isolated audit tooling remain covered by dependency PR checks and do not block desktop releases. Scanner tooling and exception policy come from the workflow commit, while lockfiles, patch registrations, and patch bytes come from the release tag. Only candidate Rust manifests, lockfiles, and patches are extracted; candidate package manifests, pnpm/Cargo configuration, and toolchain overrides are excluded. The candidate is not installed and its pnpm hooks do not run. Branch protection is unchanged.

The Rust job runs pinned cargo-deny 0.20.2 directly against every native manifest with --locked, all features, and no target restriction. The scanner binary is cached; advisory data is fetched on every run. Reports upload even on failure. The first CI run took 44 seconds for JavaScript and 2m04s for Rust, including a cold scanner installation; the audit steps themselves took 2 and 1 seconds.

The only JavaScript exceptions cover previously reviewed local patches. Each names an exact workspace, package, version, advisory, owner, expiry, patch path, and SHA-256. An exception is considered only for an actual high/critical finding. The patch bytes, workspace registration, and locked patch hash/snapshots must match before the exception applies. Expired exceptions stop exempting findings; stale exceptions for removed/fixed packages do not fail clean scans. Remove an exception and its patch when an upstream fixed version replaces them.

This initial check covers JavaScript and native Rust advisories. It does not establish reachability or scan licenses, container layers, downloaded binaries, CocoaPods, Gradle, or Ruby dependencies. Registry/advisory outages fail the check and block stable release publication until a successful rerun. After installing cargo-deny, the Rust command can also be run locally:

cargo deny --manifest-path native/windows-agent-hook/Cargo.toml --locked --config config/cargo-deny.toml check advisories