Commit Graph

1492 Commits

Author SHA1 Message Date
Jakub Zych
646e51356e docs(18.1-09): roadmap progress 9/9 2026-10-16 13:55:59 +02:00
Jakub Zych
d9ccc8275e docs(18.1-09): release record (framework v0.2.1, pgsub v0.1.0, pgstripe v0.1.0, layer v0.2.1) 2026-10-16 13:55:53 +02:00
Jakub Zych
f64ae79e1d docs(18.1-09): complete gap-closure tests, phase gate and release plan v0.2.1 2026-10-16 13:53:57 +02:00
Jakub Zych
03b8cc2770 docs(18.1-09): VALIDATION rows for plans 07 to 09 and the deferred review findings 2026-10-16 13:44:55 +02:00
Jakub Zych
48e264285a fix(scripts): allow the admin theme and locale cache in check-phase10 hygiene (T-261016-0fm-08)
usePreferences.ts (quick 261016-0fm) caches the theme and locale codes in
localStorage, an accepted threat of that task; the hygiene allow-list was
not updated, so check-phase18.1.sh docs failed. Tokens stay forbidden.
2026-10-16 13:40:30 +02:00
Jakub Zych
3cb22523e2 test(18.1-09): phase gate requires the seven layer restore and copy specs; layers minimum 43 2026-10-16 13:37:22 +02:00
Jakub Zych
b6e6736db4 test(18.1-09): phase gate requires TestDetachedBulkAction and the pgstripe gateway hardening tests (postgres stage) 2026-10-16 13:34:08 +02:00
Jakub Zych
fa91e2a7ca test(18.1-09): TestDetachedBulkAction covers detached admin bulk actions (Postgres)
- a detached Run sees no transaction and holds no row lock (FOR UPDATE
  NOWAIT from another connection succeeds), with the empty, absent and
  partial-selection rules, a ValidationError as 422 and earlier writes kept
- the same action without Detached still holds the transaction and locks
- test-only actions on the roster fixture through its wrap hook; README
  Testing names the test
2026-10-16 13:33:34 +02:00
Jakub Zych
5a446d68d7 test(18.1-09): phase gate requires the pgsub gap-closure tests (plugins and postgres stages) 2026-10-16 13:17:31 +02:00
Jakub Zych
0fc909d030 test(18.1-09): phase gate requires TestEventOrdering and TestFreshStateSmoke (postgres stage) 2026-10-16 12:59:30 +02:00
Jakub Zych
f82ac0f2f5 docs(18.1-08): roadmap progress 8/9 2026-10-16 12:54:22 +02:00
Jakub Zych
7b70e27e3c docs(18.1-08): complete checkout, admin sync and layer gap closure plan 2026-10-16 12:53:44 +02:00
Jakub Zych
fc2a397d9b feat(18.1-08): detached admin bulk actions run outside the framework transaction
- pact.AdminBulkAction.Detached (json:"-"): opt-in; records loaded through the list scope without row locks, no write transaction in the context
- cabana BulkAction: detached branch with the same empty, partial-selection, failure and message rules; lockScoped is loadScoped with lock, the locked path unchanged
- docs: admin-controllers bulk route list, pact and cabana READMEs
2026-10-16 12:47:46 +02:00
Jakub Zych
f217c73ef8 docs(18.1-08): idempotency keys and the strict checkout price in COVERAGE 2026-10-16 12:44:33 +02:00
Jakub Zych
f925d6078d docs(18.1-07): roadmap progress 7/9 2026-10-16 12:27:39 +02:00
Jakub Zych
1798b14e99 docs(18.1-07): complete webhook and sync state gap closure plan 2026-10-16 12:25:59 +02:00
Jakub Zych
3cc198ef9f docs(18.1-07): D-21 ordering amendment and the fresh-state retrieval in COVERAGE
- 18.1-CONTEXT.md Amendments: D-21 amendment (2026-10-14, gap closure
  18.1-07)
- COVERAGE.md subscriptions.retrieve: the webhook job's fresh-state
  retrieval and the plan-refreshing sync
2026-10-16 12:23:35 +02:00
Jakub Zych
0bd3973b39 docs(quick-261016-0fm): admin theme/language preferences and save-bar fix for v0.2.1 2026-10-16 11:58:09 +02:00
Jakub Zych
66fd4ae4b7 build(quick-261016-0fm): rebuild embedded admin dist for v0.2.1 2026-10-16 11:49:47 +02:00
Jakub Zych
f0ab26b93f test(quick-261016-0fm): theme switch, language switcher and footer offset
- theme: light and dark ignore prefers-color-scheme, choices and guard
- i18n: ?locale= only with a preference, availableLocales from meta
- usePreferences: cache validation, cycle order and PUT bodies, revert
  with a danger toast, profile apply, setLocale save, cache and reload
- rail theme button, user menu language group, --shell-offset and the
  form save bar offset; fixture strings and resetState theme reset
2026-10-16 11:48:39 +02:00
Jakub Zych
119f1f8d54 test(quick-261016-0fm): admin preference coverage
- Translator.Locales: sorted, prefix-scoped, nil-safe
- preferencesOf, validPreferences, refused keys, metadata writes and
  principalFrom's PreferredLocale (internal, Docker-free)
- Docker: refused keys and values leave the row alone, owner-only saves,
  personal tokens get interactive_only and keep the request locale, the
  cookie CSRF header, non-object metadata stays byte-identical
2026-10-16 11:44:32 +02:00
Jakub Zych
85e52d9336 fix(quick-261016-0fm): bottom save bars no longer cover the sidebar
AppShell exposes --shell-offset (the rail, plus the section panel when it
shows); the form, settings, My account and preview save bars start there,
so the rail's Settings item stays visible and clickable.
2026-10-16 11:41:19 +02:00
Jakub Zych
5244a37b00 feat(quick-261016-0fm): language switcher in the user menu
- loadStrings sends the chosen language as ?locale= and keeps
  meta.locales as availableLocales
- the user menu lists the admin locales, each named in its own language;
  choosing one saves it through PUT /account/preferences, caches it and
  reloads the page
- boot loads the strings in the cached language; me() reloads them when
  the stored preference differs
2026-10-16 11:35:08 +02:00
Jakub Zych
f67e8915b8 feat(quick-261016-0fm): admin language follows the stored preference
- principalFrom sets PreferredLocale from metadata admin_locale; personal
  API token principals clear it, so token clients keep the request locale
- the guarded admin group runs locale.from-principal after the backend
  guard, overriding the LocaleResolver or Accept-Language locale
- GET /lang honours a supported ?locale= and reports meta.locales
  (cabana.LangEnvelope, cabana.LangMeta)
- Docker test for the override, refusals and /lang; docs and OpenAPI
2026-10-16 10:58:29 +02:00
Jakub Zych
3d2f9d0cf6 fix(quick-261016-0fm): full key literals for the rail theme label
The phrasebook SPA-key check scans admin/src for backend::lang literals;
the template-string key backend::lang.nav.theme_ did not resolve and
failed go test -short.
2026-10-16 10:21:50 +02:00
Jakub Zych
21b0d39de0 feat(quick-261016-0fm): manual theme switch on the rail
- the rail's top button cycles system, light and dark and names the
  current choice; light and dark ignore prefers-color-scheme
- usePreferences applies the cached theme before the first await of boot,
  saves the choice through PUT /account/preferences and reverts with a
  toast when the save fails; me() applies the stored preference
2026-10-16 09:54:02 +02:00
Jakub Zych
047858ae84 feat(quick-261016-0fm): per-admin theme and locale preferences
- GET and PUT /account/preferences (own row only, interactive sessions,
  CSRF header on cookie writes) store admin_theme and admin_locale in
  backend_users.metadata, keeping every other key
- GET /auth/me and the My account answers carry preferences
- phrasebook.Translator.Locales lists the locales defining a prefix
- route tables, conformance cases, OpenAPI document, TS types and docs
2026-10-16 09:26:09 +02:00
Jakub Zych
1a03399357 docs: log fast task summercms.io Alpha 0.2 copy 2026-10-16 00:07:28 +02:00
Jakub Zych
853ea1fa6e docs(quick-261015-w7f): summercms.io deployed on v0.2.0 2026-10-16 00:03:25 +02:00
Jakub Zych
a204d38b49 docs(quick-261015-w7f): plan and summary at the deploy checkpoint 2026-10-15 23:37:11 +02:00
Jakub Zych
f3e8a984b0 docs(quick-261015-w7f): docs since v0.1.14 and the Upgrading to 0.2 notes
- new setup/upgrading.md: version rule, the two 0.2 boot refusals with
  their fixes, behaviour changes, and what 0.2 adds since 0.1
- architecture module table lists all 28 modules
- WinterCMS map: cache and reorder are provided; rows for field types,
  sanitizing, singletons, API tokens, CORS, Turnstile, menu item types
- configuration keys for CORS profiles, api_docs, auth.cookie, turnstile
- index, setup intro and frontend page link the new topics
v0.2.0
2026-10-15 23:24:56 +02:00
Jakub Zych
76d788821a docs: decide to release the 19.3 gap closure as v0.2.0 2026-10-15 23:14:08 +02:00
Jakub Zych
694a565941 test(19.3): persist human verification items as UAT 2026-10-15 23:11:05 +02:00
Jakub Zych
56fe2ae372 docs(19.3): re-verification after gap closure (human checks pending) 2026-10-15 23:10:59 +02:00
Jakub Zych
c5d9a7b6b1 docs(19.3-06): state and roadmap after the gap closure 2026-10-15 23:01:46 +02:00
Jakub Zych
350d0355b2 docs(19.3-06): gap closure summary, release handed off to the phase session 2026-10-15 23:01:09 +02:00
Jakub Zych
0c8109c670 docs(19.3-06): review disposition and validation map after the gap closure 2026-10-15 22:51:13 +02:00
Jakub Zych
b2f4044111 test(19.3-06): gate requires the review-fix tests
- go, docker and layers stages require the plan-06 tests by name
  (CR-01, WR-01..WR-09)
2026-10-15 22:47:45 +02:00
Jakub Zych
8d80580083 test(19.3-06): unit tests for the review fixes
- TestCORSCredentialedOriginRules, TestCORSAnchoredPatternNoSuffixMatch (D-04)
- TestAPIDocsCSPNoHostSource (D-17)
- TestLoadCookieConfigProductionInferredSecure, TestZeroCookieConfigDefaults (D-03)
- TestSiteCachePurgeWaitAndClose, TestSiteCacheBulkCommitCoalesced (D-10)
2026-10-15 22:45:16 +02:00
Jakub Zych
4d4e37932c docs(19.3-06): pair a remote purge URL with the site's allowProxied (WR-03)
- caching.md: an https purge_url on another host goes through the site's
  proxy; set NUXT_SITE_CACHE_ALLOW_PROXIED=true there, the token is then the
  only gate
- cooler README: the purge_url row points at it
2026-10-15 22:42:36 +02:00
Jakub Zych
3bb6d61843 docs(19.3-06): progress record after Task 4 2026-10-15 22:40:30 +02:00
Jakub Zych
db6a7f5c3f fix(19.3-06): queue site-cache purges after commit and coalesce them (WR-01)
- PurgeSiteCacheAfterCommit queues the purge on a per-purger worker after
  commit: one request in flight, saves committed meanwhile collapse into
  one follow-up, so the admin request never waits for the site
- new cooler.SiteCachePurger.Wait drains the queue; Handle.Close waits for
  it at shutdown (timeout plus one second)
- Purge stays the synchronous send; exported names and signatures unchanged
2026-10-15 22:36:24 +02:00
Jakub Zych
50a584c757 fix(19.3-06): site-cache purge never follows redirects (WR-02)
- the purge client's CheckRedirect returns http.ErrUseLastResponse: a 3xx
  is logged as a failed purge with its status and the bearer token never
  reaches the Location
2026-10-15 22:32:32 +02:00
Jakub Zych
d0a580c60c fix(19.3-06): warn at boot when turnstile routes have no secret (WR-08)
- BuildRouter logs one warning with the route count and the production
  flag when routes name turnstile:open or turnstile:closed and the
  verifier has no secret; the secret is never logged
2026-10-15 22:30:57 +02:00
Jakub Zych
caa5b5d8ff fix(19.3-06): refuse protected uploads into a public_url bucket (WR-07)
- attach.Store returns attach.ErrProtectedNeedsPrivateBucket for an
  is_public false upload while storage.uploads.public_url is set, before
  any blob is written
- OpenBucket's public_url line becomes a warning naming the refusal
2026-10-15 22:30:00 +02:00
Jakub Zych
f705343904 fix(19.3-06): api-docs CSP allows only nonce-carrying scripts (WR-06)
- the two pinned jsDelivr scripts carry the per-request nonce next to
  their SRI hash; script-src holds only the nonce, no host source
2026-10-15 22:28:34 +02:00
Jakub Zych
85d8b6a85a fix(19.3-06): zero CookieConfig writes SameSite=Lax and Secure (WR-09)
- withDefaults gives the zero config Secure and every unset SameSite Lax;
  a config with any field set keeps its Secure value
2026-10-15 22:27:31 +02:00
Jakub Zych
4dae8331c5 fix(19.3-06): production refuses an inferred insecure token cookie (WR-05)
- LoadCookieConfig refuses a Secure that resolves to false in production,
  also when inferred from an http or unset app.url, naming
  auth.cookie.secure and app.url
2026-10-15 22:26:43 +02:00
Jakub Zych
e32940d90f fix(19.3-06): credentialed CORS refuses wildcard-host and unanchored origins (WR-04)
- with supports_credentials, a * origin must be the whole leftmost host
  label, patterns must be anchored with ^ and $, and no origin rule may
  match the probe origins outside any configured domain
- globally and per profile; non-credentialed configs load as before
2026-10-15 22:25:43 +02:00
Jakub Zych
072353663e fix(19.3-06): cors:<profile> headers on every response of the route (CR-01)
- Router.wrap applies the route's profile outside recovery, body limit and
  locale, whatever its position in the list or the group nesting
- bufferedResponse.commit merges Vary instead of replacing it
- TestCORSProfileHeadersOnRefusals, TestCORSProfileVaryKeptWithHandlerVary
  required by name in the gate
2026-10-15 22:24:08 +02:00