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 );
?>ERROR DIVISION RADARTACTICAL INTELLIGENCE $tab ) : ?>
LOCAL / ARMED 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();
?>
AQI RULE ENGINE / MINUTES
Inspect evidence factors + EVIDENCE
MEANINGFUL SIGNALS
RECORDED EVENTS LOCAL DATA
NEUTRALIZED NO-OPS NO STATE CHANGE
STORED RECORDS PHYSICAL ROWS OBSERVED SIGNALS INCLUDING REPEATS SUPPRESSED NOISE RETAINED / EXCLUDED FROM AQI CONDENSED REPEATS FLOOD GUARD
FORENSIC MEMORY / DATABASE CAPSULES BLACK BOX Incident snapshots with a SHA-256 consistency checksum.
CAPSULES
ARMED No incident capsule has been triggered. The recorder is standing by.
DISPLAY MODE HYBRID GRAPH STATISTICS
VISUAL INTELLIGENCE / 01
Severity Timeline VIEW Line Columns Points
VISUAL INTELLIGENCE / 02
Signal Distribution VIEW Ring Bars
VISUAL INTELLIGENCE / 03
Window Load VIEW Gauge Ring Bar
VISUAL INTELLIGENCE / 04
Event Composition VIEW Bars Ring
UTC Signal Event Actor
No events recorded.
NO-OP S Inspect state delta
1 ) : ?>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
$label ) : ?>
UTC Signal Event Intelligence Actor No matching signals. Inspect evidence
Black Box Archive
FORENSIC MEMORY / DATABASE CHECKSUMS BLACK BOX ARCHIVE Incident snapshots preserved within the configured retention boundary.
CAPSULES
CURRENT SENSOR LEGACY EVIDENCE ACTIVE SCHEMA CAPSULE / 2 RADAR v
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';
?>
'; } 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
$values ) : ?> $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
$guide ) : ?>07 FAQ
CORE OPERATIONAL PATH CHANGE → IMPACT → EVIDENCE → RESPONSE Precision over noise. Evidence is preserved before interpretation and never rewritten by later operator judgment.
OPERATOR QUESTIONS / EVIDENCE-BOUND ANSWERS FREQUENTLY ASKED QUESTIONS $answer ) : ?>
OPERATIONAL BOUNDARY The Core requires WordPress to load for recovery assistance. Independent recovery needs a separately installed host component. Database checksums detect inconsistencies but do not authenticate evidence against database tampering. Radar never replaces independent hosting access or trusted off-site backups.
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
$value ) : if ( is_array( $value ) ) { continue; } ?>
OPERATOR ADVISORY
WORDPRESS INSTALLATION
ACTIVE THEME /
PLUGIN COUNT ACTIVE PLUGIN INVENTORY SAVE AS PDF '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;
}
}