=== Witen Blocker Changelog ===

= 0.6.47 =
* Block page-template traversal attempts (CVE-2026-87902) before template selection, including encoded values and POST parameters.
* Reject these requests locally without depending on Collector DNS or installing an IP ban.
* Report the detection and denied outcome without sending query parameters or form contents.
* Rewrite the directory readme around protection, setup, and everyday use.

= 0.6.46 =
* Clarify setup instructions, service disclosures, and the plugin directory description.

= 0.6.45 =
* Retry reporting in the background with persistent backoff and visible failure details.
* Keep rejected records for diagnosis without stalling valid reports or falling back from Warden to HTTPS.
* Keep login reporting off the request path and avoid redundant Apache rule checks.

= 0.6.44 =
* Normalize legacy WordPress source labels for new and queued Warden reports without changing event IDs.

= 0.6.43 =
* Authenticate local Warden callers with private installation credentials.

= 0.6.42 =
* Remove cross-sensor overlap and pivot reports from the dashboard.

= 0.6.41 =
* Distinguish denied requests from observations and manual policy changes.
* Correct request receipt duration and SDK cache compatibility.

= 0.6.40 =
* Store bundled bot identities in readable JSON with their source and license.
* Require explicit socket configuration before sharing events with local Warden.
* Clarify socket-mode consent and narrow admin request-check annotations.
* Reject malformed enrollment responses without consuming the setup token.

= 0.6.39 =
* Use WordPress APIs for plugin paths, upload scans, and Apache upload-protection rules.
* Reject malformed settings before saving and validate client IPs before applying proxy trust.
* Keep SDK response caches in private per-site options and use temporary files for catalog validation and scan reports.
* Prevent integrity file lookups from following symlinks or leaving the configured content directory.
* Distribute the unchanged public catalog verification key as a text file and clarify crawler hostname metadata.

= 0.6.38 =
* Exclude loopback and unspecified addresses from all request blocking, login bans, and security-event recording.

= 0.6.37 =
* Reject malformed backup restore content and identifiers before modifying files.
* Restrict shared-file backup requests to the main site and honor backup opt-out.
* Allow opted-in background restores without weakening administrator permissions.
* Format nine bundled PHP SDK classes without changing their behavior.

= 0.6.36 =
* Require enrollment, administrator permission, and a nonce before sending a manual IP lookup to the collector.
* Load bundled admin and comment assets through WordPress enqueue APIs.
* Scope bulk selection to its form and handle bot categories as literal values.
* Reject malformed background credentials and stop work if token consumption fails.
* Separate hosted backup entitlement from threat-feed selection and clarify service disclosures.

= 0.6.35 =
* Initialize each site after upgrades and network activation, and clean up background schedules on deactivation.

= 0.6.34 =
* Include the complete GPLv2-or-later license for the plugin and shared PHP library.

= 0.6.33 =
* Fix two-factor recovery-code entry, prevent recovery-code reuse during concurrent logins, and reject enabled two-factor login when the stored secret is unavailable.
* Keep Cloudflare range lookups off visitor requests and defer background service requests until enrollment.
* Preserve files outside the plugin cache during uninstall and remove per-site state across multisite networks.
* Clarify installation, consent, privacy disclosures, and authenticator setup.

= 0.6.32 =
* Describe shared IP observations, local event recording, configured connections, scan results, and hardening coverage without implying verified protection or delivery.
* Clarify blocklist and comment-spam counters, login URL behavior, server-signature scope, and the outage, bot-policy, and data-sharing FAQs.

= 0.6.31 =
* Clarify standalone connection setup and remove internal credential-exchange language from customer notices.

= 0.6.30 =
* Refresh blocklists and network intelligence correctly through local Warden socket connections.
* Keep development files and build metadata out of the installable package.

= 0.6.29 =
* Persist the recovered event total immediately when upgrading from an older release.

= 0.6.28 =
* Preserve a useful event count when upgrading sites that already have recent event history.

= 0.6.27 =
* Keep the Events Reported total across requests and restarts.
* Avoid false delayed-maintenance warnings on low-traffic WP-Cron sites.
* Clear recovered maintenance warnings after a successful background run.

= 0.6.26 =
* Create the bot catalog cache directory on fresh WordPress installations.
* Document every runtime external service and satisfy WordPress.org Plugin Check requirements.

= 0.6.25 =
* Delegate transport, credential, cache, and decision-receipt behavior to the shared Witen PHP SDK.
* Use per-sensor credentials consistently in direct Collector and local Warden runtime modes.

= 0.6.24 =
* Reconcile clean WordPress plugin and theme updates into the file-integrity baseline without accepting unrelated filesystem drift.

= 0.6.23 =
* Classify bundled bot identities into search, AI/LLM, SEO, social-preview, and monitoring policy groups instead of Other Crawlers.

= 0.6.22 =
* Restore the bundled verified-bot snapshot used when Warden socket mode intentionally avoids direct Collector HTTP requests.

= 0.6.21 =
* Keep all WordPress-layer policy controls authoritative in the WordPress dashboard when using Warden socket transport.
* Label socket transport explicitly instead of describing it as a local connection mode.

= 0.6.20 =
* Recognize observed Docker, Python, IDE, development, and WordPress credential-file probes.
* Preserve conservative handling for ambiguous config and documentation paths.

= 0.6.19 =
* Initial WordPress.org submission.
