Влад Велирский
Ошибка на карте

От автора

Карта кажется обещанием определённости. На ней улица либо есть, либо её нет; маршрут либо ведёт к дому, либо обрывается; точка будто бы отвечает на вопрос «где?» без оговорок. Мы редко замечаем, сколько решений уже принято до того, как линия появилась на экране: кто назвал место, кто подтвердил адрес, для какой задачи собирались данные и кто остался за границей выбранного масштаба.

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

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

Действие происходит в вымышленных городах ближайшего будущего. Технические механизмы служат драматической логике и не описывают способы вмешательства в реальные навигационные или коммунальные системы. Важнее другое: кто формулирует вопрос к карте, кто отвечает за последствия ответа и может ли система честно сказать «я не имею права показать это место».

Эту книгу лучше читать как движение по нескольким прозрачным слоям. Один показывает погоню, другой — расследование гибели картографа, третий — старую личную вину главного героя. Совпадут они не в тайной точке, а в процедуре, позволяющей доказать существование места, не превращая доказательство в право владеть им.

У хорошей карты есть легенда, масштаб и границы применимости. У честного расследования — тоже.

Глава 1. Улица, которой нет

Утром карта Рубежа была безупречна.

Максим Ладин знал это не потому, что доверял зелёному индикатору в углу стены. Индикатор сообщал лишь, что городской двойник принял ночные обновления без конфликтов. Безупречность была другой: тонкие серые линии улиц совпадали с коммунальными слоями, остановки не висели посреди дворов, аварийные коридоры оставались свободны, а мосты соединяли именно те берега, которые соединяли вчера.

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

Её не было уже девять дней.

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

Стена мигнула. Поверх карты раскрылось белое окно без эмблемы «Меридиана».

ПОСМЕРТНАЯ ПРОВЕРКА: ВЕТЛИНА Л. А.

Ниже стояло его имя и время допуска: 07:43–08:13.

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

Посмертные проверки не были письмами. Аудитор мог заранее запечатать данные, которые открывались назначенному коллеге после подтверждения смерти. Так сохраняли спорные решения и свидетельства давления. За двенадцать лет Максим видел процедуру трижды — всегда при юристе и представителе безопасности.

Здесь не было ни юриста, ни обязательства.

Он поднёс пропуск Лидии к считывателю. Красный огонёк. Погашен.

Поднёс свой.

— Подтвердить личность, — произнесла стена.

— Максим Сергеевич Ладин. Аудит второго уровня.

— Личность подтверждена. Условия проверки: один слой, одно действие, один вывод.

Так говорила Лидия. Не система — Лидия, когда приносила ему особенно грязную сборку и запрещала тонуть в сотне мелких дефектов.

Максим нажал «Открыть».

Белое окно исчезло. Карта отступила к северо-востоку Рубежа, за кольцевую грузовую линию. Район назывался Верхние Валы: склады, ремонтные ангары, две старые жилые полосы, которые город постепенно выкупал под новый транспортный узел. На первый взгляд всё было правильно.

В правой части экрана появился вопрос:

КАКАЯ УЛИЦА НЕ ПРИНАДЛЕЖИТ ЭТОЙ КАРТЕ?

Максим увеличил масштаб.

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

Он отключил подписи. Потом здания. Потом кадастровые границы.

Лидия учила начинать не с того, что добавили, а с того, чему пришлось уступить место.

На транспортном слое ничего не изменилось. Дорожные оси совпадали с прошлой сертифицированной версией. Максим вызвал сравнение по датам. Улица Жестянщиков, крайняя к каналу, была на месте. Проезд Маячный — тоже. Безымянный сервисный дублёр появился три месяца назад по утверждённому проекту.

Он вернул ограничения аварийных служб.

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

Максим приблизил северный ряд ангаров. Оранжевая полоса дрогнула.

Нет, не полоса. Улица.

Жестянщиков шла параллельно каналу, пока возле бывшего холодильного комбината не смещалась на восток. Всего один мягкий изгиб, почти незаметный в общем масштабе. Через двести метров ось возвращалась обратно. Дома получили чуть более широкие дворы, тротуар — плавную дугу. Проектировщик мог назвать это привязкой к рельефу.

Максим включил линейку и поставил две точки между старой осью, оставшейся в архивной подложке, и новой.

Шесть метров сорок сантиметров.

Он измерил аварийный коридор холодильного комбината.

Шесть метров сорок сантиметров.

Совпадение было слишком точным для ошибки и слишком бессмысленным для проекта.

Вопрос на экране не изменился.

— Улица Жестянщиков, — сказал Максим.

ДОКАЖИТЕ.

Он усмехнулся против воли. Даже после смерти Лидия не принимала ответ без метода.

Максим открыл геометрию объекта. Улица состояла из двадцати восьми сегментов. У двух сегментов возле комбината дата последнего изменения отсутствовала. Не была скрыта — отсутствовала, будто их создали до введения журнала версий. Но контрольная сумма всего транспортного слоя совпадала с ночной сборкой.

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

Значит, карта лгала.

Максим ощутил знакомое облегчение: дефект найден, границы понятны, исправление очевидно. Мир мог быть запутанным, но две несовпадающие линии не умели притворяться одной.

Он выбрал старую ось как эталон и запустил предварительную правку.

Экран потемнел.

Вместо ожидаемого сравнения возникла схема маршрута: пожарная машина входила в Верхние Валы с северной развязки, поворачивала на Жестянщиков и останавливалась в пустом прямоугольнике между складами. Адреса не было. Координат тоже. Только время прибытия — семь минут двадцать секунд — и перечёркнутый значок назначения.

— Откуда ты это взяла? — спросил Максим.

Система не ответила. Схема исчезла, вернулась карта.

В правом окне появилась новая строка:

ОДНО ДЕЙСТВИЕ.

Он убрал руку от панели.

Если действием считалась правка, Лидия ждала, что он исправит улицу. Если действием считался вывод, она уже получила ответ. Но посмертная процедура не должна была запускать маршрутизацию, тем более к объекту без адреса.

Максим открыл карточку комбината. Здание выведено из эксплуатации. Правообладатель — городской земельный резерв. Присутствие людей по коммунальным данным не фиксировалось. Последний вызов экстренной службы — четыре года назад, травма рабочего при демонтаже.

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

И всё же маршрут только что рассчитал семь минут двадцать секунд.

Он позвонил Лидии.

Глупость обнаружилась лишь после первого гудка. Максим смотрел на её погашенный пропуск и слушал, как сеть пытается найти абонента, которого больше не существовало.

На третьем гудке ответили.

— Ветлина, — сказал женский голос.

Максим встал так резко, что кресло ударилось о шкаф.

— Кто это?

— Назовите подразделение и основание запроса.

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

— Аудит городского двойника. Я звоню на личный номер Лидии Ветлиной.

— Номер включён во временный контур проверки. Передача сообщений не предусмотрена.

— Кто включил?

— Владелец контура.

— Владелец мёртв.

Пауза длилась меньше секунды, но Максим успел услышать в ней работу фильтров.

— Статус владельца является условием активации.

— Где находится контур?

— Запрос координат не соответствует правам вызывающей стороны.

Связь оборвалась.

Максим набрал номер снова. Сеть сообщила, что абонент недоступен.

На стене отсчитывалось время допуска: девятнадцать минут.

Он вернулся к карте. Теперь изгиб улицы казался не дефектом, а указательным пальцем. Сдвиг точно на ширину аварийного коридора; короткий маршрут к месту без адреса; контур, который отвечал на процедурные вопросы, но отказывался раскрывать координаты.

Лидия оставила ему не место. Она оставила несовпадение.

Максим вызвал журнал происхождения транспортного слоя. Ночная сборка поступила от городского хранилища в 03:10, прошла автоматическое совмещение в 03:18, затем была подписана узлом «Меридиана». Ни ручных вмешательств, ни конфликтов. Он расширил период до месяца. Изгиб присутствовал во всех версиях. До года — присутствовал. Три года назад улица была прямой.

Изменение появилось второго ноября 2039 года в пакете из четырёхсот семидесяти обычных поправок. Автор пакета — муниципальная служба геодезии. Автор геометрии — пусто.

Максим открыл собственный архив аудитов. В тот день он проверял южный сектор и подписал пакет целиком после выборочного сравнения. Лидия была руководителем смены.

Значит, линия прошла через их руки.

Он увеличил подпись пакета. Сертификат службы был действителен, но внутри цепочки стоял дополнительный маркер: ЛВ-6.40.

Максим закрыл карточку.

У него оставалось пятнадцать минут. По правилам следовало зафиксировать посмертную проверку и вызвать безопасность. Слой изымут, доступ опечатают, расследование перейдёт внутреннему контролю «Меридиана» — туда, чей узел подписал сборку как безупречную.

Он выбрал улицу и нажал «Исправить по фактическому проезду».

Стена показала две линии: текущую дугу и прямую ось. Под ними появились последствия — семнадцать адресных привязок без изменений, три коммунальных допуска без изменений, один экстренный маршрут изменён.

Какой именно, система не раскрывала.

Максим подтвердил предварительную правку. Это ещё не публикация; она должна была создать личную ветку, пересчитать зависимости и показать конфликт.

Полоса расчёта дошла до девяноста восьми процентов и остановилась.

— Конфликт прав, — произнесла стена.

— Показать.

— Исправление удаляет объект, необходимый для проверки аварийного доступа.

— Объект не существует на местности.

— Фактическое существование не является условием данной проверки.

— Тогда что является?

— Право запроса.

Максим перечитал фразу. Маршрут проверял не то, есть ли дорога. Он проверял, имеет ли кто-то право спросить о дороге.

В коридоре хлопнула дверь лифта. Дневная смена закончила планёрку раньше обычного. За матовым стеклом прошли две фигуры.

— Отменить предварительную правку, — сказал Максим.

— Действие уже зарегистрировано.

На стене раскрылся журнал. Верхняя строка была выделена красным:

07:58. ИЗМЕНЕНИЕ ГЕОМЕТРИИ. АВТОР: М. С. ЛАДИН.

— Это предварительная ветка.

— Ветка опубликована в контур проверки.

— Кем?

— Автором изменения.

— Я не публиковал.

— Биометрическое подтверждение получено в 07:58.

Он посмотрел на датчик под экраном. Зелёная точка означала активное распознавание. Система приняла его голосовую команду подтверждения предварительной правки за публикацию в неизвестный контур.

Максим открыл подробности события. Его имя, его пропуск, его голосовой отпечаток. Даже положение перед стеной совпадало. Юридически чистая запись.

Только геометрия была не той.

В журнале утверждалось, что в 07:58 он не выпрямил Жестянщиков, а создал её смещение на шесть метров сорок сантиметров. Ошибка, существовавшая три года, только что получила нового автора.

Максим попытался открыть предыдущую версию. Доступ запрещён: объект находится в активной проверке. Попытался выгрузить журнал. Запрещено условиями посмертной процедуры. Снимок экрана получился серым прямоугольником.

За стеклом появился начальник дневной смены Глеб Уров. Он приложил ладонь к двери, но пока не входил. Смотрел на красную строку, видимую сквозь стекло.

Максиму оставалось меньше минуты, прежде чем Уров спросит, почему аудитор без наряда меняет транспортный слой столицы.

Он мог вызвать безопасность первым и добровольно отдать доступ. Тогда его сочтут свидетелем — до изучения журнала. Но исходный слой уйдёт туда, где уже умели переписывать авторство.

Лидия дала ему одно действие.

Не исправление, понял Максим. Выбор.

Он не мог выгрузить карту, зато мог сохранить то, из чего карта была собрана. Максим открыл служебное сравнение и направил необработанные пакеты ночной сборки не в личное хранилище, которое контролировал «Меридиан», а в старый стенд проверки геодезических приборов. Стенд не имел права принимать городской слой целиком. Он принимал только последовательности измерений — без названий улиц, адресов и координатной привязки.

Максим снял привязку к Рубежу. На экране остались двадцать восемь сегментов, два из них смещены на шесть метров сорок сантиметров, и цепочка подписей. Не карта. Доказательство того, что две версии различались до его входа в кабинет.

Он отправил последовательность на стенд.

ПАКЕТ ПРИНЯТ. СРОК ХРАНЕНИЯ: 24 ЧАСА.

Белое окно посмертной проверки закрылось.

Красная строка исчезла вместе с ним. Карта снова стала безупречной. Улица Жестянщиков лежала на экране мягкой дугой, словно всегда проходила именно там.

Дверь открылась.

— Рано начал, — сказал Уров. Он перевёл взгляд с Максима на карту. — Что-то случилось?

Максим положил погашенный пропуск Лидии в карман.

— Нашёл улицу, которой нет.

Уров подождал продолжения.

— И?

— Теперь она числится моей ошибкой.

На стене зелёный индикатор подтвердил: ночная сборка принята без конфликтов.

Максим посмотрел на часы. До автоматического удаления пакета со старого стенда оставалось двадцать три часа пятьдесят девять минут.

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

Глава 2. Вторая столица

Стенд стоял в подвале старого корпуса. У Максима оставалось двадцать три часа сорок одна минута, но после разговора с Глебом это уже не казалось запасом.

— Моя ошибка означает моя проверка, — сказал Глеб у стены аудиторской. — До обеда оформи объяснение. И не трогай слой.

Максим пообещал второе.

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

Стенд занимал половину комнаты. Три алюминиевые ноги, поворотная голова, вычислительный блок с экраном цвета старого льда. В углу мигал таймер хранения: 23:37:12.

Максим подключил изолированный накопитель. Стенд предупредил, что выдаёт только измерительную последовательность без координатной системы, названий объектов и исходных сетевых подписей. Именно это ему и требовалось. Он выгрузил двадцать восемь сегментов, две версии геометрии и цепочку преобразований между ними.

На накопителе появилось сорок семь килобайт. Слишком мало для карты и достаточно для обвинения.

На экране точки лежали в условной системе: начало в нуле, север неизвестен. Два сегмента отходили от прямой на 6,40. В цепочке не было ни Лидии, ни Максима — только номера алгоритмов и маркер `ЛВ-6.40`.

Он ожидал почувствовать облегчение. Вместо этого заметил ещё одну строку.

СРАВНИТЕЛЬНЫЙ ПРОФИЛЬ: ZL-A12.

Профиль не принадлежал Рубежу. Двухбуквенный код ZL использовала столица Златин — город на другом берегу Внутреннего моря, в тысяче шестистах километрах к юго-западу. Рубеж собирал транспортную геометрию в прямоугольной сетке, Златин — в локальных секторах, ориентированных по старому магнитному меридиану. Их необработанные измерения нельзя было совместить случайно.

Максим нажал на строку. Стенд запросил внешний эталон.

Общий каталог показывал названия улиц и сертифицированные маршруты чужой столицы. Исходные точки хранились у местной службы. Запросить их официально означало объяснить, почему ошибка Рубежа содержит профиль Златина.

Он знал человека, который мог увидеть маршрут раньше карты.

Рая Сокол ответила после второго вызова.

— Где? — спросила она вместо приветствия.

— Старый корпус, подвал Б. Нужно сравнить экстренную геометрию двух городов.

— Для кого?

— Пока для меня.

— Тогда нет.

Максим посмотрел на таймер.

— Возможно, для адреса, которого нет.

В трубке стало тихо.

— Двадцать минут, — сказала Рая. — Ничего не подключай к сети.

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

— Где источник?

— Посмертная проверка Лидии Ветлиной.

— Для кого маршрут?

— Не знаю.

— Тогда начнём с того, что ты знаешь.

Максим показал ей последовательность. Не рассказал о звонке на номер Лидии и о переписанном авторстве — показал. Рая прочла журнал сама, сверила время создания старой геометрии и время его входа. Потом измерила сдвиг.

— Шесть сорок, — сказала она. — Коридор тяжёлой машины у промышленного объекта.

— Я пришёл к тому же.

— Ты пришёл по нормативу. Я — по повороту. С такой шириной машина может встать вдоль фасада и оставить место для второй. Где фасад?

— На карте — закрытый комбинат. Фактический проезд прямой.

— Не спрашиваю, что на карте. Спрашиваю, для кого оставлено место.

— Маршрут исчез раньше, чем я увидел назначение.

Рая сняла перчатку и коснулась маркера сравнительного профиля.

— ZL-A12 — не карта Златина. Это таблица поправок для машин, у которых отказал внешний ориентир. Аварийная навигация держит такие таблицы для каждой столицы.

— Она закрытая?

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

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

— Модуль со списанного учебного фургона, — сказала она. — Законно выдан на диагностику. Незаконно будет кормить его чужой последовательностью. Ты готов объяснить, зачем?

— Нет.

— Хорошо. Значит, объяснение у нас одинаковое.

Она соединила стенд с модулем оптическим кабелем. Максим выбрал профиль ZL-A12. Экран показал пустую сетку, затем запросил ориентацию.

— У Рубежа ноль совпадает с географическим севером, — сказал Максим. — Златин сохраняет магнитный.

— Их ноль совпадал с магнитным севером при первом обследовании. Старые аварийные сектора не повернули: иначе пришлось бы переподписывать все въезды.

Она ввела дату калибровки. Сетка медленно повернулась против часовой стрелки.

Две линии легли друг на друга.

Максим приблизил средние сегменты. Сдвиг существовал и здесь, но не вправо от улицы, как в Рубеже. Он уходил по диагонали. В экранных координатах — на пять метров девяносто восемь сантиметров по одной оси и два метра двадцать семь по другой.

— Длина вектора, — сказал Максим.

Рая уже считала.

— Шесть сорок.

Она повернула сетку обратно к географическому северу. Вектор отклонился ровно на угол местного магнитного склонения, сохранённого таблицей.

При копировании файла сдвиг сохранил бы направление относительно координатной сетки. Здесь он был пересчитан относительно севера резервной машины.

Ошибка принадлежала не файлу. Она принадлежала правилу движения.

— Покажи весь профиль, — сказала Рая.

— У нас только последовательность.

— Последовательность откуда-то получила имя ZL-A12. Значит, в ней есть результат сравнения. Модулю не нужны названия улиц. Ему нужны точки отказа.

Максим раскрыл цепочку преобразований. Большая часть строк была служебным шумом: нормализация единиц, удаление выбросов, округление для старого контроллера. В середине стояла операция, которую он утром принял за обычное совмещение: `EMR corridor entitlement transform`.

— Преобразование права на коридор, — перевёл он.

— Не существует такого картографического действия.

— В официальном стандарте — нет.

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

Рая дважды прочла список.

— Вот почему система сказала тебе про право запроса. Геометрия здесь — не дорога. Это ответ.

— Ответ на какой вопрос?

— Может ли машина получить следующий фрагмент.

Она выставила признак допуска в ноль. Сдвинутые сегменты исчезли, линия стала прямой. При единице изгиб возвращался, повёрнутый по таблице Златина.

Одна ошибка в Рубеже могла быть тайником Лидии. Та же операция в другой столице означала систему, способную отвечать «да» без выдачи места.

— Нам нужен сам участок Златина, — сказал он.

— Нет. Нам нужно доказать, что он существует, не запрашивая участок.

— Без независимой геометрии это всего лишь профиль внутри пакета Лидии. Она могла изготовить оба набора.

— Теперь правильно.

Рая отключила модуль. На его экране осталась тонкая диагональная дуга.

— Ты поэтому пришла? — спросил Максим. — Чтобы не дать мне запросить координаты?

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

— Какая часть?

— Та, которую мне не положено обсуждать с аудитором карт.

— Лидия обсуждала?

Рая посмотрела на погашенный пропуск в его кармане. Край пластика был виден над тканью.

— Лидия спрашивала меня, может ли маршрут быть проверяемым и при этом исчезать после помощи. Я сказала: если исчезает основание доступа, нельзя расследовать злоупотребление. Через неделю она принесла схему с двумя подписями — запроса и отказа. Координат в ней не было.

— Когда?

— За пять месяцев до смерти.

— Почему ты не сказала следствию?

— Оно спрашивало, угрожали ли ей, кто входил в кабинет и что она унесла в день смерти. Не спрашивало про маршрут. Я отвечаю на поставленные вопросы.

— Удобное правило.

— Безопасное. Особенно когда вопрос сам даёт право на чужое место.

Наверху загудела вентиляция. На стенде мигнул таймер: 22:58:04. Одновременно на служебном экране появился значок входящего запроса. Стенд был изолирован от городской сети, но его инвентарный датчик сообщал зданию, что питание включено.

УДАЛЁННАЯ ИНВЕНТАРИЗАЦИЯ ЧЕРЕЗ 120 СЕКУНД.

— Нас увидели? — спросила Рая.

— Увидели включённое оборудование. Инвентаризация прочитает историю операций.

Максим выдернул кабель. Стереть память значило оставить запись об аварийном удалении; вынести закреплённый за учебным фургоном модуль — немедленно поднять тревогу. Оставить пакет означало подарить его тому, кто уже переписал авторство.

— Инвентаризация проверяет состояние прибора, — сказал он. — Не измерения.

— Если прибор считает, что измерение не закончено.

Рая вернула кабель и запустила калибровку по двум точкам. Максим навёл объектив сперва на её серебристый служебный знак у стены, затем на металлический шкаф. Инвентаризация увидела незавершённое измерение и не включила временную историю в отчёт.

Через восемь секунд значок удалённого доступа погас.

Рая убрала знак.

— Теперь прибор будет держать пакет, пока калибровку не завершат или не отменят.

— До следующей проверки.

— То есть у нас меньше суток. Как ты и хотел.

Максим сохранил отчёт: он фиксировал незавершённое измерение до возможного изъятия стенда.

Они поднялись не вместе. Рая ушла первой с маршрутным модулем. Камеры уже записали достаточно.

В служебной столовой они выбрали стол без проекционной панели. Профиль Златина исчез с модуля после отключения кабеля.

— Что считается независимым слоем? — спросил Максим.

— Не каталог «Меридиана», не пакет Лидии и не твой городской архив.

— Публичный отчёт о калибровке резервного флота?

— Слишком грубый. Там будут углы по секторам, не улицы. Но нам улицы не нужны.

Максим нарисовал на салфетке две стрелки: вертикальную и повёрнутую.

— Если отчёт подтвердит историческую ориентацию сектора A12 и ширину коридора, мы сможем предсказать обе компоненты сдвига. До того как увидим карту.

— Где возьмёшь сам факт сдвига?

— В независимом подписанном отказе. Экстренные системы обмениваются не маршрутами, а причинами несовместимости при трансграничной помощи. Если рубежская машина не принимает сектор Златина, она получает величину поправки без адреса.

— Запросишь тест совместимости на смене?

— Нет. Новый тест станет новым вопросом к Златину, а мы не знаем, кому он даст право. Нужен уже существующий отказ.

Она говорила так, будто право запроса было не строкой в протоколе, а ключом от двери её дома.

— Архив учебных тревог, — сказал Максим. — Там должны быть обезличенные обмены.

— За какой период?

Он вспомнил дату появления изгиба: второе ноября 2039 года. Маркер `ЛВ-6.40`. Если профиль Златина был создан той же процедурой, первый отказ мог появиться рядом с обновлением.

— Три года назад. Неделя после второго ноября.

— Архив хранится в центре экстренной навигации. Я могу открыть его на смене. Ты не можешь войти.

— Тогда выгрузи отказ.

— И ты получишь файл, созданный мной. Не независимый слой.

Любая копия из рук Раи позволяла сказать, что они изготовили подтверждение после посмертной проверки.

— Нужен свидетель процедуры, — сказал он. — Кто-то, кто выдаст нам архив по обычному основанию и подпишет цепочку.

— Не Златина. Наш хранитель учебных тревог.

Рая впервые улыбнулась.

— Хранитель — Ян Корта. «Меридиан» обслуживает общий архив.

Максим знал это имя по подписям алгоритмов совмещения. Обратиться к Корте означало показать консорциуму, что задача Лидии пережила первый час.

На стене столовой вспыхнула новостная строка: в полдень «Меридиан» проведёт внеплановую сверку транспортных слоёв Рубежа после обнаружения неподписанного изменения. Имя автора не называли.

Максим посмотрел на часы. До сверки оставалось два часа девятнадцать минут.

— Они назвали моё изменение неподписанным, — сказал он. — Хотя журнал дал ему мою биометрию.

— Где ошибка?

— В том, что обе версии удобны. Для внутренней проверки я автор. Для публичного сообщения подписи нет. Значит, они могут выбрать виновного после того, как увидят наши действия.

Рая забрала салфетку, сложила её рисунком внутрь и опустила в стакан. Чернила расплылись двумя серыми облаками.

— Тогда не просим архив у Корты, — сказала она. — Заставляем архив ответить в штатной процедуре, которую он не сможет отменить задним числом.

— Где?

— На учениях через два часа. Для всех столиц сети публикуется проверка совместимости без адресов. Если сектор A12 даст ту поправку, которую мы уже рассчитали, у нас будет независимый слой с общей временной подписью.

— Для кого проводится проверка?

— Для машин, не для людей. Пока это самый безопасный ответ.

У Максима был пакет, предсказание величины и направления ошибки и два часа до события, способного подтвердить их независимо. Доказательство находилось не в переписываемом прошлом, а в будущем.

Но до начала учений «Меридиан» собирался сверить слой Рубежа.

Им предстояло получить независимый ответ раньше, чем исходную ошибку объявят исправленной.

Глава 3. Слепая скорая

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

Максим сидел в гостевом кресле за спиной Раи. На столе перед ним лежал временный допуск с одним разрешённым действием: присутствовать при проверке совместимости картографических слоёв. Допуск выдал дежурный координатор, не Рая. В журнале стояли имя координатора, время и основание — внеплановая сверка после неподписанного изменения. Именно то основание, которое «Меридиан» приготовил против Максима, теперь позволяло ему видеть процедуру.

— Руки на столе, — сказала Рая, не оборачиваясь.

— Я ничего не трогаю.

— Это не просьба. Камера должна видеть.

Он положил ладони по обе стороны пропуска.

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

Над архивом стояла подпись обслуживающего узла: `MERIDIAN-JK-04`.

Ян Корта был здесь, хотя его самого в помещении не было.

— Сектор A12 когда? — спросил Максим.

— В третьей серии.

— Нас могут отключить до неё.

— Могут.

— И всё?

— Ты хотел независимую процедуру. В независимой процедуре я не командую временем.

Первая серия прошла без ошибок. Во второй столица Норн отказала рубежской пожарной машине из-за массы; Златин не принял медицинский модуль Керны из-за несовместимого светового маяка. Каждая строка получала подпись города-источника, подпись города-получателя и общую временную метку. Подделать один отказ после учений означало бы переписать журналы всех участников.

На боковом экране началась внеплановая сверка Рубежа. Прямая линия улицы Жестянщиков легла поверх смещённой. Жёлтый контур назвали «обнаруженным расхождением», красный — «кандидатом на исправление».

До применения исправления оставалось одиннадцать минут.

— Они не ждут аудитора, — сказал Максим.

— Они считают, что аудитор уже внёс ошибку.

— Исправление должно быть заблокировано до разбора подписи.

— Для обычной улицы. Экстренный слой обновляется по угрозе доступности.

На стене возникла третья серия. Рубеж отправлял в Златин учебную машину без внешнего ориентира. Сначала появился сектор `A11`, затем `A12`.

Максим задержал дыхание.

Система нарисовала прямой коридор и почти сразу перечеркнула его серой диагональю.

ОТКАЗ: НЕСОВМЕСТИМАЯ ПОПРАВКА ПОЛОЖЕНИЯ.

В двух полях стояли компоненты: 5,98 и 2,27 метра. Ни адреса, ни названия улицы. Только величина, ориентация старого сектора и причина отказа.

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

— Длина? — спросила она.

Максим уже считал на бумаге, хотя ответ знал заранее.

— Шесть сорок.

— Направление?

— Историческое магнитное склонение Златина.

Рая нажала «завершить просмотр». Карточка закрылась и через общий узел ушла всем участникам учений. Они получили доказательство, созданное не Лидией, не Максимом и не Раей. Профиль из посмертного пакета предсказал подписанный отказ до его появления.

На гостевом терминале вспыхнуло уведомление: основание доступа исполнено, сеанс завершится через тридцать секунд.

Максим поднялся.

— Нам нужна квитанция.

— Она в общем архиве.

— Который обслуживает Корта.

— Уже не только там. Каждый город получил корень журнала.

Рая показала на принтер неизменяемых событий. Из узкой щели вышла полоска с номером серии, тремя отпечатками подписей и контрольной суммой. Без содержания отказа она ничего не доказывала, но позволяла позднее проверить любую предъявленную карточку.

Максим не успел взять полоску.

Все прямоугольники на стене погасли. Вместо них развернулась карта Рубежа. Красный кандидат на исправление стал зелёным.

ИЗМЕНЕНИЕ ПРИМЕНЕНО К ЭКСТРЕННОМУ КОНТУРУ.

— Одиннадцать минут не прошло, — сказал Максим.

— Сверка закончилась досрочно.

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

— Это часть учений? — спросил Максим.

— Нет.

— Где?

— Для кого, — отрезала Рая и открыла карточку вызова.

Пациент был скрыт за медицинским допуском. Видны были только класс срочности и время: подозрение на внутреннее кровотечение, допустимая задержка — шесть минут. Машина находилась в четырёх минутах от улицы Жестянщиков.

Исправленная карта вела её по прямой.

— Фактический проезд прямой, — сказал Максим. — Это же правильно.

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

Смещённая линия обходила тоннель по сервисному карману. Прямая считала ворота проездом.

— При обычной навигации машина увидит препятствие, — сказал Максим.

— Она слепая. Внешний ориентир потерян. Резервный модуль держит направление по подписанной таблице и счёту колёс.

— Водитель остановится.

— Машина беспилотная. Экипаж с пациентом в салоне.

На стене тонкая белая метка ползла к закрытому комбинату.

Рая запросила отмену автоматического исправления. Система потребовала два подтверждения: оператора экстренной навигации и владельца исправленного слоя. Своё она поставила сразу. Второе поле заполнилось именем служебного контура «Меридиана».

Запрос ушёл.

Ответ пришёл через две секунды: слой прошёл внеплановую сверку, оснований для отката нет.

— Объявляй препятствие, — сказал Максим.

— По какому источнику?

— Схема консервации.

— Она архивная. Для экстренной блокировки нужен живой датчик или два независимых сообщения.

— Там заваренные ворота.

— Карта говорит, что их нет.

Максим понял, почему Лидия оставила ошибку в геометрии, а не предупреждение. Предупреждение можно было признать устаревшим. Изгиб заставлял слепую машину физически миновать точку, которую система считала свободной.

На таймере вызова осталось пять минут двадцать секунд.

Рая связалась с машиной. Ответил медик из салона; шум колёс размывал слова.

— Переведите модуль в ручной режим, — сказала она.

— Управление снаружи, — ответил медик. — Кабина опечатана, мы в лечебном отсеке.

— Выполните аварийную остановку.

— У пациента падает давление. После остановки перезапуск займёт четыре минуты.

Рая закрыла микрофон ладонью.

— Остановим — не успеют.

— Не остановим — войдут в ворота.

— Где объезд?

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

— Здесь, — сказал он.

— Там нет дороги.

— В дорожном слое нет. Кабель повторяет изгиб. Иначе его проложили бы прямо.

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

Машина вошла в последний прямой участок. До ворот — семьсот метров.

— Подай временное препятствие перед тоннелем, — сказал Максим. — Не утверждай, что ворота существуют. Укажи конфликт геометрии.

— Конфликт уже исправлен.

— Между слоями. Дорожный ведёт прямо, коммунальный изгибается. Для машины это неопределённость покрытия.

— Нужна измеримая величина.

Он положил рядом полоску учений. В отказе Златина было то, что система только что объявила ошибкой: вектор длиной 6,40 метра. Независимая подпись доказывала, что такая поправка является действующим правилом совместимости, а не испорченной линией Максима.

— Прикрепи отказ.

— Златин не Рубеж.

— Но операция общая. Если два подписанных слоя расходятся на величину действующей межстоличной поправки, автоматическое исправление нельзя считать достовернее обоих.

Рая посмотрела на него, затем на белую метку.

— Это не откатит маршрут.

— Заставит модуль запросить выбор.

Она создала событие «неопределённость поверхности», добавила отпечаток отказа и две геометрии — прямую дорожную и изогнутую коммунальную. Система приняла событие, но присвоила низкий приоритет.

До ворот — четыреста метров.

— Недостаточно, — сказала Рая.

Максим увидел на схеме узкую поперечную линию перед тоннелем. Она не относилась ни к дороге, ни к воротам. Это была граница старых систем координат: внутри комбината высоты считались от заводского нуля.

— Смена высотной системы.

— Что?

— Резервный модуль должен подтвердить переход между вертикальными основами. После исправления точка перехода оказалась за воротами, но коммунальный слой оставил её здесь.

Рая добавила конфликт высоты. Теперь два независимых слоя требовали разных действий в одной точке. Янтарная метка машины стала красной.

ТРЕБУЕТСЯ ЛОКАЛЬНОЕ РЕШЕНИЕ ОПЕРАТОРА.

Поле владельца маршрута открылось на восемь секунд.

Рая выбрала изгиб коммунального кабеля.

Метка дрогнула, будто машина на карте задумалась, затем ушла с прямой. Медик в салоне вскрикнул: корпус резко накренился. На экране скорость упала, но не до нуля.

— Покрытие есть, — сказал медик. — Идём вдоль ограды. Вижу свет впереди.

Белая точка обогнула запечатанный тоннель и вернулась к основному проезду. Расчётное прибытие выросло на сорок три секунды.

Рая держала канал открытым, пока медик не подтвердил передачу пациента бригаде у временного входа. Только после этого она опустила руки.

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

— Кто назначил машине резервный режим? — спросил Максим.

Рая открыла цепочку событий. Внешний ориентир исчез не из-за поломки. За тридцать секунд до выезда машина получила обязательную учебную конфигурацию. Её включили в межстоличную проверку как свободную единицу, а затем не сняли флаг, когда поступил настоящий вызов.

— Ошибка учений, — сказала Рая без уверенности.

— И совпадение по времени с исправлением?

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

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

— Пациент был приманкой? — спросил Максим.

— Вызов настоящий. Медицинские показатели подписаны прибором.

— Значит, использовали не пациента. Использовали ожидаемое решение системы.

Исправление выглядело неизбежным: аудитор обнаружил смещённую улицу, «Меридиан» объявил её неподписанной, экстренный контур вернул линию на место. Любой добросовестный специалист сделал бы то же самое. После этого оставалось дождаться машины без внешнего зрения.

Максим раскрыл автора досрочного применения. Вместо имени стоял автоматический приоритет доступности. Но правило приоритета изменили сегодня в 11:41 — за минуту до начала внеплановой сверки.

Под изменением была подпись `MERIDIAN-JK-04`.

Рая молча распечатала вторую полоску. На ней были время, отпечаток правила и подпись узла Яна Корты.

— Где оригинал? — спросил Максим.

— В общем архиве.

— Для кого?

Она впервые не ответила своей формулой.

На боковом экране зелёное исправление улицы Жестянщиков получило отметку «успешно проверено реальным маршрутом». Система приняла объезд, созданный Раей, не как опровержение прямой линии, а как локальное вмешательство оператора. Для всех следующих машин тоннель оставался открытым.

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

— Это не попытка скрыть ошибку, — сказал он. — Им нужно, чтобы её исправляли.

Рая посмотрела на прямую линию, заканчивавшуюся в запечатанных воротах.

Кто-то построил ловушку не на неверной карте.

Ловушкой была уверенность, что карту исправили.

Глава 4. Подпись наставницы

Первую квитанцию Максим спрятал в футляр от механического карандаша. Вторую сложил вдоль строки контрольной суммы и прижал к внутренней стороне ремня.

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

На стенах ещё шли учения. Города обменивались отказами, мосты выдерживали чужие машины только на экране, операторы спорили о высоте и массе. Но гостевые терминалы вокруг Максима и Раи уже погасли. Над выходом загорелось белое кольцо служебной изоляции.

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

— Сохранение, — повторила Рая. — Значит, сейчас их изымут.

У её принтера раскрылась нижняя панель. Ролик втянул оставшийся хвост бумаги, лоток опечатался. Два техника в серых жилетах вошли с разных концов зала. На груди у обоих был знак «Меридиана»: четыре линии, сходившиеся в одну.

На экране слепой скорой осталась только зелёная отметка «доставлено».

К ним подошёл старший техник.

— Ладин Максим Сергеевич?

— Да.

— Ваш гостевой ключ использован для предъявления неподтверждённой геометрии в контуре медицинского приоритета. Передайте носитель проверки и все полученные отпечатки событий.

— На каком основании? — спросил Максим.

— Совместное расследование оператора сети и консорциума.

— Номер события?

Техник показал планшет. Номер был, но категория стояла не транспортная и не медицинская: «нарушение целостности обучающей среды». Такая категория позволяла «Меридиану» собирать оборудование. Она не давала права забирать независимые квитанции городов.

— Мой носитель не подключался к вашей среде, — сказал Максим.

— Тогда его передача быстро это подтвердит.

Рая шагнула ближе.

— Вмешательство выполнила я с рабочего терминала. Ключ Ладина предъявлялся только для чтения отказа Златина.

— Ваш доступ будет рассмотрен отдельно.

На планшете техника появилось новое окно. Максим увидел своё имя, срок сдачи носителя — немедленно — и поле подписи.

— Если я откажусь?

— Ваш аудиторский допуск приостановят до выяснения. Все действия, совершённые этим ключом за последние тридцать дней, будут считаться непроверенными.

Тридцать дней означали десятки принятых слоёв. Если снять с них его подпись, города либо остановят обновления, либо переподпишут всё через «Меридиан».

— Носитель в моей мастерской, — сказал он.

— Адрес известен.

Техник знал, что Максим лжёт, но не стал ловить его. Он повернул планшет экраном вниз.

— У вас сорок минут. После этого доступ будет закрыт автоматически.

Белое кольцо над дверью погасло. Они вышли вместе с операторами. Рая молчала, пока камеры могли читать лица.

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

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

— Доступ одноразовый? — спросила Рая.

— Теперь да.

— Удобно.

— Не для меня.

За стеклом стояли четыре серых шкафа. Дежурная подняла глаза от бумажного журнала.

— Сетью не пользуемся, изображения не принимаем, запросы не сохраняем, — произнесла она. — Проверка по отпечатку или по пластине?

— По отпечаткам и переносному ключу.

— Содержимое ключа мне показывать не надо.

Максим положил на стойку футляр от карандаша. Выкатил первую квитанцию, разгладил. Вторую достал из-под ремня. На сгибе одна цифра побледнела, но контрольные прорези по краям не повредились.

Дежурная провела обе полоски через оптическую рамку.

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

— Время изменения?

— Подтверждено в пределах окна доставки.

— Можно точнее?

— Можно, если предъявите соседнее событие из той же цепочки.

Максим вынул старый геодезический модуль Лидии. На корпусе оставалась царапина в виде короткой белой дуги.

Дежурная не взяла прибор.

— Сами вставляйте. Если там исполняемая процедура, шкаф её не запустит.

В боковой панели открылся узкий порт. Максим подключил модуль. На матовом стекле возникли три строки без названий:

КЛЮЧ ИЗДАТЕЛЯ: ДЕЙСТВОВАЛ.

ЦЕПОЧКА: НЕ РАЗОРВАНА.

ВРЕМЯ ПОДПИСИ: ДОПУСТИМО.

Он ждал четвёртой строки.

— Что именно вы проверяете? — спросила Рая.

— Что пакет действительно подписала Лидия.

— Ты сомневался?

— Система, которая предъявляет доказательство, не должна сама подтверждать его подлинность.

Максим выбрал сравнение с городским корнем. Шкаф загудел, перебирая пластины. Появилась дата ключа Лидии, затем дата отзыва.

— Вот, — сказала Рая. — Отозван после смерти. Всё сходится.

— Не всё.

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

Матовая поверхность очистилась.

ПРАВИЛО ПОДПИСАНО: 03.04.2042, 19:16:08.

Лидия погибла третьего апреля в 22:40. Максим помнил цифры из заключения транспортного следователя.

— Подлинная, — сказал он.

Рая кивнула.

Ниже появилась следующая строка.

СОБЫТИЕ СОЗДАНО: 04.04.2042, 00:12:51.

Между официальным временем смерти Лидии и созданием события прошло час тридцать две минуты.

Максим выбрал другой, городской корень. Цифры не изменились.

— Отложенная публикация, — сказала Рая.

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

— Значит, подпись перенесли.

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

Дежурная за стойкой перелистнула страницу журнала. Она не прислушивалась или умела выглядеть так, будто не прислушивается.

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

— Она подписала не сообщение, — сказал Максим. — Она подписала условие.

— До смерти.

— Да. А условие исполнилось после.

Он вспомнил первое сообщение пакета: объект нужен для проверки права запроса, а не существования дороги. Тогда фраза показалась объяснением странной геометрии. Теперь она звучала как инструкция механизму. Лидия заранее не знала, кто откроет пакет и когда. Она знала, какое действие в системе должно его создать.

Рая указала на вторую квитанцию.

— Можно проверить, не изменение ли правила Корты было причиной?

Максим приложил её к рамке. Шкаф сравнил отпечатки и выдал отрицательное совпадение. Событие Лидии возникло не сегодня. Причина находилась в ночи после её смерти.

— Что произошло в ноль двенадцать? — спросила Рая.

— Первый автоматический пересчёт после закрытия расследования на месте аварии.

— Ты уверен?

— Я был в управлении. Мы ждали, пока транспортная сеть снимет временный запрет. В ноль двенадцать система приняла объезд как постоянную геометрию.

Лидия погибла на автоматическом такси у набережной. Машина ушла с назначенного коридора и столкнулась с ремонтной платформой. Следствие назвало причиной ошибку локального позиционирования. После осмотра участок пересчитали и объявили безопасным.

— Пакет появился не потому, что Лидия умерла, — сказал он. — Он появился, когда её маршрут исправили.

— Почему получил его ты?

— Потому что подписал последний аудит этого сектора.

Рая смотрела на него внимательно, без жалости. Это было лучше жалости.

— Значит, она знала, что после аварии ты проверишь исправление.

— Она знала, что система выберет последнего аудитора. Не обязательно меня.

— Но выбрала правило так, чтобы подошёл ты.

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

На модуле загорелся красный край. До истечения срока проверки оставалось двадцать минут.

Сверху донёсся удар двери. Потом ещё один.

Дежурная подняла трубку внутренней связи, послушала.

— К вам представитель владельца ключевой инфраструктуры, — сказала она. — Утверждает, что переносной ключ скомпрометирован.

— Он назвался?

— Арсен Миров.

Рая тихо выдохнула.

— Быстро.

— Он не мог знать, где реестр, — сказал Максим.

Дежурная посмотрела на проколотую карточку в его руке.

— Реестр один. Знать надо было только, что вы захотите независимой проверки.

Миров вошёл без охраны и остановился по другую сторону стойки.

— Максим Сергеевич, — сказал он. — Сегодня вы спасли людей. Именно поэтому я хочу закончить это без обвинений.

— Обвинение уже выписали. Нарушение обучающей среды.

— Временная формулировка. Её можно снять.

— Передайте ключ проверки, — сказал он. — Мы сохраним цепочку и проведём разбор вместе с городом.

— Ваш узел изменил правило до окончания сверки.

— Иначе скорая осталась бы на маршруте, который аудит признал ошибочным.

— Ваше исправление вело в запечатанный тоннель.

— Из-за конфликта старого промышленного слоя. Конфликт уже локализован.

— Машину перевели в слепой режим до вызова.

На этот раз Миров ответил не сразу.

— Учения затронули резервный флот. Это серьёзная процедурная ошибка. Ян Корта отстранён от операционного доступа до выяснения.

— Почему событие Лидии создано после её смерти? — спросил он.

Миров посмотрел на матовое стекло. Время там ещё оставалось.

— Отложенные подписи законны.

— Я не спрашивал, законны ли они.

— Лидия строила условные процедуры. Без единого контроля старое право можно предъявить в новой ситуации.

— Как вы узнали, что ключ у меня?

— Система сообщила о неизвестной процедуре, когда вы предъявили отказ Златина.

Это не отвечало на вопрос. Отказ предъявила Рая с рабочего терминала. Ключ Максима только открывал пакет, не входя в контур учений.

— Вы знали раньше, — сказал он.

Миров положил ладони на стойку.

— Я знал, что Лидия оставила незакрытую цепочку. Не знал, кому она достанется. Передайте модуль: ваш допуск восстановят, а Рая не потеряет работу.

— А если не передам?

— Тогда я обязан считать каждое такое событие угрозой городской инфраструктуре.

— Даже если оно спасает скорую?

— Особенно если спасает. Люди доверяют удачному исключению и начинают повторять его без понимания границ.

Миров действительно боялся карт, которые нельзя свести в одну. Для него неизвестное правило было неисправностью, ожидающей владельца.

— Дайте мне копию цепочки и письменное обязательство независимой проверки, — сказал Максим.

— Копия раскроет устройство условия.

— Не условие. Последовательность корней.

— Даже последовательность может указать на защищённые слои.

— Тогда вы просите доверить единственное доказательство стороне, чей узел подписал сегодняшнее изменение.

— Я прошу выбрать работающий город вместо личной верности погибшему человеку.

Максим вспомнил вопрос Лидии на полях его отчётов: «Кто сможет проверить это без нас?»

Ключ содержал не приказ и не координаты, а проверку. Отдать его означало оставить только утверждение «Меридиана», что всё исправлено.

Максим вынул модуль из порта.

— Нет.

Миров не переспросил.

— В таком случае ваш допуск будет приостановлен.

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

— А доступ Раи? — спросил он.

— Зависит от того, участвовала ли она в сокрытии ключа.

Рая повернулась к Максиму.

— Я участвовала.

— Я не просил.

— Поэтому и участвовала.

Она забрала квитанции. Первую вернула в футляр, вторую вложила в бумажный журнал.

Дежурная закрыла журнал ладонью.

— Запросы не сохраняем, — напомнила она. — Оставленные посетителями предметы выдаём только по номеру страницы. Номер я не записываю.

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

— Вы выиграли несколько часов, — сказал он. — Не больше.

— Иногда городу хватает сорока трёх секунд, — ответила Рая.

Миров ушёл первым. Его шаги стихли на лестнице, но Максим не торопился. Он снова подключил модуль, не запуская процедуру, и попросил реестр напечатать только допустимый срок следующего предъявления.

Шкаф выдал короткую ленту.

СЛЕДУЮЩЕЕ УСЛОВИЕ: ВНЕШНЕЕ СОБЫТИЕ.

ОКНО: 06:00:00.

Ни места, ни адреса. В нижнем углу стоял код носителя, которого у них не было: `TAV-0`.

— Тимур Авет, — сказала Рая. — Курьер нулевого слоя.

Максим сложил ленту. Шесть часов были не отсрочкой, а расстоянием, выраженным временем. Где-то человек нёс следующий элемент цепочки, а «Меридиан» уже знал, что Максим отказался отдать ключ.

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

Глава 5. Курьер нулевого слоя

На поиск Тимура Авета оставалось пять часов сорок одна минута.

Максим набрал его имя на отключённых часах и показал Рае. Она покачала головой.

— В сети искать нельзя. Миров увидит запрос раньше результата.

— Я и не ищу человека. Мне нужен код `TAV-0`.

В пустом читальном зале перед ними лежала лента со следующим условием: шесть часов, внешний носитель, три буквы и ноль.

— Нулевой слой не существует, — сказала Рая. — Есть дорожный, адресный, коммунальный, мобильность. Ноль — основание координат.

— Или то, что перевозят до внесения в любой слой.

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

Он попросил у дежурной бумажный каталог допусков. В нём не было имён, только классы и способы подтверждения. Код `TAV` относился к транзитной аналоговой верификации. Ноль означал груз без цифрового описания.

— Бумага, — сказала Рая.

— Или плёнка.

— Где её принимают?

Каталог перечислял пять окон в Рубеже. Четыре работали по расписанию. Пятое открывалось внешним событием, без адреса получателя, и сегодня имело шестичасовой допуск.

Окно находилось на Центральном вокзале.

Они поднялись наверх. У выхода карточка Максима снова не сработала: приостановленный допуск запер его внутри так же надёжно, как не впустил бы снаружи. Дежурная вручную повернула рычаг.

— Вы ничего здесь не проверяли, — сказала она. — Но второй раз я дверь не открою.

— Почему помогаете?

— Не помогаю. Исправляю ошибку доступа.

Рая улыбнулась ей и вышла следом.

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

— Что ты знаешь об Авете? — спросил он.

— Продаёт скорость, не личности.

— Это рекомендация или обвинение?

— Тариф.

Тимур возил спорные слои ещё до «Меридиана». За срочность брал втрое дороже, зато не объединял записи об отправителе и получателе: половину маршрута хранил на бумаге, половину — в памяти.

— Удобный человек для Лидии.

— Неудобный для всех. Поэтому ещё работает.

Старое здание Центрального вокзала обслуживало багаж, почту и международные вагоны, чьи системы не всегда соглашались с картой Рубежа.

Окно передачи Максим нашёл по каталожному признаку: рядом хранились часы, не синхронизированные с городом. Они отставали на семь минут и не имели подписи сети.

Под ними стояли камеры хранения с механическими циферблатами.

— Номера нет, — сказала Рая.

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

Он повернул циферблат на шесть часов. Дверца открылась.

Внутри лежал пустой металлический пенал и билет на ночной поезд до Керны. Место не было указано. Вместо него на билете стояло: «вагон меняет масштаб».

— Загадка? — спросила Рая.

— Инструкция, которую нельзя исполнить в навигаторе.

На схеме вагоны удлиняли ради номеров, на табло укорачивали ради всего состава, а пожарный план сохранял точный масштаб.

Максим наложил билет поочерёдно на три схемы. Прорези по краю указали один и тот же вагон только на пожарном плане — старый почтовый, отцепленный у тупиковой платформы.

— Три масштаба, — сказала Рая. — Уже начинается.

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

— Вход запрещён, — сказал контролёр.

— Мы встречаем курьера аналоговой верификации.

— Фамилия?

Рая ответила раньше:

— Для кого?

Контролёр нахмурился.

— Что?

— Курьер сам назовёт получателя.

За спиной контролёра раздался голос:

— Неправильно. Получатель называет последнюю ошибку отправителя.

Мужчина в короткой жёлтой куртке сидел на багажной тележке. Под левым глазом тянулся старый шрам; в руках он вертел жестяную чайную коробку.

— Какая ошибка? — спросил Максим.

— Если не знаете, я жду другого.

Максим мог назвать 6,40 метра и слепую скорую, но это уже видел «Меридиан».

Он достал модуль. Белая дуга на корпусе была не случайной царапиной. Рядом находились две едва заметные прямые риски от циркуля. Лидия носила его не из привычки. Она проверяла радиус.

— Дуга вместо хорды, — сказал Максим. — Она каждый раз оставляла на корпусе дугу, а в отчёте записывала прямую.

Мужчина перестал вращать коробку.

— Максим Ладин. А это?

— Рая Сокол.

— Я спрашивал, для кого она.

— Для тех, кого скорая должна находить без постоянного адреса, — сказала Рая.

Тимур Авет спрыгнул с тележки.

— Тогда быстро.

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

— Что вы видите? — спросил он.

— Неправильную тару весов, — сказал Максим.

— А картограф?

Максим присмотрелся. Под стеклом лежали три полукруглые шкалы: килограммы, допустимая нагрузка старых вагонов и почтовый тариф. Они начинались из одной точки, но расходились по длине. Стрелка пересекала три разных значения.

— Один груз, три способа измерить последствия.

— Лидия сказала бы: три правды, ни одной массы.

Тимур открыл двойное дно коробки и вынул свёрнутую кальку, перевязанную серой нитью.

— Я получил её от Ветлиной за девять дней до аварии. Условие передачи пришло сегодня.

— От кого?

— Условия не имеют лиц.

— Вы знали о её смерти.

— Знал. Поэтому проверил подпись дважды и пришёл лично.

Максим не взял кальку.

— Что случилось при первой попытке передачи?

Тимур посмотрел на него с одобрением.

— Наконец правильный вопрос. Вчера человек с городским допуском пришёл раньше условия. Назвал вашу фамилию и ошибку 6,40. Когда я отказал, попытался забрать пенал. Упал на путях, когда убегал.

— Он жив?

— Встал сам. Лица я не видел.

— Почему не сообщили?

— Кому? Сеть назвала бы это спором о багаже. А тот, кто прислал его, получил бы мой адрес.

Рая выглянула из будки. На платформе контролёр разговаривал с двумя людьми в обычных тёмных пальто. Серые жилеты были бы честнее.

— Передавайте, — сказала она.

Тимур положил кальку на стекло весов. Максим развернул её только наполовину. На прозрачном листе были нанесены контуры трёх городов — Рубежа, Златина и Керны. Масштабная линейка у каждого утверждала одно и то же значение. Однако улицы не совпадали по толщине, кварталы расползались, береговые линии пересекали друг друга.

— Испорченная печать, — сказала Рая.

— Нет, — ответил Максим. — Три исходных масштаба.

Он приложил квитанцию Златина к краю листа. Её контрольные прорези совпали с метками вокруг второго контура. Для Рубежа подходила лента из реестра. Третья группа меток ожидала ещё один отпечаток.

Если привести города к одному масштабу, метки разойдутся. Калька проверялась только в исходном несовпадении. Ошибка была не дефектом изображения, а замком.

— Ключ показывает, как не надо совмещать карты, — сказал Максим.

— Забирайте, — ответил Тимур. — И уходите разными выходами.

В дверях весовой будки появился контролёр.

— Господин Авет, ваша курьерская лицензия требует проверки.

Тимур свернул кальку одним движением, но не отдал Максиму. Снаружи второй человек уже закрывал проход к залу. Третий стоял у конца платформы. На их одежде не было знаков «Меридиана».

— Номер проверки? — спросил Тимур.

Контролёр протянул планшет. Тимур даже не взглянул.

— Бумажный груз проверяют бумажным предписанием.

— Цифровая копия равнозначна.

— Для описанного груза.

Он захлопнул дверь будки и опустил внутренний засов. Снаружи ударили один раз — не пытаясь открыть, а проверяя прочность.

— Задний выход? — спросила Рая.

— Весы.

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

— Куда ведёт?

— В багажный коридор.

— На карте он есть? — спросил Максим.

— На трёх. И на всех разный.

Тимур отдал кальку Максиму, поднял люк и пропустил Раю первой. За дверью снова ударили. На этот раз дерево треснуло у замка.

Максим убрал кальку под рубашку и полез следом. Внизу двигалась пустая лента транспортёра. Они спрыгнули на неё, затем на бетонный пол. Тимур закрыл люк над головой.

Багажный коридор уходил в обе стороны. Свет горел через одну лампу. Рая открыла служебную схему на часах, но план показал прямой проход до западного выхода.

— Не верь ему, — сказал Тимур. — Стену перенесли при расширении платформы.

— Когда?

— Двенадцать лет назад.

— Почему не исправили?

— Исправили. В пассажирском слое.

Он повёл их вправо, к тупику на экране. За поворотом оказалась решётчатая дверь и лестница вниз. Максим услышал шаги сверху. Преследователи разделились: один остался у будки, двое искали вход в багажную зону.

— Они хотят кальку или вас? — спросил Максим.

— Вчера — груз. Сегодня уже свидетеля.

— Свидетеля чего?

Тимур не ответил.

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

— Утечка есть? — спросил Максим.

Рая втянула воздух.

— Датчики молчат. Событие без измерения.

— Значит, закрывают выходы по нашему движению.

Сверху послышались голоса. Тимур дёрнул дверь ещё раз и выругался.

— Отдайте кальку, — сказал Максим. — Они пойдут за мной.

— Уже отдал. Назад груз не принимаю.

— Тогда расходимся.

— Поздно.

В конце коридора загорелись ручные фонари. Двое шли без спешки, перекрывая ширину прохода. Один поднял ладонь.

— Господин Авет, останьтесь на месте. Ладин и Сокол могут уйти после передачи носителя.

— Врёте плохо, — сказал Тимур. — Они уже с носителем.

Рая толкнула решётку плечом. Магнит держал.

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

— Здесь был грузовой подъёмник, — сказал он.

— Был, — ответил Тимур. — Шахту закрыли.

— Дверь магнитная после ремонта. Откуда питание?

Рая поняла первой. Она провела рукой по стене и нашла короб старой подъёмной линии. Аварийное отключение не открывало все двери вокзала — только локальный противопожарный отсек. Максим не стал спрашивать, как именно устроена система. Рая сорвала пломбу и нажала крупную красную пластину.

Свет погас. Магнит отпустил решётку.

Одновременно остановилась багажная лента. Где-то наверху включилась сирена локального отсека. Это не было тревогой всего вокзала, только честным сообщением: один участок потерял питание.

— Вниз, — сказала Рая.

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

Лестница вывела к закрытой шахте подъёмника. Прохода дальше не было.

— Ты сказал, здесь выход, — бросила Рая Тимуру.

— Двенадцать лет назад был.

Над ними скрипнула решётка.

В стене шахты зияло сервисное окно, слишком высоко для прыжка. Тимур подкатил брошенную грузовую платформу. Колёса не держали тормоз; платформа уходила по наклонному полу.

Максим и Рая навалились на неё, Тимур полез первым. В этот момент сверху появился луч фонаря. Человек на лестнице ускорился.

— Стойте! Внизу опасная зона!

Тимур дотянулся до окна. Платформа качнулась. Максим почувствовал, как из-под ладони уходит металл.

— Держу, — сказала Рая.

— Не удержишь одна.

— Поднимай его.

Максим толкнул Тимура снизу. Курьер перевалился через край окна, но его нога соскользнула между платформой и стеной. Раздался сухой удар. Тимур вскрикнул и повис на руках.

Луч фонаря остановился на них.

Преследователь уже спускался к шахте. Второй остался у решётки, перекрывая обратный путь.

Максим мог забраться в окно следующим. Калька и модуль были у него. За сервисным окном темнел коридор, достаточно узкий, чтобы уйти от погони. Тимур оставался с зажатой ногой, Рая — у катящейся платформы.

— Отдайте носитель и отойдите, — сказал человек с фонарём. — Курьеру окажут помощь.

Тимур коротко рассмеялся, не поднимая головы.

— Сначала груз, потом свидетель.

Платформа сдвинулась ещё на ладонь. Рая упёрлась коленом в раму, но колёса продолжали вращаться.

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

Но карта не отвечала, кого он оставит по другую сторону.

Он убрал кальку обратно и шагнул не к окну, а к зажатой ноге Тимура.

— Рая, держи платформу. Вытащим его вместе.

Глава 6. Цена точности

Нога Тимура оставалась зажатой между рамой грузовой платформы и стеной шахты. Платформа медленно ползла вниз по уклону, и каждое движение переносило её вес с бедра на голень.

Максим сунул кальку за пазуху и присел у колеса.

— По команде отпустишь, — сказал он Рае.

— Она уедет.

— На пол-оборота.

Человек с фонарём спустился ещё на три ступени. Его напарник остался наверху, у решётки. Они не торопились: шахта заканчивалась стеной, а единственное сервисное окно висело над головами.

— Не усугубляйте, — произнёс первый. — Медицинская группа уже вызвана.

Рая посмотрела на часы.

— Вызова нет.

— Он зарегистрирован внутренней службой.

— Тогда назовите маршрут прибытия.

Мужчина промолчал.

Максим провёл пальцами по раме. Старый тормоз был снят, но на оси сохранился квадратный паз под ручную рукоять. Рукояти рядом не было. Зато над платформой висела цепь, когда-то удерживавшая дверцу подъёмника.

— Тимур, чувствуешь стопу?

— Чувствую, что она решила жить отдельно.

— Пальцы?

— Два. Может, три.

Луч фонаря опустился на руки Максима.

— Отойдите от пострадавшего.

Максим снял с шеи шнурок с латунным жетоном приостановленного аудитора. Узкий край вошёл в паз оси. Для рычага жетон был слишком коротким, но цепь могла добавить усилие. Он продел её через отверстие и обмотал вокруг ладони.

— Рая, когда потяну — толкни платформу вверх. Потом отпусти.

— Ногу вытащить не успеем.

— Успеем изменить точку опоры.

Тимур приподнялся на локтях.

— Авет, — сказал Максим, — на счёт два повернёшь колено к стене.

— Оно не поворачивается.

— Значит, ты — на счёт один.

Мужчина с фонарём шагнул с лестницы на пол шахты.

— Последнее предупреждение.

Рая навалилась на платформу. Максим рванул цепь. Латунь впилась в паз и согнулась; колесо повернулось назад на несколько сантиметров. Тимур дёрнул ногу. Ботинок остался между рамой и стеной, зато сам он перекатился к сервисному окну.

Платформа ушла вниз и ударила преследователя краем. Не сильно — тот успел отступить, — но фонарь выпал и закрутился по полу. Свет полоснул по шахте.

— Наверх! — сказала Рая.

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

Рая полезла следом. Максим остался последним. Согнутый жетон застрял в оси; он дёрнул цепь, но латунь не вышла.

Снизу поднялся человек, потерявший фонарь.

Максим отпустил цепь и прыгнул к окну. Рая втащила его за ворот. За спиной преследователь схватился за край проёма, но Тимур ударил створкой сервисного люка. Старая защёлка не закрылась. Они вчетвером — трое бегущих и один догоняющий — оказались в узком кирпичном коридоре.

Тимур попробовал встать и сразу осел.

— На меня, — сказала Рая.

Она подхватила его справа, Максим — слева.

Коридор расходился буквой «Т». На стене висела новая эвакуационная схема: короткий путь вёл налево, к служебному двору. Справа находилась зачёркнутая дверь старой сортировочной.

— Налево, — сказал Тимур сквозь зубы.

— Там они нас ждут, — ответил Максим.

— Но там выход.

Максим достал кальку и приложил её к схеме. Лист был рассчитан не на вокзал, однако прорези квитанции Рубежа совпали с угловыми метками рамки. Под городскими контурами проступил слабый технический рисунок — не маршрут, а сетка контрольных расстояний.

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

— Когда закрыли сортировочную? — спросил Максим.

— После реконструкции почтового узла.

— До переноса стены или после?

— Это два разных ремонта.

Шаги приближались. Преследователь уже выбрался из окна.

Максим повёл их вправо.

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

— Тележечная створка. Её не внесли в пассажирский план.

— Внесли, — сказал Максим. — Потом решили, что закрытая дверь равна отсутствующей.

Они потянули кольцо. Панель отступила и повернулась на скрытой оси. За ней пахло мокрой бумагой и холодным железом.

Рая пропустила Тимура, затем Максима и стала закрывать створку. В коридоре показался луч второго фонаря.

— Ладин! — крикнул мужчина. — Ваш жетон у нас. Дальше будет не спор о носителе.

Максим помог Рае дотянуть тяжёлую панель. Кирпичная плоскость встала на место, отрезав свет.

— Уже не спор, — сказал он.

В сортировочной было темно. Рая приглушила экран часов. Тимур сел у стены и ощупал голень.

— Перелома не чувствую. Связки или трещина.

— Сам не пойдёшь, — сказала Рая.

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

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

— Выход есть в обеих версиях, — сказал Максим. — Не совпадает подход.

Тимур вынул из кармана две смятые багажные квитанции.

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

— И приведёт их к нам.

— Если открыть его здесь.

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

На двух планах ближайшими были разные двери.

— Можно показать движение слева, — сказал Тимур. — Они пойдут к служебному двору.

— Там может быть охрана.

— Охрана увидит пустую тележку.

Рая покачала головой.

— Не только охрана. Если метка попадёт в общий слой, она станет частью эвакуационного журнала. Ложное направление во время локальной тревоги — обвинение.

— Тревога настоящая, — сказал Максим. — Отсек потерял питание.

— Направление будет ложным.

— Ограничим метку одним грузовым контуром, — сказал Максим. — Без пассажирских дверей и без экстренных служб. Один ложный поворот, после него маршрут погаснет.

— Ты не знаешь, погаснет ли.

— Поэтому не буду трогать сеть.

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

Рая наблюдала за ним.

— Если они проверят привод, увидят ручное вмешательство.

— Увидят.

— И твой жетон в шахте.

— Тоже увидят.

— Максим, это уже не ошибка старой карты. Это твоя.

За кирпичной створкой заскребли металлом. Преследователи нашли кольцо.

Тимур попытался подняться, но побледнел и снова сел.

Максим взялся за трос.

Он вспомнил отчёт об отцовской карте: красную рамку, подпись эксперта, слово «устранено». Тогда ему казалось, что ошибка либо исправлена, либо нет. Но прямая линия не несла на себе тех, кого бросали ради неё.

— Моя, — согласился он.

Трос шёл тяжело. Где-то за стеной повернулся указатель.

На часах Раи возникла серая служебная отметка: движение груза к западному двору. Система достроила путь по новому плану и направила метку налево от шахты — в противоположную сторону.

Снаружи прекратили ломать створку.

— Западный двор, — сказал один голос. — Оставь здесь датчик.

Шаги удалились не сразу. Затем кирпичная панель перестала дрожать.

— Они не оба ушли, — сказала Рая.

— Нам хватит одного.

Старая схема вела из сортировочной через помещение сканирования. Максим и Рая снова взяли Тимура под руки. Курьер считал вдохи: четыре коротких, один длинный.

В конце зала нашлась дверь без ручки. Рядом тянулся выключенный конвейер. По новому плану дверь открывалась в помещение сканирования; по старому — в карман между двумя стенами.

Максим измерил проём квитанцией. Шесть коротких прорезей и одна длинная. Та же последовательность, что открыла камеру хранения. Длинная прорезь приходилась не на дверь, а на край конвейера.

Он надавил на защитный кожух. Тот отошёл, открывая узкий проход вдоль ленты.

— Дверь нарисовали для людей, — сказал он. — Проход оставили для механизма.

Они протиснулись боком. Тимура пришлось посадить на неподвижную ленту и протащить несколько метров. За перегородкой гудело действующее оборудование. Сквозь матовое стекло двигались тени сотрудников вокзала.

Рая остановилась.

— Камеры возьмут лица, — сказала Рая.

— Они уже знают лица, — ответил Тимур. — Им нужна калька.

На часах Раи служебная метка мигнула красным. Западный двор не подтвердил груз. Система собиралась вернуть маршрут к последней точке считывания.

— Сколько? — спросил Максим.

— Меньше минуты.

В проходе позади стукнул металл. Оставшийся преследователь открыл кирпичную створку.

За прозрачной дверью сотрудница раскладывала ручную кладь. Рая постучала. Женщина увидела Тимура и открыла.

Дверь открылась.

— Что случилось?

— Травма в закрытом отсеке, — сказала Рая. — Нужен медик и бумажная регистрация свидетелей.

— Почему бумажная?

— Цифровой маршрут уже содержит спорную отметку, — сказал Максим.

Сотрудница вызвала начальника смены и достала из шкафа красный журнал происшествий. Максим записал фамилии троих, время выхода и состояние Тимура. В графе «причина отклонения» он написал: «Ручное изменение грузового указателя для отвлечения преследования; пассажирские и экстренные контуры не затронуты».

Рая прочитала и поставила подпись рядом.

— Так ты отдаёшь им обвинение раньше, чем объяснение.

— Зато они не смогут назвать ошибку случайной и присвоить её Лидии.

Тимур забрал ручку.

— И курьер подтверждает угрозу.

Он расписался неровно, с нажимом на последней букве.

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

— Этот человек похитил служебный носитель, — сказал он.

— Какой носитель? — спросила начальница смены.

Мужчина посмотрел на Максима, затем на Тимура.

— Материал внутренней проверки.

— Номер описи?

— Предписание направлено в систему.

Начальница положила ладонь на красный журнал.

— Здесь система временно не является единственным источником. Ждите транспортную безопасность.

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

С противоположной двери вошли двое медиков с мягкими носилками. Тимура уложили, зафиксировали ногу. Рая настояла, чтобы в маршрут помощи внесли не адрес назначения, а номер бумажного происшествия. Медики приняли его как временную точку передачи.

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

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

Рая догнала его у санитарного фургона.

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

— Пассажирский контур не затронут.

— В заголовке этого нет.

— Значит, сохраним доказательство ограничения.

Она показала экран. Под красным обвинением оставалась бледная строка: «область действия — один механический грузовой указатель». Через несколько минут подробность могла исчезнуть из сводки, как исчезали пять делений старого вокзала.

Максим достал квитанцию и прижал к экрану, сверяя положение строки с прорезью. Потом Рая сделала фотографический отпечаток в бумажном журнале медиков. Доказательная цепочка уже не была чистой: один её конец держался на их собственном вмешательстве. Зато Тимур лежал в фургоне, живой, а калька оставалась у них.

— Раньше ты бы исправил отметку, — сказала Рая.

— Раньше я бы ушёл через окно.

Тимур приподнялся на локте.

— И был бы очень точным человеком с бесполезным ключом.

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

Система уже предлагала исправить грузовую отметку и восстановить «достоверную картину движения».

Максим отклонил предложение.

Одна ошибка останется в журнале — ограниченная, подписанная его именем и достаточная, чтобы объяснить, почему человек не был брошен в шахте.

Глава 7. Контур из пустот

Комната над диспетчерской была безопасной потому, что её не считали комнатой.

В старом плане здесь значился архив, в новом — вентиляционный объём. На деле под низким потолком стояли стол, три стула и шкаф с бланками.

Максим запер дверь на обычную щеколду. Электронного замка не было, и журнал доступа не мог сообщить, что трое людей собрались вокруг стола.

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

Она сняла с окна рекламную плёнку, перевернула белой стороной вверх и расстелила на столе. Максим достал кальку из-под рубашки. После шахты и дождя края размокли, один угол смялся. Три городских рисунка всё ещё просвечивали друг через друга: тёмный Рубеж, синий Златин и почти бесцветная Керна. Если смотреть прямо, линии превращались в грязную сетку.

Рядом Максим положил две квитанции: независимый отказ Златина и досрочную поправку Рубежа. На обеих были короткие прорези по краям. До вокзала он принимал их за защиту от подмены — бумажный аналог контрольной суммы. Теперь прорези казались зубьями одного ключа.

— У Керны квитанции нет, — сказала Рая. — Её контур нельзя считать доказанным.

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

На кальке у каждой столицы имелись такие же слабые засечки. В вагоне они помогли определить, что заявленные масштабы лгут. Сейчас Максим наложил квитанцию не на рамку всего листа, а на рамку Рубежа. Засечки совпали, но улица Жестянщиков ушла в сторону на знакомые шесть метров сорок сантиметров.

Он повернул бумагу на один зубец.

Улица вернулась на место. Зато три других линии — короткий проезд, дуга коллектора и граница старого промышленного участка — разошлись. Между ними возник белый четырёхугольник.

— Точка? — спросил Тимур.

— Если бы точка, линии сошлись бы внутрь.

Максим обвёл пустое место тупым концом карандаша. Все смещения смотрели вдоль его краёв. Ни одно не указывало в центр.

Рая наклонилась над столом.

— Где?

— Пока нигде.

— Для кого?

— Для того, кто умеет отличить рамку от координат.

Он взял квитанцию Златина. По внешним рамкам синие улицы не совпадали ни с рубежскими, ни друг с другом. Глаз сам искал маршрут между столицами.

Максим вместо рамок совместил прорези.

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

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

— Ошибки не прокладывают дорогу, — сказал он. — Они обходят то, чего карта не показывает.

— Кварталы.

— Вероятно.

— Не говори «вероятно». Ты уже выбрал слово.

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

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

— И меньше, чем адрес, — сказала Рая.

Тимур приподнялся на локте.

— Поэтому Лидия отдала кальку мне. Курьер подтверждает передачу между краями, но не обязан знать, что внутри.

— Ты возил туда документы?

— Я возил оттуда квитанции.

— Разница удобная.

— Разница договорная.

Рая положила ладонь на кальку, закрыв рубежский контур.

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

— Тогда всё, что у нас есть, останется похищенным носителем, вмешательством в указатель и догадкой на столе.

— Зато стол не выдаст людей.

— Их уже ищут.

— Пока ищут кальку. Ты предлагаешь доказать, что за ней есть что искать.

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

— А если докажем, он назовёт их скрытой инфраструктурой.

— Поэтому нужно доказательство без положения.

Рая коротко усмехнулась.

— Ты говоришь как Лидия. Я знала её вопрос, но не ответ.

— Лидия спрашивала, может ли служба принять вызов от места, которого нет в адресном слое, — сказала Рая. — Я ответила: может, если получит координаты хотя бы на время маршрута. Она спросила, кто потом заставит систему забыть координаты. Я сказала, что забывание нельзя проверить.

— И что она ответила?

— Что проверять надо не забывание. Надо не передавать постоянную точку вообще.

— Отказ подтверждает, что запрос был?

— Подтверждает, что определённый сектор не получил право построить маршрут, — ответила Рая.

— Без адреса?

— В открытой части — без адреса. Но отказ сектору A12 не доказывает, что внутри границы кто-то существует. Там может быть пустырь.

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

Они посмотрели на третий рисунок. Контур Керны был нанесён самым бледным пигментом. В отличие от двух других, у него не было бумажной квитанции и подписанного события. Только прорези на самой кальке: семь коротких и одна длинная.

Максим приложил к ним свободный край златинской квитанции. Совпали три. Рубежская дала ещё три. Седьмая оставалась открытой.

— Не хватает одного основания, — сказал он.

— Или одного свидетеля, — отозвался Тимур.

— Ты знаешь, где его взять?

— Получатель без адреса оставляет встречную расписку в нейтральном узле. Курьер видит поручение и время, но не дальнейший маршрут. Города клиентов я не называю.

— Предлагаю не верить мне, а понять устройство квитанции.

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

— Любая бумага кажется ключом, если достаточно её двигать, — сказал Тимур. — Поэтому настоящий ключ не положение дырок.

Он согнул бланк по линии подписи. Отверстия наложились.

— Настоящий ключ — действие, после которого остаются две независимо подписанные половины.

Максим увидел, что прорези квитанций идут парами относительно сгибов. Разный масштаб не скрывал размер: он запрещал совмещать изображения прежде доказательств по краям.

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

— Парные подтверждают границу, — сказал Максим. — Одиночная задаёт местное правило отказа.

— А семь прорезей Керны? — спросила Рая.

Максим согнул край кальки по слабой линии, которую раньше принимал за след хранения. Шесть прорезей совпали попарно. Седьмая легла на пустое место.

Не хватало не масштаба. Не хватало второй половины события.

— Контур Керны заявлен, но не подтверждён, — сказал он. — Лидия намеренно оставила его открытым. Если мы запросим полную квитанцию, система увидит, какой нейтральный узел отвечает.

— И получит направление, — сказала Рая.

— Не координату. Но направление уже достаточно сузит поиск.

Тимур забрал у него кальку.

— Значит, Керну не трогаем.

— Тогда внешний проверяющий скажет, что два случая подобраны вручную.

— Пусть.

— Миров не «пусть». Он завтра объявит смещения дефектами, а послезавтра исправит их.

— Ты всё ещё хочешь выиграть аудит, — сказал Тимур. — Даже сейчас.

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

— Да, — сказал он. — Хочу.

Рая ждала продолжения.

— Потому что умею только так, — добавил Максим. — Но запрос Керны мы не отправим.

— Нам всё равно нужно третье подтверждение.

— Не третье место, — сказала Рая. — Третий тип свидетельства.

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

Группы штрихов рядом с контурами оказались кодом класса, смены и длительности. Лидия оставила способ выбрать один обезличенный расход, но не номер машины или адрес.

Рая открыла автономный терминал санитарного парка. Сеть она отключила ещё внизу; локальный архив обновлялся раз в сутки и не отправлял поисковые запросы наружу. В нём хранились сводные таблицы за пять лет.

— Только Рубеж, — сказала она. — Мы проверим существование одной пустоты. Не Керну.

Рубежский код означал вспомогательную медицинскую перевозку во второй смене длительностью от четырнадцати до двадцати восьми минут. Апрельский цикл подписи Лидии сократил выбор до девяти строк. Одна имела основание: «одноразовое право маршрута; источник удалён после закрытия вызова». Машина отсутствовала двадцать одну минуту, пациент был передан. Начальной точки не было даже в локальной копии.

Рая не коснулась строки.

— Вот.

Прорези квитанции подтвердили подписи ресурса, диспетчера и приёмного пункта. Адреса не было, но расход машины, передача пациента и закрытие вызова были подтверждены независимо.

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

До этой минуты пустота принадлежала загадке Лидии. Теперь у неё появился человек — без имени и дома, но с двадцатью одной минутой чужой работы ради его жизни.

— Копируем строку? — спросил Тимур.

— Нет, — ответила Рая.

— Без копии это не доказательство.

— С копией время станет ключом к журналам приёмных пунктов.

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

— Этого мало для суда, — сказал Тимур.

— Для суда — да. Для следующей проверки достаточно. Мы доказываем метод, не вызов.

Рая подписала запись как специалист экстренной навигации. Тимур добавил, что координаты получателя курьеру не раскрывались. Максим приложил квитанцию так, чтобы в копию попали парные прорези, но не одиночная поправка.

Три свидетельства показывали существование действия. Ни одно не показывало место.

Терминал мигнул.

На экране появилось уведомление внутренней политики. Загруженное утром правило дождалось совпадения поискового шаблона.

«Обнаружен просмотр записей с удалённым источником маршрута».

Ниже медленно раскрылась вторая строка:

«Категория: возможная скрытая инфраструктура. Сохранить журнал обращения до получения законного требования».

— Мы ничего не отправляли, — сказал Тимур.

— И не должны были, — ответила Рая. — Это сторож локального архива. Он запомнил сам факт просмотра.

Максим проверил поля уведомления. Координат там не было. Поисковые условия тоже не сохранялись. Только его временный идентификатор, терминал санитарного парка и категория записи.

— Они не знают, что мы нашли.

— Они знают, что искали удалённый источник, — сказала Рая. — Этого хватит для запроса.

Внизу открылась третья строка. Правило ссылалось на решение транспортного контура после вокзального происшествия. Его ручное вмешательство уже стало основанием связать просмотр архива с возможной угрозой.

Телефон внутренней связи зазвонил один раз и замолчал. Через несколько секунд загорелся снова.

Рая включила громкую связь, не называя комнату.

— Сокол.

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