| Corner case | Outcome |
|---|---|
Publishing an id + version that already exists | 409 Conflict — rejected; versions are immutable |
| A declared dependency can’t be resolved | Rejected at publish, before any write |
| A dependency graph contains a cycle | Rejected at graph validation (strongly-connected-component detection) |
| Package payload fails digest verification | Rejected as CORRUPT_PAYLOAD |
| Signature doesn’t match the trust policy | Rejected as INVALID_SIGNATURE |
| A skill’s runtime doesn’t match the caller’s constraint | Silently excluded from search results — not an error |
| Caller lacks the scope/ownership a write requires | 403 Unauthorized |
| Anonymous or unauthorized caller requests a private skill | 404 SKILL_NOT_FOUND — identical to a nonexistent id; existence is never revealed |
| Guardrails service is unreachable during validate/publish | 503 GUARDRAILS_SERVICE_UNAVAILABLE — only the routes that need it fail; search/auth/sharing stay up |
| A publish trips a mandatory (Level 1) guardrail rule | Publish blocked with GUARDRAIL_VIOLATION, raised before any archive/store write |
| A publish trips a WARN-level rule only | Publish proceeds; warnings are recorded on the audit event and surfaced to the caller (CLI stdout, or the validate response’s warnings field) |
| A custom rule’s regex uses lookaround or a backreference | 400 from /validate-rule or /scan — RE2 can’t compile it; never silently falls back to backtracking re |
| A custom rule tries to introduce a new executor kind | Rejected — only existing catalog kinds are runnable; a custom rule can never execute arbitrary code |
| A share grant is revoked mid-session | Takes effect on the very next request — no index rebuild or cache to invalidate, since grants are checked per-request |
| Registry instance crashes | Restarts and rebuilds its index from storage metadata |
| An index-updating event is delayed or dropped | Periodic reconciliation scan repairs the drift |
| Storage layer returns a transient error | Retried with exponential backoff and jitter |
| Dev login attempted without the dev-login password configured | Rejected outright by the backend — the path doesn’t exist unless explicitly configured |
Reference
Corner cases
Every deterministic edge case the registry is designed to hit — and exactly what happens