Читать книгу «Слепое пятно» онлайн полностью📖 — Оливии Кросс — MyBook.
image
cover









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

Он вернулся к моменту, где точка «двоится». До «слияния» предиктор вывел внутреннюю оценку – короткий числовой хвост без подписи. Раньше он эти хвосты проскакивал глазами. Сейчас задержал взгляд. Там был ритм, уже знакомый по другим записям: значения шли не как живой сигнал, а как будто по нотам. Два кадра – нарастание, один – спад, дальше – ровная линия и резкое «слияние». «window=2». Ровно два кадра. Он даже не записал – просто отметил этой строчке место в голове.

В коридоре скрипнули двери. Ворвался тонкий свист – кто-то снова открыл одну из створок в ангар. Этот свист был как курсив: выделял мысль, но не менял смысл.

– Как? – Петров стоял у двери, не заходя.

– По данным – чисто, – сказал Марков. – Кроме одного.

– Что?

– «merge» с политикой, которой нет в документации. «17c».

Петров не изменился в лице.

– Разберёмся на разборе. Сейчас не ломаем темп.

Марков кивнул. Это был не отказ. Это был способ не превращать наблюдение в событие раньше времени. Он снова посмотрел на строку с «17c» и положил рядом с клавиатурой листок с короткими пометками: время, «drop 1000 ms», «двойная отметка, правее на долю», «слияние до появления полной формы», «policy=17c», «theta=0.61, window=2, early_ok=true».

Он вернулся к общей картинке на «красивом» экране. Ничего подозрительного. Если взять эту панель как единственный источник истины, сегодняшний день прошёл штатно. В этом и была её задача: пройти штатно. Работа Маркова была другой.

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

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

Он не нашёл там подписи человека. Он нашёл там подпись решения. Короткая строка, которая гласила, что если оценка уверенности «выше порога» и «окно предсказания равно двум», то система имеет право объединить треки, не дожидаясь полного формирования второго. Такие правила пишут люди. Но не всегда эти люди потом вспоминают, что именно написали, и где это лежит.

Папка на краю стола снова напомнила о себе – он подвинул её локтем. Бумага не любила ждать. Логи – любили.

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

Гул в ангаре просел на тон. Где-то закрыли один из источников. Свист в воротах стих. В комнате стало слышно, как вентилятор в системном блоке набирает обороты – коротко и сдержанно, как вздох.

Он посмотрел на экран ещё раз. Строка с «policy=17c» стояла посреди ровного поля обычных событий. Она не выглядела особенной. Ни один цвет не выделял её среди других. Но цифры рядом были не теми, что должны быть «для полигона». И в оглавлении, которое знали все, этой политики не существовало. Он искал её название в голове – как ищут знакомое лицо в толпе – и не находил.

Значит, её не должно быть.

Но она была.

Глава 3

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

На шапке распечатанного протокола висела аккуратная строка: АО «ЗАСЛОН». Под ней – дата, время, список присутствующих. Чужие голоса были здесь уместны: в комнате, где обычно говорили «свои», они звучали как другой акцент, не мешая делу, но напоминая, что снаружи есть правила, не написанные их почерком.

– Коротко по утру, – сказал Петров, щёлкнул колпачком, провёл на доске линию по времени. – Эталон – штатно. Коридор – как в плане. Порыв – отработан.

Марков сидел ближе к проектору. На его экране был не «красивый» вид, а лента чисел. Сырые. Без подписи цвета. Он включил нужный отрезок. Строки побежали в такт дыханию.

– Здесь, – он коснулся тачпада, – перед сливанием. Вторая отметка на долю градуса правее. Появляется, не успевает сформироваться полностью, АРЕС объединяет.

Петров кивнул. Он держал маркер как указку, не как оружие.

– Без предупреждения?

– Без.

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

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

– Всё по регламенту?

Петров не посмотрел на него. Он посмотрел на Маркова.

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

– К форме – позже, – тихо сказал Петров. – Сейчас – матчасть.

Он подвинулся к доске. Нарисовал две кривые – первичный и вторичный трек. Подписал «азимут», «скорость», «дельта t». Повернулся:

– Гони без АРЕС.

Марков выключил блок предиктора и повторил отрезок на стенде, который сохранял сырые измерения. Сразу стало заметно, как линия скорости «дышит» – три–четыре процента гуляния в допуске. Картинка перестала быть гладкой. Это не было плохо. Это было честно.

– С АРЕСом, – сказал Петров.

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

– Слишком красиво, – сказал кто-то у окна вполголоса.

– Красота нас не волнует, – отрезал Петров, не грубо. – Волнует соответствие.

Зайцев не двинулся. Его лицо ничем не выдало отношение. Он спросил ещё один короткий вопрос:

– Документально?

– Документально – режим помощника, – ответил Петров. – По плану. По листу. – И, словно отметив для «внешних», добавил: – В рамках регламента АО «ЗАСЛОН».

Маркер прошуршал по доске. Петров нарисовал окно слияния – «окно-2» – и заштриховал два ранних кадра.

– Если у нас ранняя уверенность падает выше порога, – сказал он, – мы имеем право склеить, не дожидаясь полной формы. Но порог – фиксированный. И название – фиксированное. В документации это «расширенная». Без букв.

– А у нас, – сказал тихо Марков, – в логе «полиси семнадцать-цэ». Порог – шестьдесят одна сотая. И допуск на раннее – «истина».

Он не спорил. Он называл то, что видел.

Петров кивнул. Повернулся к Громову:

– В полёте – что-то чувствовалось?

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

Он сказал «ровнее», не «лучше». И это слово попало куда надо.

– Давай ещё по ADS-B, – сказал Петров.

Они прогнали симулятор – вторичный канал, «самолётный» ответчик. Синхронизировали метки. Без АРЕС кривые «шили» друг с другом, иногда расшивались, потом снова сходились – как это и бывает. С АРЕС – совпали до последнего знака после запятой в удобном интерфейсе, где дробные части прятались за красивой плашкой.

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

– Фиксируем: с АРЕС совпадение избыточно стабильное. Без АРЕС – гуляние в допуске. Предупреждения – нет. – Он поставил точку. – Дальше – аудит.

Он снял колпачок, положил маркер на край стола рядом с протоколом, где в шапке всё так же стояло «АО “ЗАСЛОН”». Колпачок покатился и тихо упёрся в край бумаги.

Разговор свернули быстро. Зайцев поднялся, пожал плечами, как будто накинул на них что-то невидимое, и вышел первым. Громов задержался у двери. На секунду встретился взглядом с Марковым. Взгляд был без вопроса. Скорее – знак, что видел то же место, но со своей стороны.

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

Он открыл цепочку сборок. Ночной прогон, триггер от расписания. Артефакты – чек-суммы, подписи. В колонке «комментарий» – нейтральное «минор апдейт параметров». Автор – сервисная учётка. Время – вполне нормальное. Никаких «минут вперёд» – это было бы слишком ярко для утра третьего дня.

Он провалился глубже – в состав пакета. Политики слияния лежали в отдельном каталоге. Их имена были знакомы, как фамилии в пропускном листе. И одно – нет. «policy_17c.bundle». Не файл настроек. Пакет. В этот момент взгляд поставил вокруг слова скобки, как на доске.

Он щёлкнул по нему. Содержимое не раскрылось – «нет прав». Он не удивился. Правильно, что нет. Неправильно – что файл здесь.

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

Вики молчала. Поиск по «17c» дал ноль. Поиск по «окно» и «раньше» – выдал документ, где слово «раньше» стояло в контекстах, которые к ним не относились. В справочнике для полигона про ранний допуск не было и намёка.

Он открыл протокол испытаний. Перелистнул к разделу «алгоритмические конфигурации». Там были таблички, графики, подписи. И рядом – пустота, где хотелось бы увидеть ещё один столбец: номер политики, контрольная сумма, путь. Этого столбца не существовало. Его как будто и не задумывали.

Пружина стула отщёлкнула и замерла. Вентиляция сменила тон на полтона ниже. В такие моменты казалось, что ещё чуть-чуть – и цифры сами скажут, что в них не так. Они не скажут. Их надо спрашивать правильно.

Он вернулся к логу. Строка с «merge» и «policy=17c» стояла, как заголовок, который притворился текстом. Рядом – «theta=0.61», «window=2», «early_ok=true». Ничего лишнего. Ничего, за что можно зацепить зубами прямо сейчас и не сломать.

Пальцы нашли сочетание клавиш на автопилоте – выгрузка подпроцесса слияния. В вытяжке текстов мелькнула короткая фраза из внутренней диагностики: «policy loaded: 17c». Без даты, без автора, без ветки. Только факт.

Он потянулся к полке, где стояла тонкая серо-зелёная папка «Интеграция – общий». Достал вложенную записку с маршрутом CI. На схеме было аккуратно нарисовано, где политики подхватываются из «утверждённого перечня». Стрелка шла в обход каталога, где лежал «bundle». На схеме путь был один. В жизни – два.

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

Дверь скрипнула. Вошёл Петров.

– Как?

– Нашёл артефакт, – сказал Марков. – «policy_17c.bundle». В пакете сборки. Не в перечне. Права – закрыты.

Петров кивнул медленно.

– Утверждённых – пять, – сказал он и улыбнулся краем губ. – Буквы у нас не водятся.

– Здесь – водится, – сказал Марков.

Петров провёл пальцем по кромке стола – жест, который у него заменял «я думаю». Потом сказал:

– На вечер – короткий аудит с безопасниками. Зайцев будет. Подготовь так, чтобы без споров. Факты. И… – он бросил взгляд на шапку протокола с «АО “ЗАСЛОН”» – …без лишних слов.

– Понял.

Когда Петров ушёл, Марков ещё раз посмотрел на экран. На синей полосе времени маленькая «клякса» – секунда выпадения канала – казалась естественной неровностью. На серых строках рядом слова были ровные. И среди них – одно слово, которого не должно было быть. Оно не делало текст красивее. Оно делало его другим.

Он скопировал короткий блок – три строки до, три после – в отдельный файл «паттерны». Записал туда новое имя. Не чтобы потом хвастаться, что заметил первым. Чтобы через неделю, когда шум станет привычным, он не поверил себе на слово.

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

«policy loaded: 17c».

И подумал: это не название. Это адрес. И кто-то знает, где он расположен.

Глава 4

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

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

У сервисной консоли свободное место. Экран старше, чем в рабочих: тёплый белый, лёгкая зернистость. Внешний диск сел в порт с тихим щелчком, который отдался пальцам. Реплей-утилита открылась как смазанная дверь: без манер, без «красоты» – выбор файла, метка времени, скорость прокрутки, флажки «с АРЕС/без». Метод намечен заранее: сперва чистый прогон, затем инъекции, потом вариации окна слияния в дозволенных пределах. Не охота за «магией», а попытка поймать повторяющееся.

Утренний кусок пошёл в ход первым. На экране побежала лента чисел: время, азимут, угол места, скорость. В нужной точке всё сложилось так же, как в зале: едва заметная вспышка вторичной метки, сдвиг по азимуту на долю градуса, «merge» появляется раньше, чем вторая форма успевает собраться. Пауза. Возврат на пять секунд. Повтор. То же поведение. Контрольная точка – на автомате, чтобы глаз вернулся, когда устанет, а память станет снисходительной.

Дальше – инъекции. Утилита предлагала шаблоны: дождь, плотный дождь, «грязное небо» с помехами, короткая вспышка РЭБ, выпадение телеметрии на секунду. Сначала ровно тот профиль, что днём: минус 1000 мс. Вставка – и снова, при возвращении канала, раннее «слияние». В углу мелькнули параметры: «policy=17c», «window=2», «early_ok=true». Фиксация времени. Следом вариация с выпадением на 500 мс. Реакция меняется тонко, но принцип тот же: вторичный пик ещё не дорос до формы, а решение уже принято. «Окно два» держится как закон.

Без АРЕС картина сразу дышит свободнее. Не драматично, не назло, – закономерно. Скорость играет в пределах допуска, курс гуляет на проценты, каналы спорят и мирятся, линии перестают ходить строем. Ровная глянцевая поверхность «красивого» интерфейса, вчера утешавшая, вдруг кажется не к месту. На совещаниях – красота легче. В работе – мешает.

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

Каталоги политик открылись покладисто – на своём уровне. Пять знакомых имён ответили строками: базовая, расширенная, «грязная погода», «медленный вторичный», «пересечение трасс». Букв рядом не водилось. Попытка подняться уровнем выше закончилась предсказуемым «нет прав». И это – норма, иначе было бы странно. Отмечается не только «нет», но и текст отказа; иногда он важнее самого факта.

Фильтры инъекции вновь позвали к себе. Галочка «модуляция» в профиле дождя проглотила пару дополнительных кликов – канал стал чуть «грязнее». Возврат к интересующему месту ничего не отменил: в умеренной помеховой обстановке раннее слияние устойчиво воспроизводится. В блокнот легла короткая строка: «грязь х2 – окно=2, ран.слияние сохраняется».

Строка команд – инструмент честный. Интерфейс привык прятать лишнее из вежливости, терминал – реже. Просмотр «/opt/ares/policies» отрисовал знакомый список. Затем добавился «-a», чтобы показать скрытые. Миг – и на экране, словно отпечаток на запотевшем стекле, вспыхнул «exp». Следующим же кадром – сухое «denied». Повтор – та же песня: короткая вспышка каталога, мгновенный отказ. Редкую птицу в листве ловят так же: не моргнуть и запомнить. Путь набран вручную: «/opt/ares/policies/exp» – ответил вежливо «нет такого файла», а на повтор – уже «доступ запрещён».

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

Лента лога вернула к главному. Там, где «слияние» случается раньше, внутренняя диагностика добавляет короткое «policy loaded: 17c». Без даты, без имени ветки, без чьей-то подписи. Голый факт. Рядом мелькает хвост: «cache snapshot: 17c.swp mtime 23:38:15.003». Системные часы показывают «23:38:14.972». Тридцать одна миллисекунда вперёд. Мелочь и всё-таки – цифра. НТP-утилита, написанная когда-то для себя, успокаивает: расхождение с опорными – одна–две миллисекунды. Здесь – тридцать одна. Не катастрофа, но лишний слой. В блокноте появляется помета: «mtime snapshot +31 ms к NTP; сверить на другом узле».

Следом – ночной тестовый набор из общей папки. «Без АРЕС» – потом «с АРЕС». Плотный дождь – короткая модуляция РЭБ – отключение вторичного. Во всех трёх конфигурациях паттерн держится: лёгкое двоение метки при выпадении, раннее «слияние» на окне «два», сухая запись «policy loaded: 17c». Паттерн устойчив – значит, есть с чем идти на аудит.







...
5