The pipeline hung on `npm install` because no package-lock.json existed,
forcing a full from-scratch dependency resolve on every build. Commit the
resolved lockfile and switch the Dockerfile to `npm ci` for deterministic,
fast installs. Add .dockerignore to keep the build context small.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>