id ) ) { return $classes; } $theme = self::current_interface_theme(); return $classes . ' edcr-theme-' . sanitize_html_class( str_replace( '_', '-', $theme ) ); } /** A personal visual preference; legacy global theme remains a fallback for existing sites. */ public static function current_interface_theme() { $allowed = array( 'commander_gold', 'sensor_tactical', 'tactical_light' ); $stored = get_user_meta( get_current_user_id(), 'edrad_interface_theme', true ); if ( is_string( $stored ) && in_array( $stored, $allowed, true ) ) { return $stored; } $legacy = EDRAD_Settings::get( 'interface_theme' ); return in_array( $legacy, $allowed, true ) ? $legacy : 'commander_gold'; } /** Persist only the requesting operator's appearance; never change global sensor settings. */ public static function save_interface_theme() { if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'code' => 'forbidden' ), 403 ); } check_ajax_referer( 'edrad_interface_theme', '_wpnonce' ); $value = isset( $_POST['interface_theme'] ) && is_string( $_POST['interface_theme'] ) ? sanitize_key( wp_unslash( $_POST['interface_theme'] ) ) : ''; if ( ! in_array( $value, array( 'commander_gold', 'sensor_tactical', 'tactical_light' ), true ) ) { wp_send_json_error( array( 'code' => 'invalid_theme' ), 400 ); } update_user_meta( get_current_user_id(), 'edrad_interface_theme', $value ); if ( self::current_interface_theme() !== $value ) { wp_send_json_error( array( 'code' => 'save_failed' ), 500 ); } wp_send_json_success( array( 'theme' => $value ) ); } public static function menu() { self::$page_hooks[] = add_menu_page( 'Error Division Radar', 'Error Division Radar', 'manage_options', 'error-division-radar', array( __CLASS__, 'render' ), plugins_url( 'assets/edcr-shield-menu.png', EDRAD_FILE ), 81 ); self::$page_hooks[] = add_submenu_page( 'error-division-radar', EDRAD_Language::t( 'Radar Overview' ), EDRAD_Language::t( 'Overview' ), 'manage_options', 'error-division-radar', array( __CLASS__, 'render' ) ); self::$page_hooks[] = add_submenu_page( 'error-division-radar', EDRAD_Language::t( 'Signal Console' ), EDRAD_Language::t( 'Signal Console' ), 'manage_options', 'error-division-radar-signals', array( 'EDRAD_Incident_Explorer', 'render' ) ); self::$page_hooks[] = add_submenu_page( 'error-division-radar', 'Black Box', 'Black Box', 'manage_options', 'error-division-radar-blackbox', array( __CLASS__, 'render_blackbox' ) ); self::$page_hooks[] = add_submenu_page( 'error-division-radar', EDRAD_Language::t( 'Radar Settings' ), EDRAD_Language::t( 'Settings' ), 'manage_options', 'error-division-radar-settings', array( __CLASS__, 'render_settings' ) ); self::$page_hooks[] = add_submenu_page( 'error-division-radar', 'Performance Intelligence', 'Performance', 'manage_options', 'error-division-radar-performance', array( 'EDRAD_Performance', 'render' ) ); self::$page_hooks[] = add_submenu_page( 'error-division-radar', EDRAD_Language::t( 'System Dossier' ), EDRAD_Language::t( 'System Dossier' ), 'manage_options', 'error-division-radar-dossier', array( __CLASS__, 'render_dossier' ) ); self::$page_hooks[] = add_submenu_page( 'error-division-radar', EDRAD_Language::t( 'Documentation' ), EDRAD_Language::t( 'Documentation' ), 'manage_options', 'error-division-radar-docs', array( __CLASS__, 'render_documentation' ) ); } /** Cache-bust Radar-owned assets independently of the plugin version. */ private static function asset_version( $filename ) { $path = EDRAD_DIR . 'assets/' . $filename; $mtime = is_file( $path ) ? filemtime( $path ) : false; return $mtime ? (string) $mtime : EDRAD_VERSION; } public static function assets( $hook ) { // Narrowly scoped menu-icon sizing on any admin screen where the menu appears. // Radar's full UI stylesheet remains exclusive to its own pages. wp_enqueue_style( 'edrad-menu-icon', plugins_url( 'assets/menu.css', EDRAD_FILE ), array(), self::asset_version( 'menu.css' ) ); $is_ed_screen = self::is_plugin_screen( $hook ); if ( ( $is_ed_screen || 'index.php' === $hook ) && current_user_can( 'manage_options' ) && EDRAD_Settings::get( 'notice_bay' ) ) { wp_enqueue_style( 'edcr-notice-bay', plugins_url( 'assets/notice-bay.css', EDRAD_FILE ), array(), self::asset_version( 'notice-bay.css' ) ); wp_enqueue_script( 'edcr-admin-shell', plugins_url( 'assets/shell.js', EDRAD_FILE ), array(), self::asset_version( 'shell.js' ), true ); wp_localize_script( 'edcr-admin-shell', 'EDRAD_SHELL_I18N', array( 'noticeBay' => EDRAD_Language::t( 'WORDPRESS NOTICE BAY' ), 'message' => EDRAD_Language::t( 'MESSAGE' ), 'messages' => EDRAD_Language::t( 'MESSAGES' ) ) ); } if ( ! $is_ed_screen ) { return; } wp_enqueue_style( 'edcr-admin', plugins_url( 'assets/admin.css', EDRAD_FILE ), array(), self::asset_version( 'admin.css' ) ); wp_enqueue_script( 'edcr-interface-language', plugins_url( 'assets/i18n.js', EDRAD_FILE ), array(), self::asset_version( 'i18n.js' ), true ); wp_localize_script( 'edcr-interface-language', 'EDRAD_I18N', array( 'language' => EDRAD_Language::current(), 'catalog' => EDRAD_Language::catalog() ) ); wp_enqueue_script( 'edcr-command-navigation', plugins_url( 'assets/navigation.js', EDRAD_FILE ), array(), self::asset_version( 'navigation.js' ), true ); if ( false !== strpos( (string) $hook, 'error-division-radar-settings' ) ) { wp_enqueue_script( 'edrad-instant-theme', plugins_url( 'assets/instant-theme.js', EDRAD_FILE ), array(), self::asset_version( 'instant-theme.js' ), true ); wp_localize_script( 'edrad-instant-theme', 'EDRAD_INSTANT_THEME', array( 'url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'edrad_interface_theme' ), 'initial' => self::current_interface_theme(), 'saving' => 'Saving theme…', 'saved' => 'Theme saved for your account.', 'failed' => 'Theme could not be saved. Restored previous appearance.', ) ); } if ( false !== strpos( (string) $hook, 'error-division-radar-performance' ) ) { wp_enqueue_script( 'edrad-performance', plugins_url( 'assets/performance.js', EDRAD_FILE ), array(), self::asset_version( 'performance.js' ), true ); wp_localize_script( 'edrad-performance', 'EDRAD_PERFORMANCE', array( 'url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'edrad_performance_probe' ), 'asset' => plugins_url( 'assets/radar-mark.svg', EDRAD_FILE ), ) ); } if ( 'toplevel_page_error-division-radar' === $hook && EDRAD_Settings::get( 'visual_intelligence' ) ) { $events = EDRAD_Database::recent_events( 100 ); wp_enqueue_script( 'edcr-visual-intelligence', plugins_url( 'assets/admin.js', EDRAD_FILE ), array(), self::asset_version( 'admin.js' ), true ); wp_localize_script( 'edcr-visual-intelligence', 'EDRAD_VISUAL_DATA', array( 'events' => array_map( array( __CLASS__, 'chart_event' ), array_reverse( $events ) ), 'windowLoad' => EDRAD_Analyzer::analyze( $events, EDRAD_Settings::get( 'window_minutes' ) )['window_load'], 'defaultMode' => EDRAD_Settings::get( 'visual_mode' ), 'labels' => array( 'noData' => EDRAD_Language::t( 'NO SIGNAL DATA' ), 'events' => EDRAD_Language::t( 'EVENTS' ), 'windowLoad' => EDRAD_Language::t( 'WINDOW LOAD' ), 'normalized' => EDRAD_Language::t( 'NORMALIZED SIGNAL SEVERITY' ), 'Deployment' => EDRAD_Language::t( 'Deployment' ), 'Identity' => EDRAD_Language::t( 'Identity' ), 'Drift' => EDRAD_Language::t( 'Drift' ), 'Impact' => EDRAD_Language::t( 'Impact' ), 'Configuration' => EDRAD_Language::t( 'Configuration' ), 'Other' => EDRAD_Language::t( 'Other' ) ) ) ); } } public static function chart_event( $event ) { return array( 'time' => $event['created_at'], 'severity' => absint( $event['severity'] ), 'type' => sanitize_key( $event['event_type'] ), 'noop' => EDRAD_Analyzer::is_noop( $event ) ); } private static function command_nav( $active ) { $tabs = array( 'error-division-radar' => array( 'OVERVIEW', 'Radar status and visual intelligence' ), 'error-division-radar-signals' => array( 'SIGNAL CONSOLE', 'Search and isolate operational events' ), 'error-division-radar-blackbox' => array( 'BLACK BOX', 'Database incident capsules' ), 'error-division-radar-settings' => array( 'SETTINGS', 'Configuration and recovery controls' ), 'error-division-radar-performance' => array( 'PERFORMANCE', 'Read-only runtime and latency intelligence' ), 'error-division-radar-dossier' => array( 'DOSSIER', 'Sanitized system and sensor diagnostics' ), 'error-division-radar-docs' => array( 'DOCUMENTATION', 'Operator guidance and recovery protocols' ), ); foreach ( $tabs as &$tab ) { $tab = array( EDRAD_Language::t( $tab[0] ), EDRAD_Language::t( $tab[1] ) ); } unset( $tab ); ?>id ) || ! current_user_can( 'manage_options' ) ) { return; } // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only navigation/filter selection behind manage_options; no action is authorized by this GET parameter. $page = sanitize_key( wp_unslash( $_GET['page'] ?? 'error-division-radar' ) ); self::command_nav( $page ); } public static function render() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html( EDRAD_Language::t( 'Access denied.' ) ) ); } $events = EDRAD_Database::recent_events( 100 ); $capsules = EDRAD_Database::recent_capsules( 6 ); $window = EDRAD_Settings::get( 'window_minutes' ); $intel = EDRAD_Analyzer::analyze( $events, $window ); $intel['class_display'] = EDRAD_Language::t( $intel['class'] ); $intel['status_display'] = EDRAD_Language::t( $intel['status'] ); $intel['evidence_display'] = EDRAD_Language::t( $intel['evidence'] ); $intel['assessment_display'] = EDRAD_Language::t( $intel['assessment'] ); $intel['evidence_factors_display'] = array_map( array( 'EDRAD_Language', 't' ), $intel['evidence_factors'] ); $stats = self::statistics( $events, $intel ); $telemetry = EDRAD_Database::telemetry(); ?>

Error Division Radar shield
ERROR DIVISION / TACTICAL INTELLIGENCE
RADAR

Passive system-state intelligence. No blocking. No external transmission.

MONITORING
AQI RULE ENGINE / MINUTES

Inspect evidence factors+
EVIDENCE
MEANINGFUL SIGNALS
RECORDED EVENTSLOCAL DATA
NEUTRALIZED NO-OPSNO STATE CHANGE
STORED RECORDSPHYSICAL ROWS
OBSERVED SIGNALSINCLUDING REPEATS
SUPPRESSED NOISERETAINED / EXCLUDED FROM AQI
CONDENSED REPEATSFLOOD GUARD
Black Box forensic memory seal
FORENSIC MEMORY / DATABASE CAPSULES

BLACK BOX

Incident snapshots with a SHA-256 consistency checksum.

CAPSULES
ARMEDNo incident capsule has been triggered. The recorder is standing by.
CAPSULE # / UTC

Inspect capsule
SHA-256
RECOVERY INTELLIGENCE

ADVISORY ONLY / NO AUTOMATIC SYSTEM CHANGES
Export incident capsule
VISUAL INTELLIGENCE / 01

Severity Timeline

VISUAL INTELLIGENCE / 02

Signal Distribution

VISUAL INTELLIGENCE / 03

Window Load

VISUAL INTELLIGENCE / 04

Event Composition

Operational Timeline

Export incident package
1 ) : ?>
UTCSignalEventActor
No events recorded.
NO-OPS
Inspect state delta
SUPPRESSED NOISE / EXCLUDED FROM AQI 1 ) : ?>FLOOD GUARD / OCCURRENCES / LAST UTC
0, 'impact' => 0, 'identity' => 0, 'drift' => 0, 's5' => 0 ); foreach ( $events as $event ) { $type = $event['event_type']; if ( in_array( $type, array( 'update_completed', 'plugin_activated', 'plugin_deactivated', 'theme_switched' ), true ) ) { ++$counts['deployment']; } if ( 'fatal_error' === $type ) { ++$counts['impact']; } if ( in_array( $type, array( 'user_created', 'user_deleted', 'user_role_changed' ), true ) ) { ++$counts['identity']; } if ( 'unattributed_drift' === $type ) { ++$counts['drift']; } if ( 5 === absint( $event['severity'] ) ) { ++$counts['s5']; } } return array( array( 'label' => 'WINDOW LOAD', 'value' => $intel['window_load'] . '%', 'detail' => 'NORMALIZED AVG SEVERITY', 'class' => $intel['window_load'] >= 70 ? 'edcr-stat-alert' : '' ), array( 'label' => 'EVIDENCE', 'value' => $intel['evidence'], 'detail' => count( $intel['evidence_factors'] ) . ' VERIFIED FACTORS', 'class' => '' ), array( 'label' => 'DEPLOYMENT SIGNALS', 'value' => $counts['deployment'], 'detail' => 'RECORDED OPERATIONS', 'class' => '' ), array( 'label' => 'FATAL IMPACTS', 'value' => $counts['impact'], 'detail' => 'DEDUPLICATED EVENTS', 'class' => $counts['impact'] ? 'edcr-stat-alert' : '' ), array( 'label' => 'S5 SIGNALS', 'value' => $counts['s5'], 'detail' => 'MAXIMUM SEVERITY', 'class' => $counts['s5'] ? 'edcr-stat-alert' : '' ), array( 'label' => 'IDENTITY CHANGES', 'value' => $counts['identity'], 'detail' => 'PRIVILEGED OPERATIONS', 'class' => $counts['identity'] ? 'edcr-stat-review' : '' ), array( 'label' => 'UNATTRIBUTED DRIFT', 'value' => $counts['drift'], 'detail' => 'UNEXPLAINED STATE CHANGE', 'class' => $counts['drift'] ? 'edcr-stat-alert' : '' ), array( 'label' => 'NEUTRALIZED NO-OPS', 'value' => $intel['noops'], 'detail' => 'NO STATE CHANGE', 'class' => '' ), ); } public static function render_signals() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html( EDRAD_Language::t( 'Access denied.' ) ) ); } $filters = array( // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only navigation/filter selection behind manage_options; no action is authorized by this GET parameter. 'family' => sanitize_key( wp_unslash( $_GET['family'] ?? 'all' ) ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only navigation/filter selection behind manage_options; no action is authorized by this GET parameter. 'severity' => absint( $_GET['severity'] ?? 0 ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only navigation/filter selection behind manage_options; no action is authorized by this GET parameter. 'hours' => absint( $_GET['hours'] ?? 0 ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only navigation/filter selection behind manage_options; no action is authorized by this GET parameter. 'search' => sanitize_text_field( wp_unslash( $_GET['s'] ?? '' ) ), ); $events = EDRAD_Database::filtered_events( $filters, 300 ); $families = array( 'all' => 'ALL SIGNALS', 'changes' => 'CHANGES', 'faults' => 'FAULTS', 'identity' => 'IDENTITY', 'noops' => 'NO-OPS', 'suppressed' => 'SUPPRESSED' ); ?>

Signal Console

OPERATIONAL QUERY SURFACE / LOCAL DATA

SIGNAL CONSOLE

Search, classify, and inspect recorded state intelligence.

MATCHES
RESET
UTCSignalEvent IntelligenceActor
No matching signals.
Inspect evidence

Black Box Archive

Black Box forensic memory seal
FORENSIC MEMORY / DATABASE CHECKSUMS

BLACK BOX ARCHIVE

Incident snapshots preserved within the configured retention boundary.

CAPSULES
CURRENT SENSOR LEGACY EVIDENCE ACTIVE SCHEMA CAPSULE / 2RADAR v
ARMEDNo incident capsule has been triggered.
0, 'legacy' => 0 ); foreach ( $capsules as $capsule ) { $payload = json_decode( $capsule['payload'] ?? '', true ); $state = EDRAD_Blackbox::provenance( is_array( $payload ) ? $payload : array() ); $counts[ $state['legacy'] ? 'legacy' : 'current' ]++; } return $counts; } public static function render_settings() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html( EDRAD_Language::t( 'Access denied.' ) ) ); } $options = EDRAD_Settings::all(); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only navigation/filter selection behind manage_options; no action is authorized by this GET parameter. $section = sanitize_key( wp_unslash( $_GET['section'] ?? 'configuration' ) ); $section = in_array( $section, array( 'configuration', 'recovery' ), true ) ? $section : 'configuration'; ?>

Error Division Radar shield
ERROR DIVISION / CONTROL SURFACE
RADAR SETTINGS

Configure observation depth, retention, privacy, and operator visibility.

LOCAL CONTROL
ADMIN SIGNAL CONTROL / FEATURE MODULE

WordPress Notice Bay

When enabled, collect WordPress notices on the Dashboard and Radar pages in an initially collapsed, expandable panel. When disabled, WordPress displays notices normally without a Radar frame.

Explicit operator activation required.
ANALYSIS / 01

Correlation Window

Time span used to classify related operational signals.

DATA / 02

Local Retention

Events older than this limit are removed during daily maintenance.

IMPACT / 03

Fatal Error Capture

Record fatal error type, component, relative path, line, and message fingerprint.

PRIVACY / 04

Error Message Storage

Optional. Full messages can contain sensitive application data and are disabled by default.

DISPLAY / 05

Neutral Signals

Show WordPress completion hooks that produced no measurable state change.

DISPLAY / 06

Visual Intelligence

Render native, low-overhead tactical charts from locally recorded events.

DISPLAY / 07

Default Visual Mode

Initial dashboard view before an operator chooses a browser-specific preference.

DISPLAY / 08

Interface Theme

Choose your operator theme. The preview updates instantly and saves to your account without Commit Configuration.

LANGUAGE / 09

Interface Language

Select the tactical interface language. Auto follows the current WordPress user locale.

LIFECYCLE / 10

Uninstall Cleanup

Remove Radar events, fingerprints, and settings when the plugin is deleted.

SENSOR POLICY / 10

Signal Families

Choose which operational families enter the Radar. S5, fatal, and drift impact evidence remains protected.

'DEPLOYMENT', 'identity' => 'IDENTITY', 'configuration' => 'CONFIGURATION', 'drift' => 'DRIFT' ) as $key => $label ) : ?>
NOISE CONTROL / 11

Suppression Matrix

One wildcard pattern per line. Matching signals remain auditable but are excluded from AQI assessment.

Protected impact evidence can never be suppressed.
FLOOD GUARD / 12

Repeat Condensation

Condense identical low-risk signals into a single record while preserving the occurrence count and last-seen time.

CONFIGURATION STATEStored locally in this WordPress installation.

' . esc_html__( 'Recovery disabled on Multisite', 'error-division-radar' ) . '

' . esc_html__( 'Per-site monitoring is supported; independent Rescue and plugin isolation are not available in Multisite mode.', 'error-division-radar' ) . '

'; } else { EDRAD_Native_Recovery::render(); } } ?> EDRAD_Native_Recovery::active() ? 'WordPress Recovery Mode is active.' : 'Normal WordPress session.' ); $settings = EDRAD_Settings::all(); $host = strtolower( (string) wp_parse_url( home_url( '/' ), PHP_URL_HOST ) ); $is_local = in_array( $host, array( 'localhost', '127.0.0.1', '::1' ), true ) || str_ends_with( $host, '.local' ) || str_ends_with( $host, '.test' ); $memory_mb = wp_convert_hr_to_bytes( defined( 'WP_MEMORY_LIMIT' ) ? WP_MEMORY_LIMIT : '0' ) / MB_IN_BYTES; return array( 'dossier' => array( 'generated_at_utc' => gmdate( 'c' ), 'generator' => 'Error Division Radar ' . EDRAD_VERSION, 'site_identifier' => substr( hash( 'sha256', home_url( '/' ) ), 0, 16 ), 'privacy_profile' => 'SANITIZED / NO KEYS / NO ABSOLUTE PATHS / NO ERROR MESSAGES', ), 'environment' => array( 'scope' => $is_local ? 'LOCAL DEVELOPMENT' : 'DEPLOYMENT', 'wordpress' => get_bloginfo( 'version' ), 'php' => PHP_VERSION, 'database' => sanitize_text_field( $wpdb->db_version() ), 'multisite' => is_multisite(), 'https' => is_ssl(), 'wp_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG, 'wp_memory_limit' => defined( 'WP_MEMORY_LIMIT' ) ? WP_MEMORY_LIMIT : 'UNDECLARED', 'cron_disabled' => defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON, 'resource_state' => $memory_mb && $memory_mb < 128 ? 'ADVISORY / MEMORY BELOW 128M' : 'NOMINAL', ), 'installation' => array( 'active_theme' => sanitize_text_field( $theme->get( 'Name' ) ), 'theme_version' => sanitize_text_field( $theme->get( 'Version' ) ), 'active_plugin_count' => count( $active ), 'active_plugins' => $active_names, ), 'sensor' => array( 'version' => EDRAD_VERSION, 'correlation_minutes' => absint( $settings['window_minutes'] ), 'retention_days' => absint( $settings['retention_days'] ), 'interface_theme' => sanitize_key( self::current_interface_theme() ), 'flood_guard' => (bool) $settings['flood_guard'], 'flood_window_seconds' => absint( $settings['flood_window'] ), 'suppression_rules' => count( array_filter( preg_split( '/\R/', (string) $settings['suppression_patterns'] ) ) ), 'telemetry' => $telemetry, ), 'recovery_readiness' => array( 'state' => $recovery['state'], 'wordpress_bootstrap_required' => true, 'independent_recovery' => false, ), 'compatibility' => array( 'cache_layer_detected' => ! empty( $cache_names ), 'cache_plugins' => $cache_names, 'advisory' => $cache_names ? 'Exclude the Recovery Console and future machine-readable feeds from page caching.' : 'No active cache layer identified by plugin metadata.', ), ); } public static function render_dossier() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html( EDRAD_Language::t( 'Access denied.' ) ) ); } $data = self::dossier_data(); $json = wp_json_encode( $data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ); ?>

System Dossier

SUPPORT INTELLIGENCE / SANITIZED LOCALLY

SYSTEM DOSSIER

A deployment-safe operational brief for diagnosis, support, and release validation.

RECOVERY CONTEXT
EXPORT JSONEXPORT PDFNO RECOVERY KEY · NO ABSOLUTE PATHS · NO STORED ERROR MESSAGES
$values ) : ?>
INTELLIGENCE MODULE

$value ) : self::render_dossier_row( $group, $key, $value, $data ); endforeach; ?>
'; foreach ( $value as $plugin ) { echo '' . esc_html( $plugin ) . ''; } echo ''; } elseif ( 'telemetry' === $key && is_array( $value ) ) { echo ''; foreach ( $value as $metric => $number ) { echo '' . esc_html( EDRAD_Language::t( strtoupper( str_replace( '_', ' ', $metric ) ) ) ) . '' . esc_html( $number ) . ''; } echo ''; } elseif ( 'cache_plugins' === $key && is_array( $value ) ) { echo empty( $value ) ? 'NONE DETECTED' : ''; if ( $value ) { foreach ( $value as $plugin ) { echo '' . esc_html( $plugin ) . ''; } echo ''; } } elseif ( is_array( $value ) ) { echo esc_html( empty( $value ) ? 'NONE' : implode( ', ', array_map( 'strval', $value ) ) ); } elseif ( is_bool( $value ) ) { echo esc_html( EDRAD_Language::t( $value ? 'YES' : 'NO' ) ); } else { echo esc_html( EDRAD_Language::t( (string) $value ) ); } ?>
array( 'number' => '01', 'title' => 'Quick Start', 'label' => 'DEPLOYMENT', 'intro' => 'Initialize the Radar Core, configure optional modules, and validate the first recorded changes.', 'steps' => array( 'Activate Error Division Radar and confirm that Overview reports an initial system baseline.', 'Open Settings and review monitoring, retention, privacy and Notice Bay options.', 'If using a separately installed recovery host component, consult its setup and access instructions; test a deliberate fatal-error drill only on isolated staging.', 'On staging, validate Rescue readiness and a documented rollback path without triggering a fatal error.', 'Review Signal Console and System Dossier, then export available diagnostic evidence before making repairs.', ), ), 'operator-flow' => array( 'number' => '02', 'title' => 'Operator Flow', 'label' => 'INTELLIGENCE', 'intro' => 'Move from operational state to evidence without turning chronological proximity into invented causality.', 'steps' => array( 'Overview classifies the current correlation window using inspectable deterministic rules.', 'Signal Console reconstructs component timelines and exposes why a chain was flagged.', 'Black Box preserves qualifying fatal-impact and drift evidence as sealed local capsules.', 'Operator classifications are stored separately and never rewrite the original evidence.', ), ), 'black-box' => array( 'number' => '03', 'title' => 'Black Box', 'label' => 'FORENSICS', 'intro' => 'Local incident memory for impact evidence, correlated precursors and recorded state changes.', 'steps' => array( 'CHECKSUM MATCH means that the stored checksum agrees with the current capsule contents.', 'A database checksum is a consistency check, not an authenticated proof against database tampering.', 'Review the capsule timestamp and captured evidence before attributing a failure to an earlier change.', 'Export a capsule before changing the affected installation.', ), ), 'recovery' => array( 'number' => '04', 'title' => 'Recovery Boundaries', 'label' => 'CORE / OPTIONAL', 'intro' => 'Understand the difference between the WordPress-dependent Core and optional independently deployed recovery protection.', 'steps' => array( 'The Core does not install MU plugins or expose a standalone recovery endpoint.', 'Recovery assistance provided by the Core requires WordPress and Radar to load.', 'Independent recovery requires a separately installed host component and its own configuration.', 'Keep hosting-panel, SFTP or SSH access and an off-site backup as independent recovery layers; do not depend on Radar alone.', ), ), 'policy' => array( 'number' => '05', 'title' => 'Sensor Policy', 'label' => 'CONTROL', 'intro' => 'Tune observation scope, retention and noise reduction while reviewing important incident evidence.', 'steps' => array( 'Sensor options configure which supported categories of changes are recorded and analyzed.', 'Suppression patterns can exclude matching routine noise from AQI assessment; review settings before relying on them.', 'Flood Guard condenses repeated low-risk signals and retains occurrence telemetry.', 'Review all filters and retention settings carefully; do not treat suppressed routine signals as proof that no problem exists.', ), ), 'privacy' => array( 'number' => '06', 'title' => 'Security & Privacy', 'label' => 'LOCAL-FIRST', 'intro' => 'Understand exactly what is retained, what remains optional, and what never leaves the installation.', 'steps' => array( 'Error Division Radar requires no account and transmits no external telemetry.', 'Full PHP error-message storage is optional and disabled by default.', 'Review the exported System Dossier before sharing it with third parties.', 'Notice Bay is opt-in, disabled by default, and loads no presentation assets while disabled.', ), ), ); $faqs = array( 'Is this another activity log?' => 'No. Activity logs mainly record actions. Error Division Radar records supported changes, assesses operational state and correlates evidence. Independent recovery is a separately installed optional component.', 'Does it block attacks or repair failures?' => 'No. It is a passive diagnostics and intelligence sensor—not a firewall, malware scanner, backup, rollback service, or automatic repair system.', 'Why can a fatal error show HTTP 200?' => 'PHP may fail after response headers exist. The Radar therefore preserves HTTP response, lifecycle completion, operational state, and classification basis as separate evidence.', 'Can it identify the opening line of an unclosed block?' => 'When PHP supplies defensible syntax-origin information, Syntax Intelligence separates the origin line from the later parser-stop line at which execution terminated.', 'Does uninstall remove all Radar data?' => 'Only when Uninstall Cleanup is enabled before deletion. Export evidence that must be retained before using that destructive option.', 'Does the Core include independent recovery?' => 'No. The Core recovery assistance requires WordPress to load. Independent recovery requires a separately installed host component.', 'Are database checksums cryptographic authenticity proofs?' => 'No. Database checksums detect inconsistencies but do not authenticate evidence against database tampering.', 'Will it load assets on the public frontend?' => 'The Radar administration interface is designed to load in the WordPress admin area, not as a public frontend interface.', ); ?>

Error Division Radar Documentation

OPERATOR INTELLIGENCE / CORE REFERENCE

DOCUMENTATION COMMAND MODULE

Core deployment guidance, evidence interpretation, recovery boundaries and operator workflows—available inside WordPress.

vFIELD MANUAL
CORE OPERATIONAL PATHCHANGE → IMPACT → EVIDENCE → RESPONSE

Precision over noise. Evidence is preserved before interpretation and never rewritten by later operator judgment.

$guide ) : ?>

OPERATOR QUESTIONS / EVIDENCE-BOUND ANSWERS

FREQUENTLY ASKED QUESTIONS

$answer ) : ?>

EDCR System Intelligence Dossier
ERROR DIVISION / TACTICAL INTELLIGENCE

SYSTEM DOSSIER

ERROR DIVISION RADAR / v

Sanitized operational intelligence for deployment validation, diagnostics, and forensic support readiness.

SESSION STATE
RECOVERY CONTEXT
SITE ID
LOCAL INTELLIGENCE · SANITIZED · NO CREDENTIAL MATERIAL
EXECUTIVE SYSTEM STATE

OPERATIONAL SUMMARY

$value ) : ?>

$value ) : if ( is_array( $value ) ) { continue; } ?>
OPERATOR ADVISORY
DEPLOYMENT INVENTORY

ACTIVE COMPONENTS

WORDPRESS INSTALLATION

ACTIVE THEME
/
PLUGIN COUNT

ACTIVE PLUGIN INVENTORY

'Error Division Radar ' . EDRAD_VERSION, 'generated_at'=> gmdate( 'c' ), 'site' => wp_parse_url( home_url(), PHP_URL_HOST ), 'fingerprint' => EDRAD_Fingerprint::capture(), 'analysis' => EDRAD_Analyzer::analyze( $events, EDRAD_Settings::get( 'window_minutes' ) ), 'events' => $events, 'blackbox_capsules' => $capsules, 'operator_classifications' => get_option( 'edrad_incident_classifications', array() ), ); nocache_headers(); header( 'Content-Type: application/json; charset=utf-8' ); header( 'Content-Disposition: attachment; filename="error-division-radar-incident-' . gmdate( 'Ymd-His' ) . '.json"' ); echo wp_json_encode( $package, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped exit; } public static function export_capsule() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html( EDRAD_Language::t( 'Access denied.' ) ) ); } $id = absint( $_GET['capsule'] ?? 0 ); check_admin_referer( 'edrad_export_capsule_' . $id ); $capsule = EDRAD_Database::get_capsule( $id ); if ( ! $capsule ) { wp_die( esc_html( EDRAD_Language::t( 'Capsule not found.' ) ) ); } $payload = json_decode( $capsule['payload'], true ); $package = array( 'generator' => 'Error Division Radar ' . EDRAD_VERSION, 'capsule_id' => absint( $capsule['id'] ), 'seal' => array( 'algorithm' => 'SHA-256', 'hash' => $capsule['seal_hash'], 'verified' => EDRAD_Database::capsule_is_valid( $capsule ) ), 'capsule' => is_array( $payload ) ? $payload : array(), 'recovery_intelligence' => EDRAD_Blackbox::recovery_intelligence( $capsule, is_array( $payload ) ? $payload : array() ), ); nocache_headers(); header( 'Content-Type: application/json; charset=utf-8' ); header( 'Content-Disposition: attachment; filename="edcr-blackbox-capsule-' . str_pad( $id, 4, '0', STR_PAD_LEFT ) . '.json"' ); echo wp_json_encode( $package, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped exit; } }