New: Performance Monitor tab — tracks per-plugin load time, memory delta, and DB query count during page load; color-coded Fast / Slow / Heavy badges; Refresh Data button.
New: Cron Monitor tab — lists all scheduled WP-Cron events with next run time and overdue detection; “Run Now” button per event; overdue count summary badge at top.
New: AJAX / REST Monitor tab — logs slow AJAX and REST API calls (>500 ms) to a dedicated DB table; filter bar for All / AJAX / REST / Slow views.
Security: cron “Run Now” AJAX handler now validates the hook against the live WP-Cron schedule before execution.
Security: AJAX monitor REST timing now reads from $_SERVER directly (was using non-standard $GLOBALS[‘_SERVER’]).
Security: AJAX log get_entries() now selects only required columns instead of SELECT *.
DB: new {prefix}cd_ajax_log table (schema version 3).
2.5.1
Fixed: uninstall routine now correctly deletes tahcd_prev_version_* options (was using the stale pcd_prev_version_ prefix, leaving orphaned rows in wp_options).
Fixed: Safe Mode plugin list no longer shows Conflict Detective itself (self-exclusion filter used the old slug conflict-detective/conflict-detective.php).
Docs: readme.txt changelog updated with entries for v2.2.0 through v2.5.0.
2.5.0
All plugin-specific prefixes standardised to tahcd_ / TAHCD_ to satisfy WordPress.org uniqueness requirements (constants, AJAX actions, nonce, user meta, cookie, option keys, script handle, JS data object).
2.4.0
Plugin renamed to Tahhan Conflict Detective (slug: tahhan-conflict-detective) for WordPress.org compliance. Namespace changed to TahhanConflictDetective. Text domain changed to tahhan-conflict-detective.
Debug log clear handler now uses WP_Filesystem::put_contents() instead of file_put_contents().
2.3.1
Fixed critical infinite recursion crash: maybe_filter_active_plugins() called get_option(‘active_plugins’) which re-triggered the same filter, causing a stack overflow. Fixed by reading directly from $wpdb.
2.3.0
CI action SHA pinning for security hardening. Code cleanup in class-dashboard.php and class-error-log.php.
2.2.0
Safe Mode tab fully functional: Start/Stop button now triggers AJAX and reloads on success.
Architecture fix: Safe_Mode::init() and Database::maybe_upgrade() moved to file-load time.
2.1.4
Fixed critical bug: Safe_Mode::init() and Database::maybe_upgrade() were registered inside Plugin::init() on plugins_loaded priority 5, meaning they were never called (priority 1 and 0 already fired). Both are now wired up directly at file load time, outside the Plugin class.
Safe Mode tab fully redesigned: inactive state shows a card with instructions and a Start button; active state shows an amber banner with plugin count and a Stop button above the plugin toggle list.
JavaScript Safe Mode toggle now uses delegated event binding ($(document).on) so it works regardless of DOM load order, and reloads the page on success to reflect the new state.
Added safeModeLoading and safeModeStop localised strings for button feedback during AJAX calls.
Added CSS for .pcd-safe-mode-banner, .pcd-btn-stop, .pcd-safe-mode-steps, and .pcd-safe-mode-count.