Release v1.24.0
docs(release): cut v1.24.0 changelog, upgrading, and roadmap.
AuthKit 1.20 security kits, ops ingest hardening (106), and SQL error context (107).
Changelog
Added
- AuthKit 1.20.0 with optional kits:
nowo-tech/slide-to-confirm-bundle1.1.0 (registration consent slider, profilegate; clear history in project Settings uses thedangerprofile),nowo-tech/device-intelligence-bundle1.1.1 (collect on AuthKit pages, new-device email, extra device-keyed rate limit on register/reset/magic, Account → Security → Trusted browsers), andnowo-tech/otp-input-bundleon/reset-password/complete(otp_input.enabled, multi-boxOtpType; server OTP checks unchanged). Device ID is not a credential; AuthKit never auto-trusts a device after login. QR approve stays a button (UC-AUTH-22). Cookiedi_obsis inventoried as required account-security. MigrationVersion20260824120000. Phone SMS verification remains ROADMAP Later. - Ops ingest hardening (
106): Redis-backedMessengerQueueHealthdepths forasync_ingest/async/failedon Ops overview and/metrics(beacon_messenger_failed_pending); cached daily/monthly event quota usage; one Envelope flush retry on unique-constraint races; batched retention purge (1000-row batches); sharedPrivateNetworkTargetSSRF helper for Mercure hub + outbound webhooks;app:project:api-key-legacy-secretsdry-run /--applyfor redundant Halite API-key ciphertext; EVENT-STORAGE.md growth stages. - SQL / database error context (
107): issue and event detail show a Query panel (SQLSTATE, vendor code, SQL, bindings) derived fromcontexts.db, extra, query breadcrumbs, or exception text. Stack opens the in-app frame.issue.culpritwidened to 255 (migrationVersion20260826120000on MySQL). AI export includes optionalquery. Sample seed issue #1 is a QueryException-like event. Companion BeaconBundle 1.8.0 attachescontexts.dbon PDO/DBAL exceptions. - Setup: paste
SITE_SETUP_TOKENthrough a FormKit GET gate on the setup wizard.
Changed
- Guest AuthKit layout loads slide-to-confirm, device-intelligence, and OTP-input assets; device collect boot uses the CSP nonce (vendor inline script would be blocked).
- Composer pins (
nowo-tech/*patch + FormKit minor): audit-kit 1.1.15, auth-kit 1.20.0, beacon-bundle 1.8.0, breadcrumb-kit 2.1.7, cookie-consent 1.9.6, dashboard-menu 2.1.10, device-intelligence 1.1.1, doctrine-encrypt 2.3.12, form-kit 2.5.2, http-log 1.1.5, login-throttle 3.1.4, maintenance-mode 1.5.7, migrations-kit 2.0.21, password-policy 1.4.3, password-strength 2.2.3, password-toggle 2.1.4, phone-input 1.3.3, pwa 1.3.3, routing-kit 1.4.4, select-all-choice 1.5.4, site-backup 1.13.8, tag-input 1.1.3, ui-kit 1.8.3, user-kit 1.1.9. Symfony 8.1.5 where that patch exists (console/form/framework/http-client/mailer/messenger/translation/uid/validator/yaml + browser-kit/css-selector/web-profiler). Dev: php-cs-fixer 3.95.22, composer-update-helper 2.0.36, hot-reload 1.4.2, phpstan-frankenphp 1.1.3, twig-inspector 1.1.4, phpstan 2.2.9. - Dashboard Menu 2.1.10: kit tags
SearchQueryTypeasform.type(withFormOptionsMerger); remove hostconfig/services/dashboard_menu.yamloverride that was required on 2.1.9. - FormKit 2.5.2: drop host
nowo_form_kit.type_map.search(built-in since 2.4.0); project clear history usesaddSlideToConfirmField()(mapped: falseis the type default). - Device collect while gated: MaintenanceMode excludes
/_device; PWAdeny_cache_patternsincludes/_device(cache_versionv6). SiteBackup documentssetup.short_circuit_when_done: true(1.13.7+ default — Beacon detectors must not re-open the wizard after done). - Member alert preference/event and push subscription timestamps use AuditKit
TimestampableTrait(not host-copied trait logic). - PHPStan / QA: empty baseline; no
ignoreErrorsinphpstan.neon.dist; injectable Clock / DNS / Halite FS seams for FrankenPHP rules; Rector semantic-only (CS-Fixer owns formatting); PHPUnit suite PHPStan-clean; includable coverage 100%. - Cookie consent embedded without a kernel sub-request (faster public pages).
- Prod Compose: Messenger Redis DSNs no longer use path
/messages(path is the stream name, not a DB index).
Fixed
- Mercure hub URL guard aligned with outbound webhook SSRF policy (
PrivateNetworkTarget; metadata targets always blocked). - Ops overview queue depth sourced from
App\Ops\Messenger\MessengerQueueHealth(Redis transports, including failed). - E2E: slide-to-confirm confirmed via pointer drag and keyboard in CI; flaky 403 navigation retries.
Notes for integrators
- Doctrine migrations:
Version20260824120000(device intelligence tables) andVersion20260826120000(issue.culprit→ VARCHAR(255) on MySQL). - After pull:
composer install,php bin/console doctrine:migrations:migrate -n,php bin/console assets:install(ormake ready),make seed-platform(cookie inventory fordi_obs), rebuild assets if you override kit templates (make vite-build). - Dogfood / client apps: pin
nowo-tech/beacon-bundle≥ 1.8.0 for structuredcontexts.dbon database exceptions. - PWA operators: deploy assets/SW so
cache_versionv6 picks up/_devicedeny-cache. - See UPGRADING.md Upgrading from 1.23.3 to 1.24.0.