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 — pipelines #681 and #684 reported green while every single @mosaicstack/* publish fell on the floor, blocking users from installing the gateway until the registry issue was independently resolved in #394.
EPUBLISHCONFLICT / cannot publish over / previously published
Tolerate (legitimate "only some packages bumped" case)
Any other unrecognized failure
FATAL (fail closed)
Why this matters
This pattern was hiding the exact class of bug I was investigating for the last several hours. Without this fix the next publish-drift will hide itself the same way.
CI publish step runs normally on merge (no regression) — current main already has a healthy publish history so the happy path should succeed
Future broken publishes will now fail the pipeline instead of silently reporting green
## Summary
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 — pipelines #681 and #684 reported green while **every single `@mosaicstack/*` publish fell on the floor**, blocking users from installing the gateway until the registry issue was independently resolved in #394.
## Change
Replace the blanket swallow with a targeted rule:
| Pattern | Action |
|---|---|
| `E404` / `E401` / `ENEEDAUTH` / `ECONNREFUSED` / `ETIMEDOUT` / `ENOTFOUND` | **FATAL** — fail pipeline |
| `EPUBLISHCONFLICT` / `cannot publish over` / `previously published` | Tolerate (legitimate "only some packages bumped" case) |
| Any other unrecognized failure | **FATAL** (fail closed) |
## Why this matters
This pattern was hiding the exact class of bug I was investigating for the last several hours. Without this fix the next publish-drift will hide itself the same way.
## Test plan
- [x] `pnpm format:check` passes
- [x] YAML parses (`python3 -c 'import yaml; yaml.safe_load(...)'`)
- [ ] CI publish step runs normally on merge (no regression) — current main already has a healthy publish history so the happy path should succeed
- [ ] Future broken publishes will now fail the pipeline instead of silently reporting green
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
The
publish-npmstep 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 — pipelines #681 and #684 reported green while every single@mosaicstack/*publish fell on the floor, blocking users from installing the gateway until the registry issue was independently resolved in #394.Change
Replace the blanket swallow with a targeted rule:
E404/E401/ENEEDAUTH/ECONNREFUSED/ETIMEDOUT/ENOTFOUNDEPUBLISHCONFLICT/cannot publish over/previously publishedWhy this matters
This pattern was hiding the exact class of bug I was investigating for the last several hours. Without this fix the next publish-drift will hide itself the same way.
Test plan
pnpm format:checkpassespython3 -c 'import yaml; yaml.safe_load(...)')437623a76fto43145745d7