ADR-0103: npm audit Joins the Verification Gate as a Second Standing Input¶
- Status: accepted
- Date: 2026-08-04
- Deciders: Nicolas Burri ("go with npm audit as a second gate input"), from the 2026-08-03/04 bump evening's observation: npm audit saw four dev-scope Highs before Dependabot did (one of them — fast-uri — being a previously recorded FIX that had itself become vulnerable), and the dev-scope advisory tail churns on a days-scale cadence.
- Relates to: the Dependabot + release-SBOM/grype gate (the first standing input),
docs/security/vuln-triage.md(the standing log both inputs feed), ADR-0090 (the release ritual this extends).
Context¶
One source of vulnerability signal is one blind spot: Dependabot's coverage lagged npm audit by days on the same lockfile, and closure of its alerts is only observable after a push. The gate needs a second, locally-runnable input — without turning the fast-churning development-scope tail into a permanently red CI.
Decision¶
- Blocking, in CI and locally: production scope only.
npm audit --omit=devmust come back clean (no advisories at any severity) — the shipped bundle's dependency set is small and is clean today; keeping it provably clean is cheap and non-negotiable. - Report-only: the full audit. The complete
npm audit(dev included) runs in the same gate step and publishes its summary as CI output/artifact — signal, never a build failure. Dev-scope findings are handled in waves at triage cadence, not per-advisory panic. - Exceptions are explicit and expiring: a checked-in allowlist file
(
docs/security/npm-audit-exceptions.json) keyed by advisory id, each entry carrying a reason, avuln-triage.mdrow reference, and an expiry date — an expired exception fails the gate. Empty today; expected to stay near-empty (production scope is clean). - The release ritual gains one line: reviewing the report-only dev tail (and sweeping it with a bump wave when warranted) happens at each release, riding the existing ADR-0090 checklist rather than a new calendar ritual.
Consequences¶
- A small gate script (wrapping
npm audit --json, applying the exception file, distinguishing blocking/report scopes) + a CI step in the frontend job + a localnpm runalias. vuln-triage.mddocuments the two-input posture; the release checklist gains the dev-tail review line.- Dependabot stays authoritative for closure tracking; npm audit is the early-warning and the local pre-push check. Divergence between them is itself signal (the fast-uri case).