Added:
- Built-in fx.fail helpers (notFound, forbidden, conflict, foreignKey, unauthorized, rateLimited, serviceUnavailable, database, internal) without requiring an errors bag
- okengine/client/explain utilities (match, matchError, explain) for UI kind error classification and { data, error } pattern matching
- Auto-mapping of SQL, Redis, and storage errors to typed fail values
- Boot fatal diagnostic formatting with actionable causes and remediation hints
- Discord community link in documentation site navigation
Changed:
- Built-in HTTP statuses aligned to standards (404 NotFound, 409 Conflict/ForeignKey, 429 AuthRateLimited, 503 ServiceUnavailable)
- SQL unique constraint violations return 409 Conflict instead of 500 InternalError
- InternalError masks internal exception messages and uses catalog description
- Upgraded default RustFS Compose image pin to stable 1.0.0
- Updated create-oke starters and Keel example to use fx.fail helpers
- Refreshed export gzip regression baselines in budgets.json and BUDGETS.md
Fixed:
- Untriggered RPC flows with unhandled throws serialize to 500 InternalError instead of empty 204
- fx.call and app.call rethrow unhandled exceptions across flow boundaries
- TransportError instances consistently populate error.message matching data.message
- SSE handshake error parsing prioritizes top-level error messages
- ContractErrors preserves built-in error codes when errors bag is omitted
- Type match success data as unwrapped payload instead of nullable
BREAKING CHANGE: Built-in error HTTP status codes changed (NotFound 404, Conflict/ForeignKey 409, AuthRateLimited 429, ServiceUnavailable 503); SQL unique violations return 409 Conflict; InternalError masks thrown error messages.
Co-authored-by: Cursor <cursoragent@cursor.com>