v0.14.3
Enhancement
Breaking Change
v0.14.3 - Unified API errors, database pagination and spam-gated form delivery
REST validation errors have one shape, image fields return asset ids, {% paginate %} pages in the database, and form notifications wait for the spam verdict.
Breaking Changes
This release contains breaking changes. Please review the migration guide below before upgrading.
Changes
- REST API: every
422now returnsdetailsas an array of{path, message}, on creates and updates alike (previously a raw errors hash on updates and plain strings on creates).pathis dotted or indexed for nested values, e.g.fields[1].type. - Entry tools (
entries_get,entries_list,entries_save,entries_query): image fields now return the asset's prefixed id (asst_…), whichentries_saveaccepts back, instead of an internal attachment object.nullwhen unset. - Liquid
{% paginate collection.entries by N %}now runs one count and one offset/limit query instead of loading every published entry before slicing. Other uses ofcollection.entriesare unchanged. - Forms with spam checking enabled: notification emails and CRM ingestion are held until the spam verdict. A rule hit is marked spam at once and delivers nothing (the visitor still sees the thank-you page); undecided submissions deliver after the AI check unless it says spam. Forms without spam checking deliver immediately, as before.
- Navigation items: an item saved without a priority is placed last among its own siblings, and moving an item to a new parent places it last there. Previously the priority was a tree-wide count, so siblings could tie.
- Sessions: signing out of one pooled session lands on the login page listing the others instead of switching automatically; signing in again as an already-pooled user replaces the earlier session; the session in use is never evicted at the cap.
- Constituent portal: verification codes are delivered by identifier type (phone receives an SMS code, email receives mail); a magic link is never sent to a phone; delivery limits are exactly 5 per destination. SMS body is now "Your Airogel code is …".
- Chat assistant tool errors name what failed ("Collection not found: blog", "Blueprint has been modified since last read") instead of "Validation failed".
- Email events: SES Open and Click events now record their own timestamp, IP, user agent and link.
Fixes
- Page 404s are an explicit resolution with a reason (
root_routing,unpublished,no_template); a real render error is no longer masked as a 404. - Index-page SEO meta: canonical, image and feed-discovery URLs are HTML-escaped.
- Command palette no longer shows results from a superseded search.
- Admin: counter-cache fields are read-only, so edits cannot drift the counts.
Migration Guide
- REST 422
details: parse an array of{path, message}objects. Code that read a hash keyed by attribute, or a list of strings, must be updated. - Image fields: read the field value as an asset id string (
asst_…) and resolve it withassets_getif you need the URL or metadata; the previous{name, record}object is gone. - Form integrations: with spam checking on, notifications and CRM records for a submission arrive after classification (typically seconds), not at submit time.