Вечер. Мастерская менялась к ночи - гул охлаждения громче, конденсат гуще, свет экранов резче на фоне выключенных ламп. Пепельщик сполоснул термос, залил свежий синт-кофе, поставил на край стола, где тот простоит до утра и остынет, как всегда.
Капли под язык - двойная доза, и горечь обожгла нёбо раньше, чем он успел сглотнуть, а потом пришла холодная ясность, быстрее обычного, контуры предметов обострились, буквы на экране стали чётче, и мастерская стала меньше, теснее, ближе. Побочка придёт потом. Сейчас - работа.
Из нижнего ящика стола он достал то, чего не доставал давно - архивные протоколы, скрипты контекстного анализа, справочники форматов, инструменты человека, которым он был до мастерской, когда носил пропуск отдела контекстного анализа MAAT и когда этот пропуск ещё что-то значил. Навыки остались.
Разложил на столе. За стенами мастерской сервисные уровни звучали иначе, чем днём: Пирамида сбросила нагрузку после десяти, генераторы просели до базовой частоты, охлаждение стало громче на контрасте - и в этих паузах проступали звуки, которых днём не было. Техничка жила ночной жизнью: шаги смен, лязг сервисных лифтов, чей-то кашель в коридоре за стеной. Щелчки. Реле. Или не реле.
Хэш на экране - красная зона, три дыры на месте удалённых фрагментов, и стандартный метод, который не работал.
Значит, не стандартный уровень.
* * *
Контекстная обёртка - поля, которых он не трогал три года, с тех пор как сдал пропуск. Процедурный уровень, входные параметры предиктивной модели, то, что стандартная процедура облегчения не затрагивает, потому что нормальному мастеру там делать нечего.
Первая команда - ошибка, неверный формат: протоколы обновились, синтаксис сдвинулся. Полез в справочник, нашёл новый формат, попробовал снова.
Обёртка раскрылась.
Десятки строк процедурного контекста - история взвешивания, параметры модели, входные массивы, коэффициенты коррекции - и руки помнили эту структуру раньше головы, пальцы уже скроллили, выделяли блоки, сортировали по источнику, пока он ещё вспоминал, что означают заголовки полей. Бормотание:
- Поля стандартные... входной массив... так, это модельный контекст...
Навыки возвращались рывками - он помнил принципы, но путал детали, дважды запустил анализ с неверными параметрами, один раз едва не перезаписал контрольную сумму и остановился в последний момент, и рука зависла над панелью, и он выругался беззвучно, и потянулся к термосу. Глоток синт-кофе. Справочник. Заново.
Час. Два. Ноотропы держали - зрение острое, пальцы точные, но периферия уже плыла, и конденсат за стойками капал с ритмом, который он принимал за собственный пульс, а охлаждение гудело ровно как кровоток. Граница между телом и мастерской размывалась.
Пепельщик добрался до входного массива - данные, на основе которых модель решала, сколько весит сердце-хэш. Начал перебирать записи: источники, метки времени, типы данных. Стандартные. Стандартные. Стандартные.
Строка, которой не должно быть.
Пальцы замерли на панели. Строка была помечена как внутренний источник - формат правильный, метка времени правильная, тип данных правильный. Но данные были внешними.
Чужой почерк в знакомом поле.
Выделил строку, проверил хэш-сумму источника - не совпала с реестром, проверил соседние записи - чистые, вернулся к этой, ещё раз, и ещё, и понял.
Инъекция.
Кто-то добавил данные в контекст извне. Модель приняла их как легитимные - формат совпадал, метки не вызвали отбраковку. Алгоритм честно взвесил всё, включая ложь.
Грязь не в памяти. В обёртке.
Пепельщик сидел перед экраном и не понимал. Инъекция была аккуратной. Не грубый взлом, а точечная подмена, профессиональная работа с характерной структурой, которую он читал как почерк: формат маскировки источника, способ генерации метки времени, паттерн размещения в массиве. Один почерк.
Вычистил внедренную строку. Запустил повторное взвешивание.
Число на экране дрогнуло, просело, вышло из красной зоны.
Заказ можно было закрыть.
Записал сигнатуру в отдельный файл - формат, паттерн, метка, три параметра, достаточно для поиска. Закрыл его и продолжал сидеть. Мигрень пришла тихо, давлением за глазами, пульсацией в висках. Ноотропы отпускали. Снял перчатки, потёр переносицу. Шрифт на экране расплывался как будто терминал опустили в воду.
За стенами что-то щёлкнуло. Реле или не реле. Он не проверил.