diff --git a/.planning/phases/17-blog-companions/deferred-items.md b/.planning/phases/17-blog-companions/deferred-items.md index f0708d6..f457371 100644 --- a/.planning/phases/17-blog-companions/deferred-items.md +++ b/.planning/phases/17-blog-companions/deferred-items.md @@ -21,3 +21,8 @@ Out-of-scope findings logged during execution. None blocks the plan that found i 1. **Hook validation messages reach the admin as phrase keys.** A `cabana.ValidationError` returned from a form hook (`FormBeforeCreate`, `FormAfterCreate`, …) is written as-is by `writeCRUDError` (`modules/cabana/crud.go`), while `cabana.ForbiddenError` messages and details are translated in the request locale. The admin SPA prints field errors raw (`FormField.vue` renders `{{ text }}`; `FormErrorBanner.vue` lists orphans raw), so an editor sees `golem15.menu::lang.errors.url_scheme` instead of the sentence. Affects the FAQ `errors.locale_required` and the menu `errors.url_scheme`, `errors.target`, `errors.type_unknown`, `errors.parent_cycle`, `errors.menu_required` refusals. Follow-up in the framework: translate `ValidationError.Details` phrase keys in the request locale like `ForbiddenError` (server side), so every client gets text. 2. **Public API misses log once per request.** The menu API logs each left-out entry (unregistered type, unresolvable reference) at warn level on every request; with a stale entry in a busy menu that repeats per request (bounded by the 120 per minute throttle per client). Acceptable for now; a later change could log once per entry and boot. + +## From 17-05 (site integration) + +1. **Every public Go response sets the translate locale cookie.** On UAT, `/sitemap.xml`, `/_journal/api/v1/...` and the new `/_menu/api/v1/...` all answer `Set-Cookie: golem15.translate.locale=en; Path=/; Max-Age=31536000; HttpOnly` (Secure behind HTTPS), although the site's only enabled locale is `pl`. Pre-existing translate middleware behaviour (the Journal API had it before Phase 17); the Nuxt layers' SSR fetches ignore it, but browsers that call `/_menu/` or `/_faq/` and crawlers reading the sitemap receive it. Follow-up in sm-translate-plugin: set the cookie only when a request chose a locale, and never on anonymous read APIs or the sitemap. +2. **Sitemap `lastmod` of imported Journal rows is the import time.** The Go sitemap's post and category `lastmod` come from `updated_at`, which the Phase 16 import set to 2026-10-09; the PHP sitemap shows the PHP edit times. Corrects itself as posts are edited; a one-off copy of the PHP `updated_at` values would align it before the production cutover.