be4e1a6123
`npm ci` does a clean install strictly from the committed lockfile (deterministic, no version drift) — needed to restore junction node_modules in a fresh worktree. Distinct from `npm install`/`npm i`, which stay hard-blacklisted because they can pull new/updated versions; the blacklist runs before the whitelist, so they remain blocked. Word boundary after `ci` prevents `npm cider`-style prefix matches; chain semantics still block `npm ci && <mutating>`. TDD: RED (3 allow-cases failed default-deny) -> GREEN (/^npm\s+ci\b/) -> tools-vitest 1998 passed / 2 skipped (2000). Backlog item A; plan docs/superpowers/plans/2026-05-31-discipline-guard-backlog.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>