<?php
declare(strict_types=1);

// In-memory destructive-gate cases: no filesystem, PID, socket, DB or HTTP.
$policy = __DIR__ . '/race_recovery_policy.php';
if (!hash_equals('fd97fe8cd7553c61ed980b41e8e83dce6099a7e0be5373ad9bce301ae4583c7c',
    (string)hash_file('sha256', $policy))) {
    throw new RuntimeException('Frozen pure policy drift');
}
require $policy;
$nonce = 'abcdef123456';
$manifest = [
    'lane' => 'A', 'marker' => 'CDXEMRACEABCDEF123456',
    'phase' => 'stage_failed', 'menu_id' => 0, 'code_id' => 0,
    'barrier_dir' => '/tmp/cdx-em-race-barrier-' . $nonce,
    'worker_roots' => [1 => '/tmp/cdx-em-race-a-' . $nonce . '-1',
        2 => '/tmp/cdx-em-race-a-' . $nonce . '-2'],
    'worker_pids' => [1 => 0, 2 => 0],
    'worker_start_ticks' => [1 => '', 2 => ''],
    'worker_ports' => [1 => 30001, 2 => 30002],
    'worker_launch' => [1 => 'not_started', 2 => 'not_started'],
];
$notCreated = ['root_exists' => false, 'pid_present' => false,
    'pid_owned' => false, 'pid_socket_owner' => false,
    'port_listening' => false];
$created = array_merge($notCreated, ['root_exists' => true]);
$ownedPid = array_merge($created, ['pid_present' => true,
    'pid_state' => 'S', 'pid_start_ticks' => '123456',
    'pid_owned' => true, 'pid_socket_owner' => true,
    'port_listening' => true]);
$cases = [];
$result = raceRecoveryDecision($manifest, [1 => $created, 2 => $notCreated]);
$cases['first_root_only'] = ($result['allowed'] ?? false) === true
    && ($result['stop_pids'] ?? null) === []
    && count($result['archive_roots'] ?? []) === 1;
$firstPid = $manifest;
$firstPid['worker_pids'][1] = 12345;
$firstPid['worker_start_ticks'][1] = '123456';
$firstPid['worker_launch'][1] = 'pid_recorded';
$result = raceRecoveryDecision($firstPid, [1 => $ownedPid, 2 => $notCreated]);
$cases['first_pid_started'] = ($result['allowed'] ?? false) === true
    && ($result['stop_pids'] ?? null) === [12345]
    && count($result['archive_roots'] ?? []) === 1;
$conflict = array_merge($created, ['port_listening' => true]);
$result = raceRecoveryDecision($firstPid, [1 => $ownedPid, 2 => $conflict]);
$cases['second_port_conflict_never_kill_other'] =
    ($result['allowed'] ?? false) === true
    && ($result['stop_pids'] ?? null) === [12345]
    && ($result['ignored_unowned_ports'] ?? null) === [30002]
    && count($result['archive_roots'] ?? []) === 2;
$result = raceRecoveryDecision($firstPid, [1 => $ownedPid, 2 => $notCreated]);
$cases['original_service_exited_independent'] =
    ($result['allowed'] ?? false) === true
    && ($result['original_service_required'] ?? null) === false;
$hostile = array_merge($ownedPid, ['pid_owned' => false]);
$result = raceRecoveryDecision($firstPid, [1 => $hostile, 2 => $notCreated]);
$cases['pid_reuse_denied'] = ($result['allowed'] ?? true) === false;
$reused = array_merge($ownedPid, ['pid_start_ticks' => '999999']);
$result = raceRecoveryDecision($firstPid, [1 => $reused, 2 => $notCreated]);
$cases['same_cmd_socket_new_generation_denied'] = ($result['allowed'] ?? true) === false;
$zombie = array_merge($ownedPid, ['pid_state' => 'Z',
    'pid_owned' => false, 'pid_socket_owner' => false,
    'port_listening' => false]);
$result = raceRecoveryDecision($firstPid, [1 => $zombie, 2 => $notCreated]);
$cases['same_generation_exited_no_term'] = ($result['allowed'] ?? false) === true
    && ($result['stop_pids'] ?? null) === [];
$missingBirth = $firstPid;
$missingBirth['worker_start_ticks'][1] = '';
$result = raceRecoveryDecision($missingBirth,
    [1 => $ownedPid, 2 => $notCreated]);
$cases['sidecar_pid_without_journal_birth_denied'] =
    ($result['allowed'] ?? true) === false
    && ($result['reason'] ?? null) === 'pid_generation_not_recorded';
$result = raceRecoveryDecision($firstPid,
    [1 => array_merge($zombie, ['port_listening' => true]),
        2 => $notCreated]);
$cases['zombie_port_reoccupied_denied'] = ($result['allowed'] ?? true) === false;
$unknown = $manifest;
$unknown['worker_launch'][1] = 'starting';
$result = raceRecoveryDecision($unknown, [1 => $created, 2 => $notCreated]);
$cases['unknown_launched_pid_denied'] = ($result['allowed'] ?? true) === false;
if (in_array(false, $cases, true)) {
    echo json_encode(['status' => 'offline_policy_fail', 'cases' => $cases]), PHP_EOL;
    exit(1);
}
echo json_encode(['status' => 'offline_policy_pass', 'cases' => $cases,
    'filesystem_touched' => false, 'process_touched' => false,
    'db_connected' => false, 'business_http_sent' => false]), PHP_EOL;
