v0.0.38

30 June 2026

Registry WAL mode and DDL fast path, HTMX redirect fix for boosted requests, fragment shell decoupled from ui addon, and registry admin filters.

Added

  • Registry::distinctValues(string $column) : returns distinct non-empty values for a structural column (e.g. status), used to populate filter selects in the admin registry view.
  • View::shellFile() : resolves the correct full-page shell template for block rendering, checking the view's own extra roots before falling back to site/views/index.lattephlat/views/index.latte. Passes a shell variable into fragment.latte so each addon can wrap block renders in its own shell.
  • Registry admin filters : type, status, and sort dropdowns in the registry admin page; pagination and table split into separate pagination.latte and table.latte HTMX fragments with hx-target retargeting.

Changed

  • App::redirect() now sends HX-Redirect for HTMX partial requests instead of a bare Location: header, so boosted redirects trigger a real browser navigation rather than silently swapping the redirected page's HTML into the HTMX target while the URL bar stays on the original path. Session::requireLogin() updated to route through $app->redirect() so login redirects also get the HTMX header.
  • fragment.latte moved from phlat/addons/ui/views/ to phlat/views/ : the shell-wrapping mechanism no longer depends on the ui addon being present. App::renderFragment() and View::render() both updated to reference fragment.latte directly.
  • AddonMounts::load() fixed to match only exact bare addon refs as mount points (e.g. @admin marks where the admin is mounted; @admin/login is a valid view but not a mount). Moved to run after app.addons:after rather than during addon loading, fixing a timing window where registry() was called before addons had finished registering their pages.
  • Registry now enables WAL journal mode and PRAGMA busy_timeout=5000 on connect. DDL bootstrap skips CREATE TABLE/INDEX IF NOT EXISTS statements when the schema version is current : checks via two lightweight sqlite_master + meta queries instead, reducing per-boot SQL overhead.
  • Registry::checkStale() removed : the periodic filesystem fingerprint drift check (throttled at 5s) is gone. The registry stays current exclusively through lifecycle hooks and explicit rebuild() calls.
  • login/logout views moved from phlat/addons/ui/views/ into phlat/addons/admin/views/ where they were always being served from.