1.4.1: code-review + regression-test correctness fixes Five separate findings from a 1.4.0 code-review pass + a 1.4.0 field-test pass on portal-dev-litespeed; folded into one tag rather than 1.4.1 + 1.4.2 back to back. CRITICAL bugs that 1.4.0 shipped with: 1. Settings form re-corrupted sampling_overrides on every save (bug present 1.1.0 - 1.4.0). The outliers and sampling_advanced fieldsets defined LCP/INP/CLS/FCP/TTFB child fields with #tree=>FALSE on the parent containers, so the HTML input names collided and #config_target wrote outlier-threshold values (30000-scale) into sampling_overrides. The next save then failed validation, locking operators out of further UI changes. Fix: #tree=>TRUE on both fieldsets. 2. 1.3.0 database collector was dead code in production. DatabaseInstrumentor's onRequest listener at REQUEST priority 256 ran before DatabaseCollector at 255 set enabled=true from config, so setLogger() was never called. Counters always 0, context_data.database absent on every beacon. Fix: drop the priority-256 listener entirely; collector at 256 owns reset + setLogger + threshold. One ordering, no race. 3. OPcache + APCu probes returned CLI-worker stats under drush cron (hit_rate: 0 with cached_scripts > 1000). PHP OPcache and APCu are per-SAPI; CLI cron sees its own instance. Fix: PHP_SAPI === 'cli' check in both probes, skip the row, log an actionable warning each cron run pointing operators to HTTP-context cron (curl /cron/<key>). Hardening that wasn't urgent but pays off accumulated debt: 4. Textarea fields (upstream_id_headers, probe_targets) had no validation. Bad lines silently dropped at runtime with no form-save feedback. Fix: validateForm rejects malformed header names and non-http(s) URLs per-line via setErrorByName; both fields capped at 32 entries. 5. isCacheableForSharedCaches duplicated verbatim across CwvRequestIdSubscriber and UpstreamIdSubscriber. Both are SA-relevant defences; copies would have diverged silently on next maintenance. Extracted into Drupal\cwv\Http\ CacheControlInspector::isCacheableForSharedCaches. Operator-experience touch-ups: 6. cwv watchdog channel is now seeded by hook_install, so operators can filter dblog by Type=cwv from the first visit rather than having to wait for an error to land. 7. README runtime-probes section explains the per-SAPI OPcache/APCu state issue and the system-crontab + curl recipe. Form descriptions on the OPcache, APCu, and edge-cache probe fields call out the requirement at configuration time. Library version bump 1.4.0 -> 1.4.1 (cache-busts the JS asset). No schema changes, no config-key changes, no update hook.