Алексей Тетерин
Технический долг реальности

Глава 1. Минус одиннадцать минут

Заказ MX-417-908 прибыл в сортировочный центр за одиннадцать минут до того, как покинул предыдущий.

Антон перечитал строку, проверил названия столбцов и только потом посмотрел на время в углу монитора. 10:26. Пятница ещё не успела испортиться окончательно.

В рабочем чате мигала новая реплика дежурного инженера.

— Антон, глянь маршрут. Один участок занял минус одиннадцать минут.

— Насколько именно?

— Минус одиннадцать шестнадцать.

— Красиво.

— Это в плохом смысле?

Антон не ответил. Если человек задавал такой вопрос, ответ ему уже не требовался.

На втором мониторе висела схема работы: склады, терминалы, курьерские приложения и десятки программ, которые за двенадцать лет научились кое-как понимать друг друга. Схема была устаревшей. Такие схемы устаревали примерно между сохранением файла и первой попыткой показать его кому-нибудь ещё.

Антон открыл карточку заказа.

Отправление выпустили из северного терминала в 10:14:27. В центральном сортировочном узле его отсканировали в 10:03:11. Между терминалами было сто восемьдесят семь километров. Машина с остальными грузами уже вышла на трассу; её маяк исправно передавал координаты в семнадцати километрах от северного склада.

Первой причиной всегда были часы. Антон проверил оба терминала. Один ошибался на три тысячных секунды, другой — на четыре. Не на одиннадцать минут. Если бы время так разошлось, об этом уже кричала бы половина страны.

Потом он проверил, не подделал ли кто-нибудь запись. Все служебные отметки были настоящими. До странного прибытия и после него тот же сканер спокойно принимал другие грузы.

Антон снял наушники. Из кухни доносилось ровное гудение холодильника. В квартире больше никто не производил звуков, если не считать стойку в прихожей: там с тихим шорохом крутились вентиляторы домашнего сервера.

Он снова надел наушники и позвонил в дежурную смену.

— Открой исходную запись прибытия.

— Уже.

— Номер устройства?

— CS-14-882.

— Теперь предыдущее событие с него.

Послышались клавиши.

— Девять пятьдесят восемь. Приём контейнера.

— Следующее.

— Десять ноль семь. Выдача на линию.

— То есть сканер был в центральном узле до и после нашего заказа.

— Получается, да.

— Не получается. Он там был.

Антон сохранил нужную часть журнала и сверил две независимые копии. Они совпали до знака. Запись не добавляли задним числом, она не пришла повторно и не вернулась из старой копии. В 10:03 центральный терминал принял посылку, которую северный терминал отдаст машине только в 10:14.

Компьютерные системы часто путали порядок событий. Могли потерять запись, повторить её или задержать на сутки. Но для каждой ошибки требовалась причина: неверные часы, очередь, сбой, человек с доступом. Здесь у каждой обычной причины было алиби.

Антон проверил маршрут на отдельной копии программы. Результат не изменился: минус одиннадцать минут шестнадцать секунд.

В чате появилось сообщение:

— Что пишем в отчёт?

Он набрал: «Нарушение причинно-следственной связи». Посмотрел на фразу и стёр.

— Ошибка часов на сканере. Устройство изъять. Заказ пока убрать из расчётов, маршрут пересчитать по порядку записей.

— Но часы нормальные.

— Поэтому сканер поедет к нам. Если он нормальный, вернём.

Это было временное решение. Временные решения Антон не любил, но умел отличать плохое временное решение от долгого совещания, после которого всё равно примут то же самое.

Он прикрепил к отчёту журнал, а ещё одну копию сохранил себе. В рабочей системе старые файлы иногда исчезали, хотя отвечавшая за неё команда называла это политикой хранения.

Когда карточка закрылась, Антон заметил сообщение от Алисы. Оно пришло двадцать минут назад.

«Пап, у тебя остались видео с дачи? Где мы все».

Он написал: «Какой год и формат?»

Удалил.

«Да. Вечером соберу ссылку».

Алиса прочитала сразу. Ответила не сразу.

«Спасибо».

Антон подождал, не появятся ли ещё три точки. Они не появились.

Он вернулся к очереди задач. В 10:41 машина с заказом MX-417-908 находилась в тридцати четырёх километрах от северного терминала.

К этому времени посылка уже тридцать восемь минут находилась в центральном узле.

К половине девятого Антон закончил последний созвон, разогрел еду и вспомнил про обещание Алисе.

Архив работал на отдельной машине в прихожей. Файлы хранились на нескольких дисках, ещё две зашифрованные копии лежали вне квартиры. После одного семейного разговора Антон убрал кнопку «Восстановить всё». Она никому не нравилась, хотя каждый понимал по-своему.

Он открыл каталог поездок. Годы, месяцы, места. Архив знал, когда они были на даче, по координатам телефонов и старым фотографиям. Антон выбрал четыре лета до аварии и попросил показать кадры со всей семьёй.

На экране появились Арина у мангала, Алиса с зелёной садовой лейкой, Миша в резиновых сапогах не по размеру. В одном ролике он разбегался по мокрой траве и исчезал за краем кадра. Камера дёргалась следом, но запись обрывалась.

Антон добавил в подборку двадцать семь файлов. Потом убрал три, где объектив был заляпан пальцем, и один с испорченным звуком. Вернул. Алиса просила видео, а не результаты контроля качества.

Архив создал ссылку на сутки. Антон отправил пароль отдельным сообщением.

«Там 24 файла», — написала Алиса через несколько минут.

Он пересчитал список. Двадцать семь.

«Обнови страницу».

«Обновила».

«И?»

«Теперь 27».

Антон проверил, когда Алиса открывала ссылку. Один раз, в 20:47. Сервер утверждал, что сразу показал ей все двадцать семь файлов.

Он мог спросить, какие именно файлы не показались. Вместо этого написал: «Если повторится, сделай скрин».

Точки возникли и пропали.

«Хорошо».

На этом разговор закончился.

Антон закрыл мессенджер. В каталоге остался кадр с Мишей, пойманным на середине шага. Лица не было видно. Только затылок, синяя куртка и поднятая рука. Следующий кадр существовал в другом видео, снятом через девять секунд: Миша уже сидел в траве и смеялся. Что произошло между ними, архив не знал.

Антон знал, что произошло. Он тогда стоял рядом.

Он выключил монитор, но сервер оставил работать. Ночная проверка целостности начиналась в два.

В 23:52 телефон коротко завибрировал на столе.

Антон читал в кровати инструкцию к сканеру CS-14-882. Он не был дежурным, рабочие уведомления после десяти отключались автоматически. Сработало правило, которое он добавил днём для заказа MX-417-908 и о котором уже успел забыть.

Маршрут изменён.

Антон сел, открыл ноутбук и подключился к рабочей сети.

Заказ покинул центральный узел в 18:26, прошёл ещё два терминала и в 23:51 получил новый адрес назначения. Старый адрес исчез. Получателя в карточке не было. Вместо улицы и дома стояли координаты.

Он скопировал их в карту.

Метка легла на его дом.

Антон проверил цифры посимвольно. Потом открыл карту другого сервиса. Тот же двор, тот же подъезд. Высота соответствовала его этажу с погрешностью меньше метра.

Кто-то мог подменить данные. Кто-то, знавший его адрес и имевший доступ к рабочей системе. Шутка требовала слишком многих прав и обещала слишком мало веселья, но люди совершали и более дорогие поступки.

Антон поднял историю изменений. Новое назначение ввёл не оператор. Его построила программа, которая прокладывала пути внутри больших складов. В жилых домах её не использовали.

Программа построила путь через подъезд, лифт и коридор. На плане квартиры синяя линия пересекала кабинет и заканчивалась за стеной у рабочего стола.

Расстояние до точки назначения: один метр семьдесят четыре сантиметра.

Антон посмотрел на стену. Светло-серые обои, две розетки, кабель-канал. За стеной по плану дома проходила техническая шахта. Доступ к ней был из общего коридора, и управляющая компания держала люк под замком.

Он включил верхний свет. Цифры на экране не изменились.

В служебных данных маршрута появился незнакомый пункт: ОПОРНОЕ УСТРОЙСТВО. Рядом стоял длинный номер.

Он поискал его в корпоративной базе устройств. Совпадений не было.

Поискал на ноутбуке. Ничего.

В домашней панели управления этот номер нашёлся сразу.

Так домашний сервер называл своё подключение к сети.

Антон отключил ноутбук от домашней сети и вышел в интернет через телефон. Номер остался в маршруте. Он сменил рабочий пароль и проверил домашнюю сеть. Посторонних подключений к серверу не было. Антон сам закрыл к нему доступ и проверял защиту после каждого обновления.

Из прихожей донёсся звук раскручивающегося диска.

Ночная сверка должна была начаться через два часа.

Антон подошёл к шкафу. За перфорированной дверцей мигали зелёные индикаторы. Один диск работал непрерывно, второй подхватывал нагрузку короткими сериями. На маленьком экране появилась строка:

ВОССТАНОВЛЕН 1 ОБЪЕКТ

Он вернулся к ноутбуку и открыл журнал архива.

В 23:54 система восстановила один файл якобы с местной копии. Но ни на одном запасном диске такого файла не было. Архив всё равно считал его подлинным и положил в папку с неразобранными фотографиями Миши.

Антон отключил сервер от сети. Индикатор порта погас. Диски продолжили работу.

Файл назывался IMG_4817.JPG.

Дата создания: сегодня, 00:05.

На часах было 23:57.

Антон проверил часовой пояс. Проверил системное время сервера. Открыл свойства файла через другую программу. Везде стояло 00:05. До снимка оставалось восемь минут.

Изображение загрузилось полосами.

На нём был кабинет. Рабочий стол, оба монитора, чашка у клавиатуры. Антон стоял спиной к камере. Снимали с высоты примерно одного метра, из точки за стеной, туда, куда вёл маршрут.

На правом мониторе была открыта карточка заказа MX-417-908. На левом — фотография, которую Антон рассматривал сейчас.

Он увеличил изображение. Шумы, битые пиксели, отражение потолочной лампы. Монтаж можно было сделать за час. За восемь минут тоже, если заранее подготовить исходники. Только исходника с таким ракурсом не существовало: между камерой и столом должна была быть бетонная стена.

В кадре Антон стоял, наклонившись к обоям. Левая ладонь лежала на стене возле розетки.

Он посмотрел на собственную руку. Она лежала на тачпаде.

До 00:05 оставалось шесть минут.

Антон включил камеру телефона и поставил его на полку так, чтобы в кадр попали он, стол и стена. Потом сел. Если фотография показывала будущее, достаточно было не вставать. Если кто-то управлял архивом и рабочей системой, запись даст хотя бы момент вмешательства.

В 00:01 в трубах за стеной прошёл глухой удар. Обычный гидроудар. Дом был новый только на рекламном буклете.

В 00:03 удар повторился.

Антон остался на стуле.

В 00:04:32 мониторы погасли. Верхний свет продолжал гореть. Ноутбук работал от батареи, телефон снимал, сервер был отключён от сети. Погасли только два монитора, подключённые к рабочей станции.

Из-за стены донёсся короткий электронный сигнал. Такой издавал сканер, когда принимал штрихкод.

Антон встал.

Он успел сделать два шага и остановился. До стены оставалось меньше метра. На фотографии левая ладонь касалась обоев. Антон сунул обе руки в карманы.

Сигнал повторился, теперь тише. Из глубины шахты.

00:04:58.

На стене возле розетки проступил прямоугольник размером с почтовую этикетку. Обои внутри него стали темнее, будто намокли. Антон наклонился, стараясь не приближать лицо.

На тёмном пятне медленно выступили белые строки:

MX-417-908

ОЖИДАЕТ ПОЛУЧАТЕЛЯ

Он вытащил левую руку из кармана. Край прямоугольника расплывался. Антон коснулся обоев одним пальцем.

Стена была тёплой.

В 00:05 мониторы включились.

На фотографии его ладонь лежала у розетки. Теперь всё совпадало.

Карточка заказа обновилась сама.

ДОСТАВЛЕНО: 00:05:00

ПОЛУЧАТЕЛЬ: АНТОН РУДНЕВ

ПОДПИСЬ ПОДТВЕРЖДЕНА

Глава 2. Служебный люк