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

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

18

Папка легла на стол без слов. Тот же плотный картон с привычным запахом типографской краски.

– На подпись, – сказал голос у двери и ушёл.

Он не открыл. Сначала – логи. Потом – бумага.

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

Он вынул листок из кармана – клочок с цифрами, куда отметил утренние 0.027. Положил рядом с монитором. Сравнил. Слишком хорошо совпадало, чтобы быть совпадением. Или, наоборот, слишком ровно, чтобы пытаться докопаться до «почему» прямо сейчас.

Вентиляция в потолке на секунду остановилась и снова пошла. Эти паузы были ничем. Если считать, что они – ничто.

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

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

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

Глава 2

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

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

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

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

– По дорожке идём так же, – сказал Петров. – Начнём с короткой. Дальше – по факту. Без импровизации.

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

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

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

– Заходим в коридор, – сказал Петров.

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

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

– Есть, – сказал Громов в гарнитуру, не меняя тона. – Держу.

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

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

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

– Фиксируем, – сказал Петров негромко.

Эта фраза значила «идём дальше».

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

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

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

Он открыл файл лога. Строки шли ровно. Метки времени были как надо: аккуратно увеличивались, не пропуская тактов. В нужном месте – заметный «впад» канала. Так и записано: «telemetry: drop 1000 ms». Ровно, без лишних слов. Ещё через пару десятков строк – «trk: merge». Параметры в скобках. Он остановил ленту, вернулся на десять секунд, включил построчный просмотр.

Запись называлась не так, как в документации. Не «fuse_simple», не «fuse_weighted». Внутри стояло: «policy=17c». Он прочитал дважды. Для верности – ещё раз.

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

Он покрутил колесо мыши. Рядом со строкой висели параметры. «theta=0.61». «window=2». «early_ok=true». Этих слов не должно быть в тестовой сборке. В документации для полигона это место выглядело иначе: «слияние при условии достаточной близости по азимуту, скорости и одной дополнительной метрике уверенности». Без чисел. Без флажка «раньше можно».

Он сделал снимок экрана, сохранил отдельным файлом. Потом открыл рабочую вики. Поиском пробежался по словам «17c», «theta», «early_ok». Ничего. Поисковик предложил «имеете в виду 17?». Он не имел в виду «17». Он имел в виду букву рядом с номером, которой не должно быть.

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

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