The publish-npm step ended with `|| echo "[publish] Some packages may
already exist at this version — continuing"`, which unconditionally
converted any failure into success. That fallback silently masked a
real Gitea registry 404 during the @mosaic/* → @mosaicstack/* org
rename — CI reported green for pipelines #681 and #684 while every
single @mosaicstack/* publish fell on the floor, blocking users from
installing the gateway.
Replace the blanket swallow with a targeted rule:
- `E404 / E401 / ENEEDAUTH / ECONNREFUSED / ETIMEDOUT / ENOTFOUND` →
FATAL, fail the pipeline. These are real registry/auth/network
problems that must surface.
- `EPUBLISHCONFLICT / cannot publish over / previously published` →
tolerate. This is the legitimate "only some packages were bumped in
this merge" case and should not block CI.
- Any other unrecognized failure → FATAL (fail closed, not open).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>