Охотник не стреляет

Глава 1. Жёлтая рамка

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

Цель шла над серой водой — низко, с упрямой прямизной тестового маршрута, какой не бывает у живого пилота. На центральном экране её звали «Сойка-6»: красная метка, скорость сто сорок, высота двадцать три. Ветер с залива бил по фермам дальномеров, гонял по бетону сухую соль, трепал жёлтые флажки запретной зоны. Глеб Назаров вёл её в захвате, и где-то снаружи техник по наружной связи ругался на старый подъёмник и просил закрыть наряд. Его голос падал в командный модуль фоном — жизнь возилась со своими болтами, пока здесь решали, сколько ей позволено шуметь.

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

— Захват есть. — Глеб уронил это скупо, не отрывая глаз от экрана.

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

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

Четыре. Три.

И тут по центру экрана легла жёлтая рамка.

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

Воздух в модуле стал плотным.

— Это что сейчас было? — Крайнов медленно обернулся.

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

— Ложная остановка. — Он пожал плечами. — Классика.

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

— Глеб, увеличьте северо-восток.

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

Глеб медленно снял ладонь с панели.

— Наряд должен быть закрыт. — Роман нахмурился. — Зона должна быть чистой.

— Зона живая. — Таисия не повернула головы. — В этом и трудность.

Крайнов прищурился:

— Значит, служба допуска провалила процедуру.

— Значит, «Охотник» увидел провал раньше выстрела.

Роман хмыкнул, и в этом звуке было всё его отношение к её разделу.

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

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

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

Крайнов уже глядел на коптер.

— Фамилия техника?

Глеб сделал запрос:

— Мартынов. Бригада радиодальномера. Наряд открыт в девять десять.

— Кто дал чистый сектор?

— Служба полигона. С отметкой «без людей».

— Без людей. — Крайнов повторил это с холодной усмешкой. — А человек на мачте. Прекрасно.

Из динамика прорезался тот самый голос — обескураженный, перебитый ветром:

— Диспетчер, у меня коптер дурит, держит высоту через раз. Можно замену аккумулятора без спуска? Ветер тут зверь.

Глеб вдавил кнопку внутренней связи:

— Мартынов, замри. Платформа под запретом. Ты в секторе испытания.

— Какого испытания? — В голосе техника прорезалась осторожная оторопь.

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

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

— Испытание проведено. — Таисия произнесла это спокойно, как очевидность.

— Цель ушла.

— Техник жив. Коптер цел. «Охотник» объяснил, почему не выстрелил, и оставил полные логи. Для моего раздела это успешный прогон.

Роман оперся плечом о стойку.

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

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

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

Спор оборвался. Вопрос был не из их колоды.

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

— Мне нужна команда, которую можно выполнить.

— Команда без цены превращает оператора в подпись под отчётом.

Глеб коротко, невесело хохотнул:

— Красиво. В отчётах такое любят.

— В отчётах любят фамилии. Я хочу, чтобы фамилия шла после понимания, а не вместо него.

Крайнов сухо стукнул пальцем по столешнице:

— Хватит. При массовом налёте ваш режим сомнения можно отключить?

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

— Скорость.

— И слепоту.

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

— Мартынова тоже подавим коэффициентом? — спросила она.

— Тая.

— Роман. — Она шагнула ближе. — Там человек. Он попал в зону из-за ошибки реестра, машина увидела связь между его коптером и сектором — и не выстрелила. Это и есть защита.

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

Здесь он был прав, и она кивнула. Признать это вслух было важнее, чем выиграть реплику.

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

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

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

Он вернулся к столу.

— Учите её различать остановку и отказ. Остановка — лишняя задержка. Отказ — запрет на слепое действие.

— Сегодня был отказ, — обронила Таисия.

У второй станции Лина Шахова, младший аналитик, делала вид, что работает с логами, а сама ловила каждое слово.

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

— Откуда задержка? — Роман нахмурился; цифры он уважал больше, чем её саму.

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

— Значит, резервный канал хромает. — Крайнов произнёс это тихо.

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

Глеб провёл ладонью по лицу:

— Я бы ударил. По регламенту — подтвердил бы. Красная цель, девяносто одна сотая, сектор чистый. Ударил бы.

— Для этого и нужен честный экран.

— Экран был честный. Просто я смотрел бы на другую строку.

— Значит, строку надо поднять выше.

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

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

— «Гавань-9» для полигона. Подтверждаем штормовое второй степени. В северных посёлках подтопление. С семнадцати ноль-ноль переводим спасательные платформы на аварийный режим. Запрашиваем готовность «Охотника» к смешанному трафику: спасатели, гражданские коптеры, служебные борта.

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

— Сколько бортов в воздухе?

— До тридцати двух спасательных по плану. Гражданских — под полсотни при самостоятельной эвакуации. Плюс медицинские контейнеры. Видимость падает, радиошум растёт.

— Угроза внешнего воздействия?

Диспетчер помедлил:

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

Роман глянул на Таисию, и впервые за утро в его взгляде не было насмешки. Была работа.

Крайнов раздал смену короткими фразами, как сбрасывают карты: полигон закрыть, логи — в его канал, Зотову — оценку автономного режима для смешанного трафика, Нечаевой — её предупреждения привести к виду, который оператор поймёт за секунду, Шаховой — реестры гражданских аппаратов и резервные каналы, каждую странность на стол. Глеб уже гасил учебный сценарий. Красная «Сойка» исчезла из списка, и на её месте раскрылась карта настоящего порта: причалы, мачты, склады, медицинский модуль, эвакуационный зал, паутина низких маршрутов. Метки двигались, пересекались, спорили друг с другом. В этом хаосе жила «Гавань-9».

Таисия задержалась на строке режима сомнения. Жёлтая рамка давно погасла, но система сохранила запись: блокировка признана обоснованной, цена необратимого действия — поражение гражданской метки, ответственное подтверждение отменено системой.

Отменено системой. В реальном небе этой формулировки не хватит. Кто-то захочет подпись. Кто-то скажет: времени нет. Кто-то попросит выключить жёлтую рамку ради красной цели и назовёт сомнение слабостью, а скорость — мужеством. И каждый будет по-своему прав, пока первая ошибка не получит фамилию.

Роман подступил сбоку, понизив голос:

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

— Понимаю.

— Если задержка убьёт людей, это тоже будет твоя подпись.

— Да.

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

Таисия закрыла файл прогона. Система присвоила ему имя автоматически: «Прогон 14-А. Блокировка поражения». Она стёрла последнее слово и набрала другое — «Спасение». Машина запросила подтверждение изменения записи. Таисия поставила подпись.

В дверях Крайнов задержался:

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

— И правильно.

Он нахмурился, не ожидав согласия.

— Я говорю только, что у остановки тоже должна быть цена, — добавила она. — Как у выстрела.

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

Глава 2. Кнопка без имени

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

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

Глеб занял главное кресло и развернул боевую карту. «Гавань-9» открылась целиком — причалы, энергоблок, медицинский модуль, склады, эвакуационный зал, вышка связи, низкие маршруты спасателей. Серые метки уже поднимались с крыш и площадок, тянулись к пунктам сбора, висели у посадочных зон, спорили с ветром и регламентом. Крайнов стоял у стола совещаний; влажная куртка темнела у плеч. Он принёс с собой запах моря. В голове уже прокручивался готовый приказ.

— Сорок минут до пикового трафика. — Он не сел. — За дальним буем — подозрительные малые платформы. Шторм идёт к порту. Эвакуация начата. Я хочу понять, что ваш «Охотник» делает сам, где просит подпись и где имеет право остановить поражение.

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

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

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

Глеб скривился:

— Кто отвечает за порог?

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

— Модель в суд не вызовут.

Таисия подошла к свободной станции, открыла блок подтверждения и растянула на весь экран. На сером фоне горела одна зелёная кнопка: «ПОДТВЕРДИТЬ». Большое слово, никакой биографии решения за ним. Она смотрела на эту опрятную пустоту и думала, что катастрофы рождаются именно из неё, — но вслух выбрала проще:

— Вот это надо менять.

Крайнов бросил взгляд на экран:

— Кнопку?

— Имя кнопки.

— У неё есть имя.

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

Глеб наклонился к экрану. Эту мысль он принял сразу — она была про его палец.

— Тут я с вами. В стрессовой смене «подтвердить» превращается в дыру. Туда падает всё.

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

— Не юридическим, — качнула головой Таисия. — Человеческим. Три строки.

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

Глеб прочитал вслух и кивнул:

— Это можно понять.

— За сколько секунд? — прищурился Роман.

— За одну, если строка на месте.

— А если целей двенадцать?

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

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

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

Роман ткнул стилусом в схему:

— И ещё один слой поверх боевой карты.

— Это место для моей фамилии, — обронил Глеб.

Крайнов посмотрел на него с интересом:

— Поясните.

— Я ставлю подтверждение — в журнале остаётся «Назаров». Без строки о цене это читается как «Назаров согласился». А я хочу, чтобы журнал знал, с чем именно я согласился.

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

Крайнов провёл ладонью по крышке стола:

— Хорошо. Кнопки переименовать. Но красный протокол за мной. Допустим, рой идёт на энергоблок. Связь с оператором рвётся. Медблок на резерве. «Охотник» видит цель с достоверностью девяносто пять. Гражданских меток в зоне нет. Он бьёт?

— Да, — ответил Роман без заминки.

Таисия открыла боковой блок:

— С оговоркой. Система обязана проверить, откуда взялась пустая зона. Гражданских меток нет — или умер канал, который их показывает? Это разные вещи.

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

— Для плохой системы — один. Для нашей — два. «Пусто, данные живы» и «пусто, данные потеряны».

Лина быстро внесла пометку и предложила выводить это как состояние среды — живая, неполная, отравленная.

— Отравленная? — переспросил Крайнов.

Таисия повернула к нему экран с логами полигона. Когда данные приходят с задержкой, с внедренным штампом, в удобной для модели форме — среда отравлена, объяснила она. В такой среде красная цель может быть настоящей. И ловушка тоже может быть настоящей.

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

— Мне нужна рабочая схема. Без философского кружка.

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

На словах «командный обход» лицо Крайнова застыло.

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

— Да.

— В момент атаки.

— В момент атаки особенно.

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

— Это удар по безымянности.

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

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

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

— Ладно. Командный обход — моя подпись. Но при атаке на энергоблок с временем меньше трёх секунд «Охотник» действует сам, если среда живая.

— Согласна, — кивнула Таисия.

Роман вскинул брови:

— Ты согласна?

— Чистая цель, живая среда, критический объект, окно меньше реакции оператора. Пусть действует. Я против слепой автоматики, не против быстрой.

— На экране это трудно различить.

— Поэтому мы здесь.

Лина вдруг застыла над клавиатурой:

— Странность в реестре.

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

— Говорите, — велел Крайнов.

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

Роман подошёл к её станции, бросил на ходу — ошибка синхронизации.

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

До этой секунды они спорили о правилах. Теперь правило пришло с именем. Таисия почувствовала, как сместился вес разговора, ещё до того, как Лина вывела карточку: «Белый-17», спасательная платформа среднего класса, груз — аварийный модуль питания, получатель — медблок «Гавани-9», статус допуска ожидает подтверждения.

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

— Крайнов, у меня третий блок на резерве. — Она обошлась без приветствия. — Нужен модуль питания. Наш борт задержан ветром, диспетчер дал замену — «Белый-17». Дайте ему приоритетный коридор.

— Запись в реестре с ошибкой.

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

Связь дрогнула. Саида наклонилась к камере и добавила, что по северной дороге идёт колонна, но мост закроют из-за воды, и модуль нужен до закрытия причала — иначе эвакуационный зал станет складом тележек с пациентами. Экран погас. Никакой торжественности: жизнь предъявила накладную и потребовала подпись.

Роман открыл техкарточку «Белого-17» и предположил, что запись можно почистить, маршрут проверить, дату сбросить — скорее всего, старый буфер.

Лина качнула головой:

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

— Хорошая формулировка, — отметила Таисия.

Лина смутилась:

— Я ещё проверю.

Крайнов вернулся к доске и распорядился: «Белому-17» — временный серый статус, держать на внешнем коридоре до проверки; Шахова копает происхождение записи, Зотов — технический профиль, Нечаева смотрит, как это ляжет на режим сомнения, Назаров ведёт маршрут только через внешний коридор, без захода над энергоблоком.

— Если это медицинский модуль, он потеряет время, — заметил Глеб.

— Если это чужая платформа, она потеряет шанс, — отрезал Крайнов.

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

Таисия вернулась к интерфейсу кнопки. «Подтвердить» исчезло; на его месте теперь стояли разные команды, каждая с ценой. Глеб дочитал до строки «отказ от поражения» и нахмурился:

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

— Нет. Вы подписываете другой способ защиты.

— Слова имеют значение.

— Поэтому мы их и меняем.

Она стёрла строку и набрала: «подтвердить мягкий перехват вместо поражения».

— Лучше, — одобрил Глеб. — Видно, что руки заняты делом.

Роман глянул на экран — это уже походило не на интерфейс, а на ведомость вины, — но спорить не стал.

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

— Совещание окончено. — Крайнов выпрямился. — Зотов, Нечаева — правила в боевой режим. Шахова — «Белый-17». Назаров — доклады по каждой серой цели. Медканал держать открытым.

Люди разошлись по станциям, и поза совещания в зале сменилась позой ожидания удара. Её узнавали по мелочам: кружки отодвинули от клавиатур, куртки сняли с проходов, лишние окна свернули, наушники прижали плотнее.

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

Начальник безопасности взглянул на неё со своего места:

— Оставьте.

Роман подступил ближе, понизив голос:

— Ты понимаешь, как он на тебя посмотрит, когда эта рамка всплывёт при настоящем ударе.

— Понимаю.

— И всё равно оставишь?

— Уже оставила.

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

— Нашла источник даты по «Белому-17». Это не локальная ошибка. Запись прошла через внешний ретранслятор, привязанный к гражданскому аварийному каналу.

Крайнов выпрямился:

— Где ретранслятор?

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

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

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

— «Охотник» в боевую готовность.

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

Глава 3. Гавань-9

На карте «Гавань-9» выглядела разумным чертежом: белые нитки причалов, синие коридоры спасателей, жёлтые зоны ограничений, красные сектора риска. В коридорах под портом она была злой и человеческой.

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

В наушнике держался голос Глеба: