Supply-Chain Security Standards
Use this page for dependency-admission policy. For the broader repository security model, see Security.
Dependencies are part of the trusted computing base. Adding or upgrading one is a security decision, not a convenience refactor.
Default posture
The default posture is conservative:
- prefer no new dependency when the standard library or clear local code is sufficient,
- prefer mainstream, well-established, widely used packages with clear ownership and disciplined release hygiene,
- prefer narrow scope and understandable transitive impact,
- reject low-trust, weakly maintained, opaque, or hastily assembled packages by default.
Packages that look speculative, obscure, AI-generated, or weakly reviewed should normally be rejected even if they appear to solve the immediate problem.
Admission bar
New dependencies must satisfy all of the following unless a maintainer approves a documented exception:
- Clear need: the dependency solves a problem we should not own with a small amount of local code.
- High trust: the package is well known in its ecosystem, broadly adopted, and maintained by identifiable owners.
- Maintenance evidence: the project shows sustained releases, active maintenance, and no obvious abandonment.
- Quality evidence: the source, tests, scope, and release notes show engineering rigor.
- Security fit: known advisories, install behavior, provenance, and transitive impact are acceptable for this repository.
- Operational fit: licensing, platform support, lockfile review, and update cadence fit the repository workflow.
If one of these is weak, the default answer is no.
Default rejection cases
Do not add a dependency when one or more of these are true unless a maintainer explicitly approves a documented exception:
- the project is very new and has little release history,
- the package is niche, obscure, or lightly adopted relative to established alternatives,
- ownership is anonymous, unstable, or difficult to verify,
- the source or release process appears sloppy, inconsistent, or low rigor,
- the value proposition is vague or duplicates a small amount of code we can own ourselves,
- the package pulls in a large or poorly understood transitive tree,
- the package has a pattern of unreviewed breaking changes, yanked releases, or unresolved security concerns,
- the project looks like generated output, AI-produced glue, or otherwise "hacked together" code without disciplined engineering.
Review requirements
When evaluating a dependency, review the package and its repository using these signals together. No single metric is enough.
Trust and adoption
- registry downloads or install volume,
- reverse dependency count or broad ecosystem usage where available,
- usage by respected projects or organizations,
- name recognition within the ecosystem.
Maintenance and ownership
- age of the project,
- release cadence over time, not just one recent release,
- named maintainers with a visible track record,
- responsiveness to issues, bugs, and security reports,
- evidence that releases are intentional and documented.
Engineering quality
- clear README and scope,
- coherent source layout and test coverage,
- changelog or release notes with meaningful content,
- explicit compatibility and platform guidance,
- no obvious signs of copy-paste or low-discipline implementation.
Security and supply-chain posture
- published advisories checked and understood,
- lockfile support and deterministic installation,
- reasonable transitive tree size,
- no suspicious install scripts, network behavior, or opaque binary delivery unless clearly justified,
- provenance, signatures, or attestation support when the ecosystem provides them.
Required ecosystem-specific checks
- Rust: inspect
cargo tree, runcargo audit, runcargo deny check, and reviewcargo outdated --workspace --root-deps-onlywhen version drift matters. - Python: review
uv.lockanduv treewhen available, inspect PyPI metadata and release history, and review known advisories. - Node: inspect
package-lock.json, review install scripts and binary delivery, and runnpm audit --package-lock-onlywhen npm is available.
Pull request expectations
Any pull request that adds or materially changes an external dependency should explain:
- why the dependency is needed,
- what alternatives were rejected and why,
- why the chosen package is trustworthy,
- what the transitive impact is,
- what checks were run.
If the package is not an obvious ecosystem staple, the pull request should include a short justification covering adoption, maintenance history, ownership, and security posture.
Enforcement
Automation supports this policy but does not replace it:
cargo auditcargo deny checkcargo outdated --workspace --root-deps-only- Dependabot coverage policy for GitHub Actions
detect-secretsandgitleaks- Rust, Python, and Node lockfiles
Automation is the floor, not the bar.
Exceptions
Exceptions should be rare. When needed, document:
- why established alternatives were insufficient,
- the specific risks being accepted,
- the controls that will monitor the dependency,
- the exit path if the package degrades or a better option appears.
Without that level of justification, do not merge the dependency change.