Horizontal tabs navigation replaces the grouped sidebar so the main content area uses full width. Tabs are grouped with labels (Overview, Optimize, Safety, Operations, Configuration) and use design tokens for consistent styling.
Active tab has a top border that visually merges with the content area; hover/focus states use primary color with keyboard-visible focus ring.
Mobile select fallback remains unchanged for narrow viewports (≤960px). All ?tab= URLs continue to work unchanged.
2.4.4
GitHub Actions CI: a new .github/workflows/ci.yml lints every PHP file under PHP 7.4 / 8.0 / 8.1 / 8.2 / 8.3 and runs the PHPUnit suite on every push and pull request. Tagged pushes (v*) also stage a release zip artifact.
Expanded PHPUnit suite: three new test files covering ETA formatting (5 cases), the grouped sidebar navigation contract (legacy ?tab= URLs and render_tab_* method coverage), and additional RVSDADO_Actions::validate_job_params() branches (uid sanitizer, mode default, unknown type, runner-vs-admin context, table list filtering).
RVSDADO_Admin_Helpers_Trait::format_eta() promoted to public so external callers (CLI, REST, tests) can reuse the same formatter used in the active jobs table.
2.4.3
Orphan table analyzer is dramatically faster on busy sites: the plugin owner registry is now cached in-memory for the duration of the request, and the per-plugin code scan (up to 80 PHP files per plugin) is cached as a transient keyed by the plugin’s directory mtime so it self-invalidates on plugin updates. First detection pass is unchanged; subsequent passes within 12 hours are near-instant.
2.4.2
Grouped sidebar navigation replaces the flat horizontal tab strip: 5 logical groups (Overview, Optimize, Safety, Operations, Configuration). All ?tab= URLs from previous versions continue to work unchanged.
Sticky sidebar that scrolls independently, plus a breadcrumb trail at the top of every section.
Narrow viewports (≤960px) get a responsive <select> group fallback instead of the sidebar.
aria-current=”page”, aria-label, and focus-visible outlines for full keyboard / screen-reader navigation.
2.4.1
Added a design-token CSS system (colors, spacing, radius, shadows, typography) as the single source of truth for all admin styling.
Added a Dark mode for the plugin admin pages with Auto (follow OS), Light, and Dark options under Settings → Color theme. The theme attribute is applied before paint to avoid flash of unstyled content.
Refined component theming for cards, panels, intro boxes, wizard, help boxes, and the v2 accessible modal under dark mode.
Sticky table headers on all plugin .widefat tables -column titles stay visible while scrolling large datasets.
Sortable columns with click or keyboard (Enter/Space) toggling asc/desc; numeric / date / text is auto-detected; tables driven by background polling opt out automatically.
Accessible confirm/prompt modal v2 with focus trap, Escape-to-close, and tip-to-confirm validation (RESTORE / DROP / QUARANTINE / DELETE).
Adaptive job polling: respects Page Visibility, throttles when idle, kicks back to fast cadence when work appears.
New running-jobs indicator in the WordPress admin bar (visible on every wp-admin page, capability-gated).
Pause / Resume jobs from the active jobs table (new pause() / resume() runner methods and AJAX endpoints).
ETA shown next to each active job’s processed/total count, derived from runner throughput.
2.3.2
Renamed internal prefixes to rvsdado_ / RVSDADO_ across classes, constants, options, transients, hooks, AJAX actions, and asset handles for stronger isolation.
Stored data and transient keys now use the unique rvsdado_ prefix in explicit string literals.
Migrated destructive DDL paths (DROP TABLE / RENAME TABLE) and other identifier-bound SQL to $wpdb->prepare() with the %i placeholder.
Added a stricter whitelist that requires tables to be currently detected as orphans (or sourced from the quarantine registry) before any destructive DDL runs.
Replaced the dynamic IN ({$ids_csv}) SQL clause with prepared %d placeholders.
Removed the residual ini_set(‘display_errors’, ‘0’) call from the AJAX core.
Raised the minimum WordPress requirement to 6.2 to support the %i identifier placeholder.
2.3.1
Addressed WordPress.org pre-review feedback for transient key naming, CLI report output storage, and AJAX output buffering.
Restricted WP-CLI report file output to the plugin’s uploads directory.
2.3.0
Added the Guided Safe Cleanup Wizard with recommended selections, CARE confirmations, before/after snapshots, live runner progress, and cleanup result deltas.
Added scheduled health digest emails with daily, weekly, or monthly frequency.
Added lightweight QA scaffolding, a manual QA checklist, and a release build helper that excludes QA/dev-only artifacts.
Fixed Action Scheduler drain registration timing and avoided early translation loading for the custom cron schedule label.
2.2.0
Updated plugin metadata and release references for version 2.2.0.
Addressed Plugin Check findings for translator comments and prepared SQL scanner warnings in database cleanup, runner, scheduler, and backup checks.
2.1.0
Autoload tab: full pagination, search, filter (autoloaded/not/large/review/watch), sort, and segmentation – no longer limited to 50 options.
Backup manifests: every new backup writes a manifest.json with method, DB name, WP prefix, tables, files, gzip flag, and version.
Full database restore: restore plugin-created backups from UI or CLI (wp rvs-database-doctor backup restore <uid> –confirm=RESTORE). Automatic pre-restore backup, streaming SQL import, blocked dangerous statements, DB/prefix compatibility checks.
Backup list now shows method, table count, and restore eligibility.
WP-CLI: added backup validate <uid> and backup restore <uid> –confirm=RESTORE; autoload now supports –per-page, –page, –filter, –search, –orderby, –order.
2.0.0
Time-based job runner with dynamic batch size (default 1000).