<?php

declare(strict_types=1);

// A/B/C old-image plate soft-delete harness. Default is non-mutating preflight.
$lane = (string)getenv('CDX_PLATE_DELETE_LANE');
$mode = (string)($argv[1] ?? '');
$targets = [
    'A' => ['/tmp/zhct-http-store-a.l5omH8', 18097, 21023, 'mysql'],
    'B' => ['/tmp/zhct-http-store-mysql.dQTTBP', 18081, 10001, 'mysql'],
    'C' => ['/tmp/zhct-dm-poc-20260928.fcpiiN/store', 18080, 112175, 'dm'],
];
if (!isset($targets[$lane]) || !in_array($mode, ['--preflight', '--execute'], true)
    || ($mode === '--execute'
        && ((string)getenv('CDX_PLATE_FILE_DELETE_EXECUTE')
                !== 'ROOT_REVIEWED_SYNTHETIC_THREE_ROWS_ONLY_V1'
            || (string)getenv('CDX_PLATE_FILE_DELETE_SHA')
                !== hash_file('sha256', __FILE__)))) {
    fwrite(STDERR, "Plate file-delete writes are disabled pending review\n");
    exit(78);
}
[$root, $port, $pid, $dialect] = $targets[$lane];
$base = 'http://127.0.0.1:' . $port;
if ((string)getenv('POC_APP_ROOT') !== $root
    || (string)getenv('POC_BASE_URL') !== $base
    || (string)getenv('POC_DIALECT') !== $dialect
    || is_link($root) || !is_dir($root . '/public')) {
    throw new RuntimeException('Approved isolated runtime mismatch');
}
$sources = [
    'application/p/controller/Common.php' => '6fb85d751b124878f8058655b18cadbe87ac3a66341b4dbc029fc5a2948c50e6',
    'application/common/service/UploadFile.php' => '16a0fe8d5a7dec7a33779405159fb19dbc01b0696c2234e9204a4203e6e97770',
    'application/p/controller/Equipment.php' => '9a50d04723354ae7db73747926aca9871228fca0c3ffad85b7e13522bb0b102a',
    'application/p/logic/Equipment.php' => '6a741878bbed56cf7f22411f5beb86c84bac9af186146b0e9bdf8438fd5ab297',
    'application/api/controller/Plate.php' => '699e0e7f974486fcc7ffb4bfc98530ae0cca87b200a864be3cab9d0463f64ef1',
    'application/api/service/Plate.php' => '3d97d4d0188cfa4c72ca6931aeae9ce40955415ba9411dd1b4c3bfd7d1ee1d05',
];
foreach ($sources as $path => $expected) {
    if (hash_file('sha256', $root . '/' . $path) !== $expected) {
        throw new RuntimeException('Plate-delete source drift');
    }
}
$cmdline = (string)@file_get_contents('/proc/' . $pid . '/cmdline');
$environment = (string)@file_get_contents('/proc/' . $pid . '/environ');
$children = (string)@file_get_contents('/proc/' . $pid . '/task/' . $pid . '/children');
$boundary = json_decode((string)@file_get_contents($base . '/__poc_boundary',
    false, stream_context_create(['http' => ['follow_location' => 0,
        'timeout' => 10, 'ignore_errors' => true]])), true);
if (strpos($cmdline, '127.0.0.1:' . $port) === false
    || strpos($cmdline, $root . '/public') === false
    || $environment === '' || trim($children) !== ''
    || (preg_match('/(?:^|\x00)PHP_CLI_SERVER_WORKERS=(\d+)(?:\x00|$)/',
        $environment, $m) && (int)$m[1] > 1)
    || !is_array($boundary) || empty($boundary['external_stubs'])
    || empty($boundary['redis_isolated']) || !empty($boundary['real_queue'])) {
    throw new RuntimeException('Approved HTTP boundary absent');
}
$ownsListenerSocket = static function () use ($pid, $port): bool {
    $hex = strtoupper(str_pad(dechex($port), 4, '0', STR_PAD_LEFT));
    $inode = '';
    foreach (@file('/proc/net/tcp', FILE_IGNORE_NEW_LINES) ?: [] as $line) {
        $parts = preg_split('/\s+/', trim($line));
        if (($parts[1] ?? '') === '0100007F:' . $hex
            && ($parts[3] ?? '') === '0A') {
            $inode = (string)($parts[9] ?? '');
            break;
        }
    }
    if ($inode === '') return false;
    foreach (@scandir('/proc/' . $pid . '/fd') ?: [] as $fd) {
        if ($fd === '.' || $fd === '..') continue;
        if (@readlink('/proc/' . $pid . '/fd/' . $fd)
            === 'socket:[' . $inode . ']') return true;
    }
    return false;
};
if (!$ownsListenerSocket()) throw new RuntimeException('HTTP port owner drift');
$cfg = require $root . '/application/database.php';
if (!is_array($cfg) || (string)($cfg['prefix'] ?? '') !== 'ydy_') {
    throw new RuntimeException('Unexpected Store DB config');
}
if ($dialect === 'mysql') {
    $local = require '/workspace/zhct/zhctproject/store/application/config/local/database.php';
    if (!is_array($local) || (string)($cfg['type'] ?? '') !== 'mysql') {
        throw new RuntimeException('Code-local MySQL boundary missing');
    }
    foreach (['hostname', 'database', 'username', 'password'] as $key) {
        if (($cfg[$key] ?? null) !== ($local[$key] ?? null)) {
            throw new RuntimeException('Store runtime differs from code local');
        }
    }
    if ((int)($cfg['hostport'] ?? 3306) !== (int)($local['hostport'] ?? 3306)) {
        throw new RuntimeException('Store runtime port differs from code local');
    }
    $dsn = 'mysql:host=' . $cfg['hostname'] . ';port=' . (int)($cfg['hostport'] ?? 3306)
        . ';dbname=' . $cfg['database'] . ';charset=' . ($cfg['charset'] ?? 'utf8');
} else {
    if ((string)($cfg['type'] ?? '') !== 'app\\cores\\database\\Dm'
        || (string)getenv('POC_HOST') !== '127.0.0.1'
        || (string)getenv('POC_PORT') !== '5237'
        || strtoupper((string)getenv('POC_SCHEMA')) !== 'ZHCT_APP'
        || strtoupper((string)getenv('POC_USER')) !== 'ZHCT_APP') {
        throw new RuntimeException('DM test instance mismatch');
    }
    foreach (['hostname' => 'POC_HOST', 'hostport' => 'POC_PORT',
        'database' => 'POC_SCHEMA', 'username' => 'POC_USER',
        'password' => 'POC_PASSWORD'] as $key => $env) {
        if ((string)($cfg[$key] ?? '') !== (string)getenv($env)) {
            throw new RuntimeException('DM worker DB config mismatch');
        }
    }
    $machineId = trim((string)@file_get_contents('/etc/machine-id'));
    if ($machineId === '' || gethostname() === false
        || hash('sha256', gethostname() . '|' . $machineId)
            !== 'd56d81988bb0f106946cce91c608fdd0ef1116e5150b23376ea87e086eace4b9') {
        throw new RuntimeException('DM host mismatch');
    }
    $listeners = [];
    $listenExit = 0;
    @exec('/usr/sbin/ss -ltnp 2>/dev/null', $listeners, $listenExit);
    $localDmServer = false;
    if ($listenExit === 0) foreach ($listeners as $line) {
        if (preg_match('/\*:5237\s+.*users:\(\("dmserver",pid=(\d+),/',
            $line, $match)) {
            $exe = @readlink('/proc/' . $match[1] . '/exe');
            $localDmServer = is_string($exe) && basename($exe) === 'dmserver';
            break;
        }
    }
    if (!$localDmServer) throw new RuntimeException('5237 is not local dmserver');
    $dsn = 'dm:host=127.0.0.1;port=5237;schema=ZHCT_APP';
}
try {
    $db = new PDO($dsn, (string)$cfg['username'], (string)$cfg['password'], [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_CASE => PDO::CASE_LOWER,
        PDO::ATTR_TIMEOUT => 5,
    ]);
} catch (Throwable $e) {
    throw new RuntimeException('Approved DB connection failed: ' . get_class($e));
}
$identity = $dialect === 'dm'
    ? 'ZHCT_APP|5237|' . (string)$db->query(
        "SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()
    : (string)$db->query(
        "SELECT CONCAT(@@server_uuid,'|',@@hostname,'|',@@port,'|',DATABASE())")
        ->fetchColumn();
$approved = $dialect === 'dm'
    ? 'bc98485aed26beab348770a82ae38dbf922b04ab88a210cd7282c4caf0156194'
    : '003eb5aecf1cd4595b609c1f7f20b9ee325b578309fb9fe14fedaf77584fa401';
if (!hash_equals($approved, hash('sha256', $identity))) {
    throw new RuntimeException('Store DB identity differs');
}
if ($mode === '--execute'
    && (string)getenv('CDX_PLATE_FILE_DELETE_DB_SHA') !== $approved) {
    throw new RuntimeException('Explicit approved DB identity missing');
}
$table = static function (string $name) use ($dialect): string {
    return $dialect === 'dm' ? strtoupper('ydy_' . $name) : 'ydy_' . $name;
};
$counts = [];
foreach (['equipment', 'plate_dishes', 'upload_file'] as $name) {
    $counts[$name] = (int)$db->query('SELECT COUNT(*) FROM ' . $table($name))
        ->fetchColumn();
    if ($counts[$name] > 1000) throw new RuntimeException('Fixture fingerprint scope too large');
}
$restaurantId = (int)$db->query('SELECT ID FROM ' . $table('restaurants')
    . ' WHERE IS_DELETE=2 AND STATUS=1 ORDER BY ID')->fetchColumn();
if ($restaurantId <= 0) throw new RuntimeException('No approved restaurant reference');
$restaurantStmt = $db->prepare('SELECT MORNING_START,MORNING_END,NOON_START,'
    . ' NOON_END,NIGHT_START,NIGHT_END FROM ' . $table('restaurants')
    . ' WHERE ID=?');
$restaurantStmt->execute([$restaurantId]);
$restaurant = $restaurantStmt->fetch(PDO::FETCH_ASSOC) ?: [];
if (count($restaurant) !== 6) throw new RuntimeException('Meal schedule unavailable');
$clock = static function (string $value): int {
    $parts = explode(':', $value);
    if (count($parts) !== 3) throw new RuntimeException('Invalid meal schedule');
    return (int)$parts[0] * 3600 + (int)$parts[1] * 60 + (int)$parts[2];
};
$boundaries = [];
foreach (['morning_start', 'morning_end', 'noon_start', 'noon_end',
    'night_start', 'night_end'] as $key) {
    $value = (string)($restaurant[$key] ?? '');
    if (!preg_match('/^\d{1,2}:\d{2}$/D', $value)) {
        throw new RuntimeException('Invalid meal schedule field');
    }
    $boundaries[$key] = $clock($value . (substr($key, -4) === '_end' ? ':59' : ':00'));
}
$currentSeconds = $clock(date('H:i:s'));
$mealAt = static function (int $seconds) use ($boundaries): int {
    if ($seconds >= $boundaries['morning_start']
        && $seconds <= $boundaries['morning_end']) return 1;
    if ($seconds >= $boundaries['noon_start']
        && $seconds <= $boundaries['noon_end']) return 2;
    if ($seconds >= $boundaries['night_start']
        && $seconds <= $boundaries['night_end']) return 3;
    return 4;
};
$selectedMeal = $mealAt($currentSeconds);
$mealFields = [1 => 'morning', 2 => 'noon', 3 => 'night', 4 => 'night_snack'];
$minutesToNearestBoundary = min(array_map(static function (int $boundary)
    use ($currentSeconds): float {
    return abs($currentSeconds - $boundary) / 60;
}, array_values($boundaries)));
$db->query('SELECT ID,UUID,ACCOUNT,PWD,SALT,NAME,TYPE,CREATE_TIME,'
    . ' CREATE_BY,IS_DELETE FROM ' . $table('user') . ' WHERE 1=0');
$day = date('Y-m-d');
if ($mode === '--preflight') {
    echo json_encode(['lane' => $lane, 'mode' => 'read-only-preflight',
        'write_and_delete_http' => 'disabled',
        'database_fingerprint' => hash('sha256', $identity),
        'runtime_isolated' => true, 'source_sha_locked' => true,
        'three_table_sizes_bounded' => $counts, 'restaurant_reference_present' => true,
        'synthetic_actor_columns_present' => true, 'fixture_day' => $day,
        'current_meal_slot' => $selectedMeal,
        'minutes_to_nearest_schedule_boundary' => round($minutesToNearestBoundary, 1),
        'planned_fixture_rows' => ['user' => 1, 'equipment' => 1,
            'upload_file' => 1, 'plate_dishes' => 1],
        'planned_http_routes' => ['/p/common/fileList',
            '/p/equipment/plateDetail', '/api/plate/dishes',
            '/p/common/fileDelete']], JSON_UNESCAPED_SLASHES) . PHP_EOL;
    exit(0);
}

// Everything below is unreachable without the reviewed, script-SHA-locked gate.
// It is deliberately not run during this design/review turn.
if ($minutesToNearestBoundary < 10
    || $currentSeconds < 600 || $currentSeconds > 85800) {
    throw new RuntimeException('Too close to meal/day boundary for one-slot fixture');
}
$marker = 'CDXPLFD' . strtoupper(bin2hex(random_bytes(8)));
$placeholder = 'static/upload/__codex_never_fetch__/' . $marker . '.invalid';
if (is_file($root . '/public/' . $placeholder)) {
    throw new RuntimeException('Placeholder unexpectedly exists on disk');
}
$snapshot = static function (PDO $pdo, string $tableName): string {
    return hash('sha256', serialize($pdo->query(
        'SELECT * FROM ' . $tableName . ' ORDER BY ID')->fetchAll(PDO::FETCH_ASSOC)));
};
$before = [];
foreach (['equipment', 'plate_dishes', 'upload_file'] as $name) {
    $before[$name] = $snapshot($db, $table($name));
}
$forbidden = [
    ['user', 'UUID'], ['user', 'ACCOUNT'],
    ['equipment', 'CODE'], ['equipment', 'CREATE_BY'],
    ['upload_file', 'FILE_NAME'], ['upload_file', 'CREATE_BY'],
    ['plate_dishes', 'CREATE_BY'],
];
foreach ($forbidden as [$name, $field]) {
    $stmt = $db->prepare('SELECT COUNT(*) FROM ' . $table($name)
        . ' WHERE ' . $field . '=?');
    $stmt->execute([$marker]);
    if ((int)$stmt->fetchColumn() !== 0) {
        throw new RuntimeException('Random fixture marker collided');
    }
}
$connect = static function () use ($dsn, $cfg): PDO {
    return new PDO($dsn, (string)$cfg['username'], (string)$cfg['password'], [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_CASE => PDO::CASE_LOWER,
        PDO::ATTR_TIMEOUT => 5,
    ]);
};
$journalDir = sys_get_temp_dir() . '/zhct-plate-file-delete-' . $marker;
if (file_exists($journalDir) || !mkdir($journalDir, 0700)) {
    throw new RuntimeException('Private recovery journal directory unavailable');
}
chmod($journalDir, 0700);
$journal = ['lane' => $lane, 'marker' => $marker,
    'database_fingerprint' => $approved, 'date' => $day,
    'actor_id' => 0, 'equipment_id' => 0, 'file_id' => 0, 'plate_id' => 0,
    'phase' => 'prepared'];
$writeJournal = static function (array $change) use (&$journal, $journalDir): void {
    $journal = array_merge($journal, $change);
    $next = $journalDir . '/recovery.next';
    if (file_put_contents($next,
        json_encode($journal, JSON_UNESCAPED_SLASHES)) === false) {
        throw new RuntimeException('Private recovery journal write failed');
    }
    chmod($next, 0600);
    if (!rename($next, $journalDir . '/recovery.json')) {
        throw new RuntimeException('Private recovery journal rename failed');
    }
};
$writeJournal([]);
$assert = static function (bool $ok, string $reason): void {
    if (!$ok) throw new RuntimeException($reason);
};
$ownedId = static function (PDO $pdo, string $sql, array $params,
    string $reason) use ($assert): int {
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $assert(count($rows) === 1 && (int)$rows[0]['id'] > 0, $reason);
    return (int)$rows[0]['id'];
};
$post = static function (string $path, array $form, string $token = '')
    use ($base, $marker, $ownsListenerSocket, $pid, $port, $root,
        $sources): array {
    if (!in_array($path, ['/p/common/fileList', '/p/common/fileDelete',
        '/p/equipment/plateDetail', '/api/plate/dishes'], true)) {
        throw new RuntimeException('Unapproved HTTP route');
    }
    $cmdline = (string)@file_get_contents('/proc/' . $pid . '/cmdline');
    $children = (string)@file_get_contents('/proc/' . $pid . '/task/' . $pid . '/children');
    $boundary = json_decode((string)@file_get_contents($base . '/__poc_boundary',
        false, stream_context_create(['http' => ['follow_location' => 0,
            'timeout' => 10, 'ignore_errors' => true]])), true);
    if (!$ownsListenerSocket()
        || strpos($cmdline, '127.0.0.1:' . $port) === false
        || strpos($cmdline, $root . '/public') === false
        || trim($children) !== '' || !is_array($boundary)
        || empty($boundary['external_stubs'])
        || empty($boundary['redis_isolated']) || !empty($boundary['real_queue'])) {
        throw new RuntimeException('HTTP boundary drift before request');
    }
    foreach ($sources as $sourcePath => $expectedSha) {
        if (hash_file('sha256', $root . '/' . $sourcePath) !== $expectedSha) {
            throw new RuntimeException('HTTP source drift before request');
        }
    }
    $headers = "Content-Type: application/x-www-form-urlencoded\r\n"
        . 'X-Test-Run: ' . $marker . "\r\n";
    if ($token !== '') $headers .= 'token: ' . $token . "\r\n";
    $stream = @fopen($base . $path, 'rb', false, stream_context_create([
        'http' => ['method' => 'POST', 'header' => $headers,
            'content' => http_build_query($form, '', '&', PHP_QUERY_RFC3986),
            'timeout' => 20, 'ignore_errors' => true,
            'follow_location' => 0],
    ]));
    if (!is_resource($stream)) throw new RuntimeException('Isolated HTTP transport failed');
    $headersOut = stream_get_meta_data($stream)['wrapper_data'] ?? [];
    $body = stream_get_contents($stream, 1024 * 1024 + 1);
    fclose($stream);
    if (!is_string($body) || strlen($body) > 1024 * 1024) {
        throw new RuntimeException('HTTP JSON response exceeded safe bound');
    }
    preg_match('/HTTP\/\S+\s+(\d+)/', (string)($headersOut[0] ?? ''), $match);
    $json = json_decode($body, true);
    return ['http' => (int)($match[1] ?? 0),
        'body' => is_array($json) ? $json : null];
};
$ok = static function (array $response): bool {
    return $response['http'] === 200 && is_array($response['body'])
        && ($response['body']['code'] ?? null) === 0;
};
$equipmentId = 0;
$fileId = 0;
$plateId = 0;
$actorId = 0;
$result = [];
$failure = '';
$cleanupFailure = '';
try {
    $now = date('Y-m-d H:i:s');
    $stmt = $db->prepare('INSERT INTO ' . $table('user')
        . ' (UUID,ACCOUNT,PWD,SALT,NAME,TYPE,CREATE_TIME,CREATE_BY,IS_DELETE)'
        . ' VALUES (?,?,?,?,?,?,?,?,?)');
    $stmt->execute([$marker, $marker, 'DISABLED',
        strtoupper(bin2hex(random_bytes(8))), $marker, 0,
        $now, $marker, 0]);
    $actorId = $ownedId($db, 'SELECT ID FROM ' . $table('user')
        . ' WHERE UUID=? AND ACCOUNT=? AND TYPE=0 AND CREATE_BY=?',
        [$marker, $marker, $marker], 'Synthetic actor not unique');
    $writeJournal(['phase' => 'actor_inserted', 'actor_id' => $actorId]);

    $stmt = $db->prepare('INSERT INTO ' . $table('equipment')
        . ' (CODE,NAME,TYPE,RESTAURANT_ID,DEL_FLAG,CREATE_TIME,CREATE_BY,'
        . ' UPDATE_TIME,UPDATE_BY) VALUES (?,?,?,?,?,?,?,?,?)');
    $stmt->execute([$marker, $marker, 8, $restaurantId, 0,
        $now, $marker, $now, $marker]);
    $equipmentId = $ownedId($db, 'SELECT ID FROM ' . $table('equipment')
        . ' WHERE CODE=? AND NAME=? AND TYPE=8 AND CREATE_BY=?',
        [$marker, $marker, $marker], 'Synthetic equipment not unique');
    $writeJournal(['phase' => 'equipment_inserted', 'equipment_id' => $equipmentId]);

    $fileName = $marker . '.invalid';
    $stmt = $db->prepare('INSERT INTO ' . $table('upload_file')
        . ' (TYPE,FILE_NAME,FILE_PATH,SOURCE_FILE_PATH,IS_DELETE,CREATE_BY,'
        . ' CREATE_TIME,UPDATE_TIME) VALUES (?,?,?,?,?,?,?,?)');
    $stmt->execute([1, $fileName, $placeholder, $placeholder, 0,
        $marker, $now, $now]);
    $fileId = $ownedId($db, 'SELECT ID FROM ' . $table('upload_file')
        . ' WHERE FILE_NAME=? AND FILE_PATH=? AND CREATE_BY=? AND TYPE=1',
        [$fileName, $placeholder, $marker], 'Synthetic file not unique');
    $writeJournal(['phase' => 'file_inserted', 'file_id' => $fileId]);

    $stmt = $db->prepare('INSERT INTO ' . $table('plate_dishes')
        . ' (EQUIPMENT_ID,MENU_DATE,MORNING_FILE_ID,NOON_FILE_ID,'
        . ' NIGHT_FILE_ID,NIGHT_SNACK_FILE_ID,IS_DELETE,CREATE_BY)'
        . ' VALUES (?,?,?,?,?,?,?,?)');
    $mealFileIds = [1 => 0, 2 => 0, 3 => 0, 4 => 0];
    $mealFileIds[$selectedMeal] = $fileId;
    $stmt->execute([$equipmentId, $day, $mealFileIds[1], $mealFileIds[2],
        $mealFileIds[3], $mealFileIds[4], 0, $marker]);
    $plateId = $ownedId($db, 'SELECT ID FROM ' . $table('plate_dishes')
        . ' WHERE EQUIPMENT_ID=? AND MENU_DATE=? AND CREATE_BY=?',
        [$equipmentId, $day, $marker], 'Synthetic plate not unique');
    $writeJournal(['phase' => 'plate_inserted', 'plate_id' => $plateId]);

    $plateStmt = $db->prepare('SELECT ID,EQUIPMENT_ID,MENU_DATE,IS_DELETE,'
        . ' MORNING_FILE_ID,NOON_FILE_ID,NIGHT_FILE_ID,NIGHT_SNACK_FILE_ID'
        . ' FROM ' . $table('plate_dishes') . ' WHERE ID=? AND CREATE_BY=?');
    $plateStmt->execute([$plateId, $marker]);
    $plateBefore = $plateStmt->fetch(PDO::FETCH_ASSOC) ?: [];
    $assert((int)($plateBefore['equipment_id'] ?? 0) === $equipmentId
        && substr((string)($plateBefore['menu_date'] ?? ''), 0, 10) === $day
        && (int)($plateBefore['is_delete'] ?? 1) === 0,
        'Synthetic plate source mismatch');
    foreach ($mealFields as $slot => $meal) {
        $assert((int)($plateBefore[$meal . '_file_id'] ?? -1)
            === $mealFileIds[$slot],
            'Synthetic plate file relation mismatch');
    }
    $result['fixture_exact_four_rows'] = true;

    require_once $root . '/application/base/Security.php';
    $token = \app\base\Security::encrypt(implode("\t", [
        (string)$actorId, $marker, $marker, '0', '', '', $marker]));
    $assert(is_string($token) && $token !== '', 'Synthetic actor token unavailable');
    $fileList = $post('/p/common/fileList', ['type' => 1], $token);
    $assert($ok($fileList)
        && ($fileList['body']['message'] ?? null) === '查询成功',
        'Pre-delete fileList rejected');
    $matching = [];
    foreach (($fileList['body']['data']['data'] ?? []) as $row) {
        if ((int)($row['id'] ?? 0) === $fileId) $matching[] = $row;
    }
    $assert(count($matching) === 1
        && is_string($matching[0]['file_url'] ?? null)
        && (string)$matching[0]['file_url'] !== '',
        'Synthetic file not on first fileList page');
    $fileUrl = (string)$matching[0]['file_url'];
    $result['file_list_before'] = ['http' => $fileList['http'],
        'file_visible' => true, 'id_type' => gettype($matching[0]['id']),
        'url_type' => gettype($fileUrl), 'url_sha' => hash('sha256', $fileUrl)];

    $detailRequest = ['equipment_id' => $equipmentId, 'menu_date' => $day];
    $detailBeforeHttp = $post('/p/equipment/plateDetail', $detailRequest, $token);
    $detailBefore = $detailBeforeHttp['body']['data'] ?? null;
    $assert($ok($detailBeforeHttp)
        && ($detailBeforeHttp['body']['message'] ?? null) === '查询成功'
        && is_array($detailBefore)
        && (int)($detailBefore['id'] ?? 0) === $equipmentId,
        'Pre-delete plateDetail rejected');
    $detailBeforeTypes = [];
    foreach ($mealFields as $slot => $meal) {
        $expectedId = $mealFileIds[$slot];
        $expectedUrl = $slot === $selectedMeal ? $fileUrl : '';
        $detailBeforeTypes[$meal] = [
            gettype($detailBefore[$meal . '_file_id'] ?? null),
            gettype($detailBefore[$meal . '_file_url'] ?? null),
        ];
        $assert((int)($detailBefore[$meal . '_file_id'] ?? -1) === $expectedId
            && (string)($detailBefore[$meal . '_file_url'] ?? '') === $expectedUrl,
            'Pre-delete plateDetail differs from synthetic file');
    }
    $result['plate_detail_before'] = ['http' => $detailBeforeHttp['http'],
        'selected_meal_slot' => $selectedMeal,
        'only_selected_file_id_and_url_match' => true,
        'other_three_slots_zero_and_empty' => true,
        'field_types' => $detailBeforeTypes];

    $assert(date('Y-m-d') === $day
        && $mealAt($clock(date('H:i:s'))) === $selectedMeal,
        'Fixture crossed meal/day boundary');
    $deviceBeforeHttp = $post('/api/plate/dishes', ['code' => $marker]);
    $deviceBefore = $deviceBeforeHttp['body']['data'] ?? null;
    $assert($ok($deviceBeforeHttp)
        && ($deviceBeforeHttp['body']['message'] ?? null) === '查询成功'
        && is_array($deviceBefore)
        && (string)($deviceBefore['img_url'] ?? '') === $fileUrl,
        'Pre-delete device image differs from synthetic file');
    $result['device_before'] = ['http' => $deviceBeforeHttp['http'],
        'img_url_type' => gettype($deviceBefore['img_url']),
        'url_matches_file_list' => true];

    $writeJournal(['phase' => 'delete_http_started']);
    $deleteHttp = $post('/p/common/fileDelete', ['id' => $fileId], $token);
    $assert($ok($deleteHttp)
        && ($deleteHttp['body']['message'] ?? null) === '删除成功'
        && ($deleteHttp['body']['data'] ?? null) === [],
        'Exact synthetic fileDelete response did not match baseline');
    $result['file_delete_response'] = ['http' => $deleteHttp['http'],
        'code_type' => gettype($deleteHttp['body']['code']),
        'data_empty_array' => true];
    $writeJournal(['phase' => 'delete_http_returned']);
    $fileStmt = $db->prepare('SELECT ID,TYPE,FILE_NAME,FILE_PATH,SOURCE_FILE_PATH,'
        . ' IS_DELETE,CREATE_BY FROM ' . $table('upload_file')
        . ' WHERE ID=? AND CREATE_BY=?');
    $fileStmt->execute([$fileId, $marker]);
    $fileAfter = $fileStmt->fetch(PDO::FETCH_ASSOC) ?: [];
    $assert((int)($fileAfter['id'] ?? 0) === $fileId
        && (int)($fileAfter['type'] ?? 0) === 1
        && (int)($fileAfter['is_delete'] ?? 0) === 1
        && (string)($fileAfter['file_name'] ?? '') === $fileName
        && (string)($fileAfter['file_path'] ?? '') === $placeholder
        && (string)($fileAfter['source_file_path'] ?? '') === $placeholder,
        'Soft-delete DB readback differs');
    $plateStmt->execute([$plateId, $marker]);
    $plateAfter = $plateStmt->fetch(PDO::FETCH_ASSOC) ?: [];
    $assert($plateAfter == $plateBefore, 'Soft-delete unexpectedly changed plate row');
    $result['soft_delete_source_readback'] = ['file_flag_one' => true,
        'plate_relation_unchanged' => true];

    $fileListAfter = $post('/p/common/fileList', ['type' => 1], $token);
    $assert($ok($fileListAfter)
        && ($fileListAfter['body']['message'] ?? null) === '查询成功',
        'Post-delete fileList rejected');
    foreach (($fileListAfter['body']['data']['data'] ?? []) as $row) {
        $assert((int)($row['id'] ?? 0) !== $fileId,
            'Deleted synthetic file remains in fileList');
    }
    $result['file_list_after'] = ['http' => $fileListAfter['http'],
        'file_absent' => true];

    $assert(date('Y-m-d') === $day
        && $mealAt($clock(date('H:i:s'))) === $selectedMeal,
        'Fixture crossed meal/day boundary after delete');
    $deviceAfterHttp = $post('/api/plate/dishes', ['code' => $marker]);
    $deviceAfter = $deviceAfterHttp['body']['data'] ?? null;
    $assert($ok($deviceAfterHttp)
        && ($deviceAfterHttp['body']['message'] ?? null) === '查询成功'
        && is_array($deviceAfter)
        && (string)($deviceAfter['img_url'] ?? '__MISSING__') === '',
        'Post-delete device image did not become empty');
    $result['device_after'] = ['http' => $deviceAfterHttp['http'],
        'img_url_type' => gettype($deviceAfter['img_url']),
        'img_url_empty_string' => true];

    $detailAfterHttp = $post('/p/equipment/plateDetail', $detailRequest, $token);
    $detailAfter = $detailAfterHttp['body']['data'] ?? null;
    $assert($ok($detailAfterHttp)
        && ($detailAfterHttp['body']['message'] ?? null) === '查询成功'
        && is_array($detailAfter)
        && (int)($detailAfter['id'] ?? 0) === $equipmentId,
        'Post-delete plateDetail rejected');
    $stale = true;
    $hidden = true;
    $detailTypes = [];
    foreach ($mealFields as $slot => $meal) {
        $assert(array_key_exists($meal . '_file_id', $detailAfter)
            && array_key_exists($meal . '_file_url', $detailAfter),
            'Post-delete plateDetail field missing');
        $id = $detailAfter[$meal . '_file_id'] ?? null;
        $url = $detailAfter[$meal . '_file_url'] ?? null;
        $detailTypes[$meal] = [gettype($id), gettype($url)];
        if ($slot === $selectedMeal) {
            $stale = $stale && (int)$id === $fileId && (string)$url === $fileUrl;
            $hidden = $hidden && (int)$id === 0 && (string)$url === '';
        } else {
            $assert((int)$id === 0 && (string)$url === '',
                'Untouched meal slot changed after fileDelete');
        }
    }
    $selectedMealName = $mealFields[$selectedMeal];
    $result['plate_detail_after'] = ['http' => $detailAfterHttp['http'],
        'mode' => $stale ? 'stale-visible'
        : ($hidden ? 'hidden' : 'mixed'), 'field_types' => $detailTypes,
        'selected_id_same_as_before' =>
            (int)$detailAfter[$selectedMealName . '_file_id'] === $fileId,
        'selected_url_same_as_before' =>
            (string)$detailAfter[$selectedMealName . '_file_url'] === $fileUrl,
        'url_sha_if_stale' => $stale ? hash('sha256', $fileUrl) : null];
    $writeJournal(['phase' => 'http_observed']);
} catch (Throwable $e) {
    $failure = get_class($e) . ':' . hash('sha256', $e->getMessage());
}
// The built-in PHP server is single-worker. A GET queued after the previous
// POST can return only after that POST has finished. If this cannot be proven,
// do not race a late fileDelete with cleanup; leave the private journal.
$barrierFailure = '';
try {
    $sameListener = static function () use ($ownsListenerSocket, $pid,
        $port, $root): bool {
        $cmdline = (string)@file_get_contents('/proc/' . $pid . '/cmdline');
        $env = (string)@file_get_contents('/proc/' . $pid . '/environ');
        $children = (string)@file_get_contents('/proc/' . $pid
            . '/task/' . $pid . '/children');
        return $ownsListenerSocket()
            && strpos($cmdline, '127.0.0.1:' . $port) !== false
            && strpos($cmdline, $root . '/public') !== false
            && $env !== '' && trim($children) === ''
            && !(preg_match('/(?:^|\x00)PHP_CLI_SERVER_WORKERS=(\d+)(?:\x00|$)/',
                $env, $m) && (int)$m[1] > 1);
    };
    $assert($sameListener(), 'HTTP listener changed before completion barrier');
    $barrierStream = @fopen($base . '/__poc_boundary', 'rb', false,
        stream_context_create(['http' => [
            'method' => 'GET', 'timeout' => 30, 'ignore_errors' => true,
            'follow_location' => 0,
        ]]));
    $assert(is_resource($barrierStream), 'Completion barrier transport unavailable');
    $barrierHeaders = stream_get_meta_data($barrierStream)['wrapper_data'] ?? [];
    $barrierBody = stream_get_contents($barrierStream, 1024 * 1024 + 1);
    fclose($barrierStream);
    preg_match('/HTTP\/\S+\s+(\d+)/', (string)($barrierHeaders[0] ?? ''),
        $barrierMatch);
    $barrierJson = is_string($barrierBody) && strlen($barrierBody) <= 1024 * 1024
        ? json_decode($barrierBody, true) : null;
    $assert((int)($barrierMatch[1] ?? 0) === 200
        && is_array($barrierJson)
        && !empty($barrierJson['external_stubs'])
        && !empty($barrierJson['redis_isolated'])
        && empty($barrierJson['real_queue'])
        && $sameListener(),
        'Completion barrier did not prove same isolated single worker');
    $writeJournal(['phase' => 'http_completion_barrier_confirmed']);
} catch (Throwable $e) {
    $barrierFailure = get_class($e) . ':' . hash('sha256', $e->getMessage());
    try { $writeJournal(['phase' => 'needs_completion_barrier_review']); }
    catch (Throwable $journalError) { /* Preserve barrier failure. */ }
}
if ($barrierFailure !== '') {
    fwrite(STDERR, json_encode(['lane' => $lane, 'marker' => $marker,
        'test_failure' => $failure, 'barrier_failure' => $barrierFailure,
        'database_cleanup' => 'NOT_ATTEMPTED',
        'recovery_journal' => $journalDir . '/recovery.json'],
        JSON_UNESCAPED_SLASHES) . PHP_EOL);
    exit(1);
}
try {
    $cleanDb = $connect();
    $cleanIdentity = $dialect === 'dm'
        ? 'ZHCT_APP|5237|' . (string)$cleanDb->query(
            "SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()
        : (string)$cleanDb->query(
            "SELECT CONCAT(@@server_uuid,'|',@@hostname,'|',@@port,'|',DATABASE())")
            ->fetchColumn();
    $assert(hash_equals($approved, hash('sha256', $cleanIdentity)),
        'Cleanup DB identity drift');
    $selectOwned = static function (string $sql, array $params) use ($cleanDb): array {
        $stmt = $cleanDb->prepare($sql);
        $stmt->execute($params);
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        if (count($rows) > 1) throw new RuntimeException('Ambiguous owned row cleanup');
        return $rows ? $rows[0] : [];
    };
    $ownedActor = $selectOwned('SELECT ID,UUID,ACCOUNT,TYPE,CREATE_BY'
        . ' FROM ' . $table('user')
        . ' WHERE UUID=? AND ACCOUNT=? AND CREATE_BY=?',
        [$marker, $marker, $marker]);
    $ownedEquipment = $selectOwned('SELECT ID,CODE,NAME,TYPE,CREATE_BY FROM '
        . $table('equipment') . ' WHERE CODE=? AND CREATE_BY=?',
        [$marker, $marker]);
    $ownedFile = $selectOwned('SELECT ID,TYPE,FILE_NAME,FILE_PATH,'
        . ' SOURCE_FILE_PATH,CREATE_BY FROM ' . $table('upload_file')
        . ' WHERE FILE_NAME=? AND CREATE_BY=?',
        [$marker . '.invalid', $marker]);
    $ownedPlate = $selectOwned('SELECT ID,EQUIPMENT_ID,MENU_DATE,IS_DELETE,'
        . ' MORNING_FILE_ID,NOON_FILE_ID,NIGHT_FILE_ID,NIGHT_SNACK_FILE_ID,'
        . ' CREATE_BY FROM ' . $table('plate_dishes') . ' WHERE CREATE_BY=?',
        [$marker]);
    if ($ownedActor) {
        $assert(($actorId === 0 || (int)$ownedActor['id'] === $actorId)
            && (int)$ownedActor['type'] === 0,
            'Owned actor identity drift');
        $actorId = (int)$ownedActor['id'];
    }
    if ($ownedEquipment) {
        $assert(($equipmentId === 0 || (int)$ownedEquipment['id'] === $equipmentId)
            && (int)$ownedEquipment['type'] === 8
            && (string)$ownedEquipment['name'] === $marker,
            'Owned equipment identity drift');
        $equipmentId = (int)$ownedEquipment['id'];
    }
    if ($ownedFile) {
        $assert(($fileId === 0 || (int)$ownedFile['id'] === $fileId)
            && (int)$ownedFile['type'] === 1
            && (string)$ownedFile['file_path'] === $placeholder
            && (string)$ownedFile['source_file_path'] === $placeholder,
            'Owned file identity drift');
        $fileId = (int)$ownedFile['id'];
    }
    if ($ownedPlate) {
        $assert(($plateId === 0 || (int)$ownedPlate['id'] === $plateId)
            && (int)$ownedPlate['equipment_id'] === $equipmentId
            && substr((string)$ownedPlate['menu_date'], 0, 10) === $day
            && (int)$ownedPlate['is_delete'] === 0,
            'Owned plate identity drift');
        foreach ($mealFields as $slot => $meal) {
            $assert((int)$ownedPlate[$meal . '_file_id']
                === ($slot === $selectedMeal ? $fileId : 0),
                'Owned plate relation drift');
        }
        $plateId = (int)$ownedPlate['id'];
    }
    $writeJournal(['phase' => 'cleanup_identified',
        'actor_id' => $actorId, 'equipment_id' => $equipmentId, 'file_id' => $fileId,
        'plate_id' => $plateId]);
    if ($ownedEquipment) {
        $stmt = $cleanDb->prepare('SELECT COUNT(*) FROM '
            . $table('plate_dishes') . ' WHERE EQUIPMENT_ID=? AND ID<>?');
        $stmt->execute([$equipmentId, $plateId]);
        $assert((int)$stmt->fetchColumn() === 0,
            'Unexpected other plate references synthetic equipment');
    }
    if ($ownedFile) {
        $stmt = $cleanDb->prepare('SELECT COUNT(*) FROM '
            . $table('plate_dishes') . ' WHERE ID<>? AND'
            . ' (MORNING_FILE_ID=? OR NOON_FILE_ID=? OR NIGHT_FILE_ID=?'
            . ' OR NIGHT_SNACK_FILE_ID=?)');
        $stmt->execute([$plateId, $fileId, $fileId, $fileId, $fileId]);
        $assert((int)$stmt->fetchColumn() === 0,
            'Unexpected other plate references synthetic file');
    }
    $cleanDb->beginTransaction();
    try {
        if ($ownedPlate) {
            $stmt = $cleanDb->prepare('DELETE FROM ' . $table('plate_dishes')
                . ' WHERE ID=? AND EQUIPMENT_ID=? AND CREATE_BY=?'
                . ' AND MENU_DATE=?');
            $stmt->execute([$plateId, $equipmentId, $marker, $day]);
            $assert($stmt->rowCount() === 1, 'Plate exact DELETE affected-row mismatch');
        }
        if ($ownedFile) {
            $stmt = $cleanDb->prepare('DELETE FROM ' . $table('upload_file')
                . ' WHERE ID=? AND TYPE=1 AND FILE_NAME=? AND FILE_PATH=?'
                . ' AND CREATE_BY=?');
            $stmt->execute([$fileId, $marker . '.invalid', $placeholder, $marker]);
            $assert($stmt->rowCount() === 1, 'File exact DELETE affected-row mismatch');
        }
        if ($ownedEquipment) {
            $stmt = $cleanDb->prepare('DELETE FROM ' . $table('equipment')
                . ' WHERE ID=? AND CODE=? AND NAME=? AND TYPE=8'
                . ' AND CREATE_BY=?');
            $stmt->execute([$equipmentId, $marker, $marker, $marker]);
            $assert($stmt->rowCount() === 1,
                'Equipment exact DELETE affected-row mismatch');
        }
        if ($ownedActor) {
            $stmt = $cleanDb->prepare('DELETE FROM ' . $table('user')
                . ' WHERE ID=? AND UUID=? AND ACCOUNT=? AND TYPE=0'
                . ' AND CREATE_BY=?');
            $stmt->execute([$actorId, $marker, $marker, $marker]);
            $assert($stmt->rowCount() === 1, 'Actor exact DELETE affected-row mismatch');
        }
        $cleanDb->commit();
    } catch (Throwable $e) {
        if ($cleanDb->inTransaction()) $cleanDb->rollBack();
        throw $e;
    }
    $verifyDb = $connect();
    $verifyIdentity = $dialect === 'dm'
        ? 'ZHCT_APP|5237|' . (string)$verifyDb->query(
            "SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()
        : (string)$verifyDb->query(
            "SELECT CONCAT(@@server_uuid,'|',@@hostname,'|',@@port,'|',DATABASE())")
            ->fetchColumn();
    $assert(hash_equals($approved, hash('sha256', $verifyIdentity)),
        'Independent cleanup DB identity drift');
    foreach ([['user', 'ACCOUNT', $marker],
        ['equipment', 'CODE', $marker],
        ['upload_file', 'CREATE_BY', $marker],
        ['plate_dishes', 'CREATE_BY', $marker]] as [$name, $field, $value]) {
        $stmt = $verifyDb->prepare('SELECT COUNT(*) FROM ' . $table($name)
            . ' WHERE ' . $field . '=?');
        $stmt->execute([$value]);
        $assert((int)$stmt->fetchColumn() === 0,
            'Independent synthetic marker cleanup failed');
        if ($name !== 'user') {
            $assert($snapshot($verifyDb, $table($name)) === $before[$name],
                'Original table fingerprint changed');
        }
    }
    $assert(!is_file($root . '/public/' . $placeholder),
        'Placeholder unexpectedly appeared on disk');
    $writeJournal(['phase' => 'cleaned']);
    $recoveryFile = $journalDir . '/recovery.json';
    $assert(is_file($recoveryFile) && unlink($recoveryFile)
        && rmdir($journalDir), 'Private recovery journal removal failed');
    $result['independent_cleanup'] = ['four_markers_zero' => true,
        'original_three_table_fingerprints_restored' => true,
        'placeholder_file_absent' => true,
        'private_journal_removed' => true];
} catch (Throwable $e) {
    $cleanupFailure = get_class($e) . ':' . hash('sha256', $e->getMessage());
    try { $writeJournal(['phase' => 'cleanup_needs_review']); }
    catch (Throwable $journalError) { /* Preserve original cleanup failure. */ }
}
if ($failure !== '' || $cleanupFailure !== '') {
    fwrite(STDERR, json_encode(['lane' => $lane, 'marker' => $marker,
        'test_failure' => $failure, 'cleanup_failure' => $cleanupFailure,
        'recovery_journal' => $journalDir . '/recovery.json'],
        JSON_UNESCAPED_SLASHES) . PHP_EOL);
    exit(1);
}
echo json_encode(['lane' => $lane, 'marker' => $marker,
    'mode' => 'synthetic-db-three-rows-isolated-http',
    'http' => $result, 'no_local_or_oss_file_calls' => true],
    JSON_UNESCAPED_SLASHES) . PHP_EOL;
