18+
реклама
18+
Бургер менюБургер меню

Оливия Кросс – Слепое пятно (страница 4)

18

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

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

Он вернулся к логу. Строка с «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». Паттерн устойчив – значит, есть с чем идти на аудит.

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

– Долго? – голос ночной, с глухим краем.

– Реплей докручиваю. Минуты три.

– Хорошо. Если что – я тут.

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

Монитор открытых файлов – ещё один честный источник. Таблица процессов двинулась ровно; большинство – предсказуемо. И один – нет. Процесс из стека АРЕС пару мгновений держал открытым дескриптор к «/var/cache/ares/policies/17c.snapshot». Сам файл в каталоге не наблюдался, прямой вызов «stat» отвечал «нет такого файла». В графе времени появления у дескриптора – «23:41:03.112». Системные часы в тот момент: «23:40:56.901». Семь секунд вперёд – уже не округление. Снимок таблицы ушёл в папку «артефакты». Через десять секунд второй снимок зафиксировал отсутствие и файла, и дескриптора. Кэш чист; экран снова скучен.