---
# System prepended metadata

title: Audit Policies

---

# Audit Policies

### Motivation

Today there are a limited set of conditions in place that prevent the installation of a package (ex. integrity mismatches & engines conflicts); audits also happen post-installation meaning they are only advisory in practice.

### Solution

Introduce easily configurable audit definitions that can gate the installation of packages. This new feature should leverage existing functionality/commands (ex. `install`, `update` & `audit`), syntax (ex. Dependency Selectors) & metadata without expanding the scope to unbounded, arbitrary code execution (unlike `preinstall` scripts or lifecycle hooks).

### Known Caveats
- Adding extra validation during installation will slow down execution
  - this will be up to end-users to control & determine what validations are necessary to meet their own requirements
- Not all usecases will be met
  - we will be limited by the existing commands, syntax & metadata supported
  - we aim to meet 80% (or the majority) of usecases with this feature
  - end-users with broader security needs can & still should look at locking down developer environments & enforce policies at the system/network level (something that is outside the scope of the `npm` CLI today)

### Implementation

```json
{
    "audit": {
        "policies": [
            {
                "name": "Vulnerable",
                "type": "error",
                "query": ":vulnerable"
            },
            {
                "name": "Peer Conflicts",
                "type": "error",
                "query": ".peer:not(:deduped)"
            },
            {
                "name": "Deprecated",
                "type": "warn",
                "query": ":deprecated"
            },
            {
                "name": "Outdated",
                "type": "log",
                "query": ":outdated()"
            },
            {
                "name": "Licenses",
                "type": "log",
                "query": ":not([license=MIT])"
            },
            {
                "name": "Remotes",
                "type": "error",
                "query": ":type(git), :type(remote)"
            },
            {
                "name": "Extraneous",
                "type": "warn",
                "query": ":extraneous"
            },
            {
                "name": "Missing",
                "type": "warn",
                "query": ":missing"
            },
            {
                "name": "Duplicate Peers",
                "type": "warn",
                "query": ".peer:not(:deduped)"
            },
            {
                "name": "Bad Packages",
                "type": "error",
                "query": "#phishing, #spam, #malware"
            },
            {
                "name": "Bad Actors",
                "type": "error",
                "query": ":attr(contributors, [email=bad@example.com])"
            },
            {
                "name": "Architecture Mismatch",
                "type": "error",
                "query": "@supports(cpu:x64) { [cpu=!x64] }"
            }
        ]
    }
}
```

