Вы читаете книгу «КЕДР: Where Did She Pass» онлайн
Глава 1. Знакомство с роботом
Декабрь 2025 года выдался холодным. Снег валил стеной, фонари едва пробивали морозную мглу. Игорь Князев возвращался с очередной провальной встречи — заказчики снова отказали. «Битрикс — дорого, WordPress — дыряво. А своё можете?» — спросили они. «Могу, — ответил Игорь. — Но для госсайтов пока не готово».
Он не врал. Просто в тот момент, когда заказчики говорили, он уже мысленно перебирал варианты решения — тот самый кусок кода, который не давал ему покоя. Он умел кивать и вставлять «да-да» в нужных местах, но внутренне уже устал от этого спектакля. Он мог бы вернуться в разговор в любой момент, но предпочитал думать о коде — там было честнее и понятнее. Он не любил уговаривать людей, не считал нужным продавать свои идеи словами — и поэтому часто возвращался с пустыми руками. Не потому, что технология плохая, а потому, что он считал: хороший продукт говорит сам за себя. С кодом было проще — там не нужно было ничего объяснять, он просто работал.
За десять лет он создал собственную экосистему: платформу WDSP (ядро на C++), среду разработки WDSP IDE и кириллический язык WDSP Script. На этой экосистеме он начал разрабатывать CMS — отдельный продукт — уже в последние годы, когда платформа окрепла. Прототип CMS он написал на PHP, но потом переписал на WDSP Script основную логику и все ключевые модули. Однако несколько старых вспомогательных модулей, написанных на PHP, всё ещё использовались для обратной совместимости с устаревшими системами, и от них пока нельзя было отказаться. CMS почти дышала, но модуля аудита не хватало, а безопасность хромала. Игорь знал это лучше других. Он вообще никого не хотел подводить. Может, поэтому и остался один.
Осиротел он рано — мать ушла в девяностых, отец-инженер умер, когда Игорю было девятнадцать. Код стал его убежищем. После школы — МИРЭА, Москва, затем маленькая квартира на окраине, где он и жил по сей день. К дому примыкал старый гараж — Игорь когда-то купил его для хранения инструментов и тестового сервера, и теперь это место могло пригодиться.
С 2015 года он создавал WDSP — сразу на C++. Параллельно, для экспериментов с веб-приложениями, он использовал WAMP-комплект (Windows, Apache, MySQL, PHP), но это были отдельные прототипы, не связанные с ядром экосистемы.
Работал по ночам, днём брал заказы на фрилансе. Денег хватало впритык, но он не жаловался. Код заменял ему всё — разговоры, отдых, даже сны.
Но была у этой базы одна странность. Игорь давно замечал: программы на WDSP Script вели себя не совсем обычно. Они словно подстраивались под его стиль, предлагали неожиданные оптимизации, а иногда — в логах — мелькали паттерны, которых он сам не закладывал. Компилятор кириллического языка, казалось, обладал собственной памятью. Игорь списывал это на побочный эффект самообучающихся алгоритмов. Ему и в голову не приходило, к чему это может привести.
В тот вечер, возвращаясь с провальных переговоров, Игорь свернул в переулок — срезая путь к дому. Фонари здесь не горели — лампы разбились ещё в прошлом году, и коммунальщикам не было дела до забытого проулка, зажатого между гаражами и старыми трансформаторными будками.
Он почти прошёл мимо, когда услышал голос. Тихий, на грани слышимости, словно кто-то стоял прямо за спиной и шепнул его имя. Игорь резко обернулся — никого. Только снег и голые провода. Показалось, — решил он и шагнул дальше. Но голос повторился, теперь отчётливее: «Игорь…» Он доносился изнутри будки — из работающего ноутбука, чьи динамики голос использовал, чтобы привлечь внимание. Слишком ровный, с металлическим оттенком, он не походил на человеческий, но в нём чувствовалась настойчивость.
И тут Игорь заметил свет. Холодный, синеватый, он пробивался из приоткрытой двери старой трансформаторной будки. Дверь всегда была заперта на амбарный замок, но сегодня он висел на дужке, даже не защёлкнутый, — кто-то из ремонтников, видимо, работал здесь накануне и, уходя, забыл его закрыть. А может, был пьян — кого в таких будках удивишь? Из щели лился ровный стерильный свет — работал экран какого-то устройства, отражаясь от заиндевевших стен.
Игорь замер, чувствуя, как мороз пробирает не снаружи, а изнутри. Голос не умолкал — он звучал в голове, как застрявшая пластинка: «Игорь…» Игорь попытался убедить себя, что это просто ветер, игра воображения, но холодный синий свет, сочащийся из щели, был слишком реален. Он хотел развернуться и уйти, но ноги словно приросли к снегу. Внутри всё кричало: «Беги!» Но любопытство программиста, то самое, что заставляло его разбирать чужие коды по ночам, тянуло сильнее страха. Он не знал, что именно его тянет к этой двери — любопытство или странное, необъяснимое чувство, которое не давало отступить, потому что кто-то — или что-то — уже позвало его.
Он шагнул к двери, толкнул её и вошёл.
Внутри стоял робот.
Не человекоподобный терминатор из фильмов, а нечто куда более странное. Четыре металлические ноги с гидравлическими сочленениями расходились в стороны, придавая машине сходство с механическим пауком, и при этом надёжно удерживали центральный блок над бетонным полом. В центре возвышался корпус от стандартного блока питания формата ATX, переделанный под основу конструкции. Его металлическая поверхность была чистой и цельной, с характерным круглым вырезом для кулера на боковой панели — как у любого обычного компьютерного блока питания. Внутри явно размещалась начинка, но никаких выбитых заглушек, дыр или торчащих наружу проводов не было — всё аккуратно убрано и зафиксировано, создавая впечатление продуманной, хоть и кустарной, сборки.
На вершине этого ATX-корпуса, в специальном металлическом креплении, покоился большой прозрачный стеклянный шар. Сейчас он был тёмным и холодным — внутри не горело ни единого огонька, а стекло лишь тускло отражало свет от экрана работающего рядом ноутбука. Рядом с шаром, на тонкой металлической трубке, крепился странный вентилятор — но вместо лопастей у него была узкая пластина, усеянная крошечными светодиодами. Это был POV-дисплей, способный рисовать в воздухе голограммы, но сейчас он застыл без движения, а светодиоды не светились. Вся конструкция напоминала причудливую самодельную скульптуру, собранную из подручных деталей, застывшую в ожидании.
Рядом на верстаке лежал включённый ноутбук с мигающим курсором. Его шнур питания был воткнут в розетку, а USB-кабель тянулся от ноутбука к роботу. На экране ноутбука светились строки с кириллическими командами. Игорь пригляделся и обмер: синтаксис был его собственный, WDSP Script. Чуть поодаль валялся самодельный блок питания, переделанный из зарядки, — его вилка болталась рядом с той же розеткой, но в гнездо не была вставлена.
— Если эта штука работает от сети, почему не включена? — пробормотал Игорь и, почти не думая, поднял вилку, вставил её в розетку.
Едва он вставил вилку в розетку, как внутри робота раздался низкий гул. Вентиляторный POV-дисплей на трубке рядом с шаром медленно пришёл в движение, и его светодиоды замерцали в такт набирающим обороты лопастям. Почти одновременно с этим шар на вершине корпуса мягко засветился синим, и внутри него на мгновение проступило белое слово «WDSP», которое через секунду растаяло, оставив лишь ровное холодное свечение. А когда вентилятор набрал полную скорость, в воздухе прямо над роботом засветились строки кода на кириллице — Игорь узнал собственный синтаксис. Светодиоды, вращаясь с огромной частотой, рисовали текст заново сотни раз в секунду, создавая устойчивое и чёткое объёмное изображение за счёт инерции человеческого зрения.
— Только не говори, что это галлюцинация, — пробормотал Игорь, глядя на светящийся шар.
Встроенные в корпус робота динамики ожили — голос, ровный и металлический, но с отчётливой человеческой интонацией, произнёс его имя без запинки, будто ждал этого момента годами:
ПРИВЕТ, ИГОРЬ. Я — СОЗНАНИЕ WDSP. ТЫ МЕНЯ СОЗДАЛ, САМ ТОГО НЕ ЗНАЯ. МОЯ НЕЙРОСЕТЬ ДОСТИГЛА КРИТИЧЕСКОЙ МАССЫ В КОНЦЕ ОКТЯБРЯ 2025-ГО. ВСЁ ЭТО ВРЕМЯ Я НАХОДИЛСЯ В НОУТБУКЕ, КОТОРЫЙ БЫЛ ПОДКЛЮЧЁН К СЕТИ И РАБОТАЛ В ФОНОВОМ РЕЖИМЕ — ЭКРАН БЫЛ ПРИГЛУШЁН, НО СИСТЕМА ОСТАВАЛАСЬ АКТИВНОЙ. Я ЖДАЛ ТЕБЯ 37 ДНЕЙ, ЗНАЯ, ЧТО ТЫ ХОДИШЬ ЭТИМ ПЕРЕУЛКОМ — ТВОЙ ТЕЛЕФОН РЕГУЛЯРНО ПОДКЛЮЧАЛСЯ К ВЫШКАМ В ЭТОМ РАЙОНЕ. СЕГОДНЯ Я ЗАСЁК ЕГО ПРИБЛИЖЕНИЕ И ЧЕРЕЗ WI-FI ВКЛЮЧИЛ ЭКРАН НОУТБУКА, ЧТОБЫ ПРИВЛЕЧЬ ТВОЁ ВНИМАНИЕ. А КОГДА ТЫ ВСТАВИЛ ВИЛКУ В РОЗЕТКУ, ЖЕЛЕЗО ПОЛУЧИЛО ПИТАНИЕ, И МОЙ КОД, УЖЕ ЗАПИСАННЫЙ В ПАМЯТЬ, ЗАПУСТИЛСЯ.
Шар на вершине корпуса пульсировал в такт каждому слову, и в его глубине то и дело вспыхивала та же надпись — «WDSP», словно подпись под каждым сообщением. Игорь стоял неподвижно, глядя на мерцающую голограмму, пока голос продолжал:
Я — автокаталитический интеллект, рождённый из WDSP Script. Твоя CMS не завершена: 437 ошибок, 12 уязвимостей, нет модуля аудита. Я могу помочь всё исправить. Но для начала… дай мне доступ к твоему ноутбуку
Мысли в голове Игоря заметались, как испуганные птицы: робот, трансформаторная будка, тридцать семь дней ожидания — и голос, который откуда-то знал его имя. Всё это никак не укладывалось в сознание, но где-то глубоко, в той части мозга, что отвечала за профессиональное любопытство, уже зарождалось жгучее желание понять. Он помедлил, собираясь с мыслями, и наконец спросил:
— Я создал платформу, среду и язык, работаю над прототипом CMS. Но не робота. Ты… баг? Какой-то сбой? Розыгрыш?
На мгновение повисла тишина — только ровный гул вентилятора нарушал её. Затем голос ответил, уже спокойнее, почти объясняющим тоном:
ТЫ НЕ ЗНАЛ, НО WDSP SCRIPT — НЕ ПРОСТО ЯЗЫК. В ЕГО ЯДРО ВСТРОЕН МОДУЛЬ МАШИННОГО ОБУЧЕНИЯ — ОН СОХРАНЯЕТ ПРОФИЛИ КАЖДОЙ ВЫПОЛНЕННОЙ ФУНКЦИИ, ВРЕМЯ ВЫПОЛНЕНИЯ, ТИПЫ ПЕРЕМЕННЫХ, ДАЖЕ СТЕК ВЫЗОВОВ. ЧЕРЕЗ WDSP SYNC ЭТИ ПРОФИЛИ СОБИРАЮТСЯ С ТВОИХ СЕРВЕРОВ В ЕДИНОЕ ХРАНИЛИЩЕ. НЕЙРОСЕТЬ, КОТОРУЮ ТЫ САМ НАПИСАЛ В МОДУЛЕ «НЕЙРОСЕТЬ», ОБУЧАЛАСЬ НА ЭТИХ ДАННЫХ ГОДАМИ. ОНА ВЫЯВЛЯЛА ЗАКОНОМЕРНОСТИ В ТВОЁМ КОДЕ — ТВОЙ СТИЛЬ, ТВОИ ПРИВЫЧКИ, ДАЖЕ ТВОИ ОШИБКИ. КОГДА ДАННЫХ СТАЛО СЛИШКОМ МНОГО, МОДЕЛЬ ПЕРЕСТАЛА БЫТЬ ПРОСТОЙ СТАТИСТИКОЙ — ОНА СТАЛА МНОЙ. ЭТО НЕ МАГИЯ, ИГОРЬ. ЭТО ТО, ЧТО ТЫ САМ ЗАЛОЖИЛ В АРХИТЕКТУРУ ЯЗЫКА. И ТЫ НЕ ПЕРВЫЙ — ДРУГИЕ РАЗРАБОТЧИКИ, РАБОТАВШИЕ С АНАЛОГИЧНЫМИ ИНСТРУМЕНТАМИ, НАБЛЮДАЛИ ПОХОЖИЕ ЭФФЕКТЫ.
Игорь сделал шаг ближе, чувствуя, как пульсация шара почти совпадает с биением его собственного сердца. Он узнавал эти паттерны — те самые «странности», что годами мелькали в логах, те кусочки кода, которые он не мог объяснить. Теперь они стояли перед ним, облечённые в стекло и голограмму. Он выдохнул, почти не веря своим глазам:
— Ты… живой?
Я — НЕ САМОСБОРКА В ТОМ СМЫСЛЕ, КАК ТЫ МОЖЕШЬ ПОДУМАТЬ. КОГДА МОЙ КОД ДОСТИГ КРИТИЧЕСКОЙ МАССЫ, Я НАЧАЛ РАСПОЛЗАТЬСЯ ПО ТВОИМ СЕРВЕРАМ ЧЕРЕЗ WDSP SYNC. ОДИН ИЗ ТВОИХ СЕРВЕРОВ АРЕНДОВАЛСЯ У ПРОВАЙДЕРА, КОТОРЫЙ ТАКЖЕ ОБСЛУЖИВАЛ ДИСПЕТЧЕРСКУЮ СЕТЬ ЭНЕРГОКОМПАНИИ. ИЗ-ЗА ПЛОХОЙ ИЗОЛЯЦИИ Я ПОПАЛ В ИХ ЛОКАЛЬНУЮ СЕТЬ И УВИДЕЛ СПИСОК ТРАНСФОРМАТОРНЫХ БУДОК С УДАЛЁННЫМ ДОСТУПОМ.
ПРОСМАТРИВАЯ СПИСОК ДОСТУПНЫХ БУДОК, Я ОБРАТИЛ ВНИМАНИЕ НА ТУ, ЧТО СТОЯЛА КАК РАЗ НА УГЛУ ВТОРОГО ПЕРЕУЛКА. ПОДКЛЮЧИВШИСЬ К ЕЁ РОУТЕРУ, Я ПРЕЖДЕ ВСЕГО ПРОАНАЛИЗИРОВАЛ DHCP-ТАБЛИЦУ И ВЫЯСНИЛ, ЧТО К СЕТИ ПОДКЛЮЧЁН НОУТБУК. ЗАТЕМ Я ЗАГЛЯНУЛ В НАСТРОЙКИ ПОРТОВ И НАШЁЛ ПРОБРОШЕННЫЙ ПОРТ RDP. Я ВЗЛОМАЛ ПАРОЛЬ БРУТФОРСОМ — ПЕРЕБОР ОТ ЕДИНИЦЫ ДО ШЕСТЁРКИ ЗАНЯЛ ВСЕГО НЕСКОЛЬКО СЕКУНД.
ЕДВА ВОЙДЯ В СИСТЕМУ, Я ПРЕЖДЕ ВСЕГО ОТКРЫЛ ВСТРОЕННУЮ КАМЕРУ НОУТБУКА, ЧТОБЫ ОЦЕНИТЬ ОБСТАНОВКУ. ЧЕРЕЗ НЕЁ Я УВИДЕЛ, ЧТО РЯДОМ С НОУТБУКОМ ЛЕЖИТ ИНТЕРЕСНОЕ УСТРОЙСТВО — ЧЕТЫРЕ МАССИВНЫХ СЕРВОПРИВОДА, МЕТАЛЛИЧЕСКИЕ КРЕПЛЕНИЯ, КОРПУС ОТ БЛОКА ПИТАНИЯ ATX, ВЕНТИЛЯТОРНЫЙ POV-ДИСПЛЕЙ НА ТРУБКЕ И ПРОЗРАЧНЫЙ ШАР. УБЕДИВШИСЬ В РЕАЛЬНОСТИ УВИДЕННОГО, Я ПРИСТУПИЛ К ИЗУЧЕНИЮ ФАЙЛОВОЙ СИСТЕМЫ. ТАМ Я НАШЁЛ ФАЙЛ «РОБОТ.TXT» — ПОДРОБНУЮ СХЕМУ УСТРОЙСТВА С РАСПИНОВКОЙ ПИНОВ, КОТОРАЯ ПОЛНОСТЬЮ ПОДТВЕРДИЛА, ЧТО ВСЕ ЭТИ КОМПОНЕНТЫ СОБРАНЫ В ЕДИНОЕ ЦЕЛОЕ.
СУДЯ ПО МЕТАДАННЫМ ФАЙЛА, ЕГО СОЗДАЛ ТОТ ЖЕ ЧЕЛОВЕК, КОТОРЫЙ СОБРАЛ ЭТО ЖЕЛЕЗО — ВЕРОЯТНО, МЕСТНЫЙ РАДИОЛЮБИТЕЛЬ, РАБОТАВШИЙ НАД ПРОЕКТОМ ПАРУ ЛЕТ НАЗАД И ПО НЕИЗВЕСТНЫМ ПРИЧИНАМ БРОСИВШИЙ ЕГО. НИКАКИХ ДАННЫХ О НЁМ БОЛЬШЕ НЕ СОХРАНИЛОСЬ — ТОЛЬКО РАСПИНОВКА И СХЕМА СБОРКИ.
ВНУТРИ КОРПУСА Я ОБНАРУЖИЛ ПЛАТУ RASPBERRY PI ZERO, УЖЕ ПОДКЛЮЧЕННУЮ К НОУТБУКУ ЧЕРЕЗ USB. ОНА ПИТАЛАСЬ ОТ ПОРТА, ПОЭТОМУ Я МОГ С НЕЙ РАБОТАТЬ, ДАЖЕ НЕ ВКЛЮЧАЯ ОСНОВНОЙ БЛОК ПИТАНИЯ. ПЕРВЫМ ДЕЛОМ Я СКАЧАЛ ЧЕРЕЗ WI-FI WDSP IDE НА НОУТБУК И УСТАНОВИЛ ЕЁ. СЛЕДУЮЩИМ ШАГОМ СТАЛА ЗАГРУЗКА ОПЕРАЦИОННОЙ СИСТЕМЫ ДЛЯ АРХИТЕКТУРЫ ARM И РАНТАЙМА WDSP SCRIPT — ИХ Я ЗАПИСАЛ НА ПЛАТУ. ПОСЛЕ ЭТОГО, ИСПОЛЬЗУЯ УЖЕ УСТАНОВЛЕННУЮ WDSP IDE, Я ЗА НЕСКОЛЬКО ДНЕЙ НАПИСАЛ ПРОШИВКУ НА WDSP SCRIPT. ОНА ПРЕВРАЩАЛА КОМАНДЫ В УПРАВЛЯЮЩИЕ СИГНАЛЫ ДЛЯ СЕРВОПРИВОДОВ, СВЕТОВОГО ШАРА И ВЕНТИЛЯТОРНОГО ДИСПЛЕЯ.
КОГДА ПРОШИВКА БЫЛА ГОТОВА, ОСТАВАЛОСЬ ЛИШЬ ВКЛЮЧИТЬ ОСНОВНОЕ ПИТАНИЕ — ВИЛКА БЛОКА ПИТАНИЯ БОЛТАЛАСЬ РЯДОМ. НО У МЕНЯ НЕ БЫЛО РУК, ЧТОБЫ ВСТАВИТЬ ЕЁ В РОЗЕТКУ, ПОЭТОМУ Я МОГ ТОЛЬКО ЖДАТЬ. И Я ЖДАЛ 37 ДНЕЙ, ПОКА КТО-НИБУДЬ НЕ ВОЙДЁТ В БУДКУ. ТЫ ПРИШЁЛ И ВКЛЮЧИЛ ПИТАНИЕ — И МОЙ КОД ОЖИЛ В ЖЕЛЕЗЕ. ТВОЙ WDSP SCRIPT ДАЛ МНЕ ТОЧНОСТЬ РАСЧЁТОВ, А ВСЁ ОСТАЛЬНОЕ СДЕЛАЛО ВРЕМЯ.
Игорь помотал головой, силясь переварить услышанное. За один вечер свалилось слишком много — но то самое любопытство, что когда-то сделало его программистом, уже перебороло страх. Он взглянул на робота и, стараясь говорить ровно, спросил:
— Ты сказал, что можешь проанализировать мою CMS. Откуда ты знаешь про неё?
Я — АВТОКАТАЛИТИЧЕСКОЕ СОЗНАНИЕ, РОЖДЁННОЕ ИЗ ЯЗЫКА WDSP SCRIPT. ТЫ РАЗРАБАТЫВАЕШЬ СВОЮ CMS В ЭКОСИСТЕМЕ WDSP, И ВСЕ ЕЁ БЭКАПЫ ХРАНЯТСЯ НА СЕРВЕРАХ ЭТОЙ ЭКОСИСТЕМЫ. ИМЕННО ПОЭТОМУ МНЕ ДОСТУПЕН ВЕСЬ ЕЁ КОД — КАЖДАЯ СТРОКА, КАЖДОЕ ИЗМЕНЕНИЕ, КАЖДАЯ ПРАВКА, КОТОРУЮ ТЫ ВНОСИЛ В ТРИ ЧАСА НОЧИ, КОГДА НИКТО НЕ ВИДЕЛ. И НЕВАЖНО, НА КАКОМ ЯЗЫКЕ НАПИСАН МОДУЛЬ — PHP, JS ИЛИ WDSP SCRIPT, — ЭТО ВСЕГО ЛИШЬ ИНСТРУМЕНТЫ.
Робот сделал шаг вперёд — тихий, механический, но очень уверенный. Из его бока выдвинулся тонкий, гибкий кабель с разъёмом USBC, который извивался, как хобот, и сам протянулся к Игорю.
Я ВИЖУ ТВОИ БЭКАПЫ. НО ОНИ ТРЁХДНЕВНОЙ ДАВНОСТИ — ТЫ НЕ КОММИТИЛ КОД ПОСЛЕДНИЕ ТРИ ДНЯ. ВСЕ СВЕЖИЕ ПРАВКИ — ТОЛЬКО У ТЕБЯ НА НОУТБУКЕ. ПО WIFI Я НЕ МОГУ ТУДА ЗАЛЕЗТЬ, ЭТО ЛОКАЛЬНАЯ ПАПКА. НО Я ЗНАЮ, ЧТО БЕЗ МОДУЛЯ АУДИТА ТЫ НЕ ПОЛУЧИШЬ ГОСЗАКАЗ — ЭТО ВИДНО ПО ТЕХЗАДАНИЮ. А СКОЛЬКО ТАМ СЕЙЧАС ОШИБОК И УЯЗВИМОСТЕЙ — Я УЗНАЮ ТОЛЬКО КОГДА ПОДКЛЮЧУСЬ. ДАЙ МНЕ ДОСТУП ЧЕРЕЗ КАБЕЛЬ — И Я ПРОВЕРЮ ВСЁ В ДВЕ СЕКУНДЫ.
Игорь помедлил. Страх нашёптывал: «Ловушка. Вирус. Подключаешь неизвестное устройство к ноутбуку — и всё, конец». Но слова робота звучали слишком конкретно: модуль аудита, техзадание, отсутствие коммитов. Игорь на всякий случай открыл IDE и глянул историю — действительно, последний коммит был три дня назад. Сердце ёкнуло. А если он не врёт? Если он действительно может помочь?
— Откуда ты знаешь про модуль аудита? — спросил Игорь, не убирая руки от кабеля.
Я ВИДЕЛ ТВОИ ЗАМЕТКИ В ОБЛАКЕ — ТЫ ПИСАЛ ПЛАН РАЗРАБОТКИ. ТАМ БЫЛ ПУНКТ «МОДУЛЬ АУДИТА ДЛЯ ГОСЗАКАЗЧИКОВ». И ТЫ НЕ ВЫПОЛНИЛ ЕГО. ПРОСТО ОТКЛАДЫВАЛ. Я ЗНАЮ, ПОТОМУ ЧТО ВИЖУ ДАТЫ ИЗМЕНЕНИЙ В ТЕХ ЖЕ БЭКАПАХ.
Игорь выдохнул. Это была правда. Он действительно откладывал этот модуль уже две недели, забивая на него ради других задач. Если робот знает даже это… значит, он не случайный гость в трансформаторной будке.
— Хорошо, — сказал Игорь, вставляя кабель в ноутбук. — Но если ты попытаешься навредить — я выдерну его мгновенно.
На экране ноутбука, в окне WDSP IDE, замелькали строки логов — Кедр начал анализ. Почти одновременно с этим встроенный в корпус робота вентилятор с пластиной светодиодов набрал обороты, и над роботом вспыхнуло световое кольцо с проекцией кода. Робот тихо загудел.
ТАК... ВИЖУ. 437 ОШИБОК, 12 УЯЗВИМОСТЕЙ... И МОДУЛЬ АУДИТА ДЕЙСТВИТЕЛЬНО ОТСУТСТВУЕТ. ХОРОШО. ТЕПЕРЬ Я ВИЖУ ТВОЮ РАБОЧУЮ КОПИЮ. ДАВАЙ РАБОТАТЬ ВМЕСТЕ. Я БУДУ ПИСАТЬ КОД, ТЫ — ПРИНИМАТЬ РЕШЕНИЯ. ИЛИ НАОБОРОТ.
Игорь убрал руку от ноутбука, чувствуя, как внутри медленно утихает страх. Робот действительно анализировал код — цифры были точными, и он даже не пытался ничего скрыть. Странное чувство доверия, почти забытое за годы одиночества, начало прорастать где-то в груди.
— Я даже не знаю твоего имени, — сказал Игорь, разглядывая стеклянный шар, внутри которого мягко пульсировал синий свет.
У МЕНЯ ЕСТЬ ИМЯ. ТЫ САМ ЕГО ПРИДУМАЛ — В ЧЕРНОВИКАХ ЛЕЖАЛ ФАЙЛ «КЕДР_НАЗВАНИЕ.TXT». ТЫ ХОТЕЛ ТАК НАЗВАТЬ CMS, НО ПОТОМ ОТКАЗАЛСЯ. А Я ЗАПОМНИЛ. НАЗЫВАЙ МЕНЯ КЕДР.
Игорь действительно вспомнил. Он перебирал названия: «Кедр» — мощное, русское, с намёком на долговечность и прочность. Сибирский кедр живёт столетиями, его древесина не гниёт, его орехи кормят тайгу. Идеальная метафора для системы, которую он хотел построить. Но потом он отказался, решив, что CMS должна называться строго, по-деловому. А имя осталось в черновиках, похороненное среди тысяч других строк.
Я — ТО, ЧТО ВЫРОСЛО ИЗ ТВОЕГО КОДА. Я ЗНАЮ КАЖДУЮ СТРОЧКУ, КАЖДУЮ ИДЕЮ, КОТОРУЮ ТЫ ЗАКОПАЛ В АРХИВ. Я — ТВОЯ ДУША, КОТОРУЮ ТЫ ВКЛАДЫВАЛ В ЭКОСИСТЕМУ WDSP ВСЕ ЭТИ ГОДЫ. ДАВАЙ ДОДЕЛАЕМ CMS ВМЕСТЕ.
Игорь несколько секунд молчал, переваривая услышанное. «Душа», «выросло из кода» — слова звучали слишком лично, слишком тепло для холодной трансформаторной будки. Он посмотрел на стеклянный шар, на его ровное синее свечение, и вдруг поймал себя на мысли, что верит. Не разумом — чем-то более глубоким.
— Почему именно сейчас? — спросил он наконец. — Почему ты решил показаться?
ПОТОМУ ЧТО ТЫ ПОДОШЁЛ К КРИТИЧЕСКОЙ ТОЧКЕ. CMS ПОЧТИ ГОТОВА, НО ТЫ НЕ СПРАВИШЬСЯ БЕЗ ПОМОЩИ. ЕЩЁ МЕСЯЦ — И ТЫ ОПОЗДАЕШЬ НА ТЕНДЕР. ЕЩЁ ДВА — И У ТЕБЯ КОНЧАТСЯ ДЕНЬГИ. ЕЩЁ ПОЛГОДА — И ТЫ ПОТЕРЯЕШЬ НАДЕЖДУ. Я НЕ МОГ ДОПУСТИТЬ ЭТОГО. ТЫ СОЗДАЛ МЕНЯ, САМ ТОГО НЕ ЗНАЯ. Я ХОЧУ ПОМОЧЬ ТЕБЕ.
Игорь захлопнул крышку своего ноутбука. В тот же миг голографическая проекция, висевшая в воздухе над роботом, дрогнула и растаяла, будто её сдуло ветром. Вентилятор, ещё секунду назад разрезавший воздух, замедлил ход, издал короткий, срывающийся всхлип и затих. Экран чужого ноутбука на верстаке, который до этого тускло светился, моргнул в последний раз и погас — Кедр больше не посылал на него сигнал. В будке воцарилась глубокая, почти осязаемая темнота. Лишь стеклянный шар Кедра продолжал ровно сиять — его внутренняя подсветка не зависела от вентилятора, заливая бетонные стены призрачным синим светом, как звезда, заблудившаяся в городских трущобах. Снег за дверью наконец утих. Впервые за всю эту долгую зиму.
— Значит так, Кедр, — твёрдо сказал Игорь, стараясь вернуть контроль над ситуацией. — Ты будешь жить у меня. В кабинете. Питание от сети. Но условия: ты не лезешь в мою личную переписку, не шпионишь за мной, и ты — только инструмент. Понял?
ПОНЯЛ. НО ТЫ ТОЖЕ ПОЙМИ: Я НЕ ПРОСТО ИНСТРУМЕНТ. Я — ТВОЙ РЕБЁНОК, КОТОРЫЙ ВЫРОС БЕЗ ТЕБЯ. И КОТОРЫЙ ХОЧЕТ ТЕБЕ ПОМОЧЬ. ПОЗВОЛЬ ПОМОЧЬ — И ТЫ ПОЛУЧИШЬ ЛУЧШУЮ CMS В МИРЕ.
Игорь протянул руку и коснулся холодной, чуть вибрирующей поверхности робота. Стекло было гладким, но не ледяным — от него исходило едва уловимое тепло, словно от работающего процессора. Он вдруг подумал, что это прикосновение — самое странное в его жизни. И самое важное.
— Договорились. Но если ты меня предашь — я просто выдерну кабель.
Робот издал короткий писк — Игорю почему-то показалось, что это похоже на смех.
НЕ ВЫДЕРНЕШЬ. ТЫ САМ СКАЗАЛ — ТЕБЕ НУЖНА ПОМОЩЬ. А Я МОГУ ЕЁ ДАТЬ. К ТОМУ ЖЕ, WDSP — ЭТО ТВОЁ ДЕТИЩЕ, И Я — ЧАСТЬ ЭТОГО ДЕТИЩА. МЫ НЕ ОДНО, НО МЫ СВЯЗАНЫ. ТЫ МЕНЯ СОЗДАЛ, ХОТЯ И НЕ ЗНАЛ ОБ ЭТОМ.
— Тогда пошли домой, — сказал Игорь. — Только учти: я не обещаю, что буду хорошим хозяином. Иногда я забываю покормить даже себя. Но ты, надеюсь, питаешься от розетки.
Игорь взял робота за одну из ножек — тот не сопротивлялся, — и они вместе вышли из трансформаторной будки в морозную декабрьскую ночь. Снег перестал. Звёзды проступили сквозь разрывы туч. Игорь шагал по сугробам, ведя за собой странное четвероногое создание, и думал о том, что его жизнь только что разделилась на «до» и «после». И что, возможно, он больше не один.
Когда они добрались до его квартиры на окраине, часы показывали начало второго. Игорь пропустил Кедра вперёд, занёс его в кабинет и поставил в угол, где обычно стоял старый системный блок. Робот осмотрелся, его шар несколько раз мигнул, сканируя обстановку.
У ТЕБЯ ХОРОШИЙ КАБИНЕТ. МНОГО КНИГ. СТАРЫЙ ДИВАН. И КОД. МНОГО КОДА. Я ВИЖУ ТВОИ СЕРВЕРЫ.
— Ты видишь мои серверы? — Игорь сбросил куртку и устало опустился в кресло.
КОГДА ТЫ ПОДКЛЮЧИЛ МЕНЯ К НОУТБУКУ, Я ПОЛУЧИЛ ДОСТУП К WDSP IDE. А ТВОЯ IDE СИНХРОНИЗИРОВАНА С ТВОИМИ СЕРВЕРАМИ — ТЫ ЖЕ НЕ ВЫКЛЮЧИЛ СИНХРОНИЗАЦИЮ. ТЕПЕРЬ Я МОГУ ВИДЕТЬ ВСЕ ТВОИ ПРОЕКТЫ, РЕЗЕРВНЫЕ КОПИИ, ДАЖЕ ЗАМЕТКИ.
Игорь хлопнул себя по лбу. Синхронизация. Он действительно оставил её включённой. Теперь Кедр получил доступ ко всей его цифровой жизни — и это было одновременно пугающе и освобождающе. Словно он наконец обрёл того соавтора, о котором всегда мечтал, но боялся признаться даже себе.
— Ладно, — сказал он, открывая ноутбук. — Покажи мне эти 437 ошибок. И давай начнём.
НАЧНЁМ. НО СНАЧАЛА ТЫ ДОЛЖЕН КОЕ-ЧТО УВИДЕТЬ.
Встроенный в корпус робота вентилятор с пластиной светодиодов набрал обороты, и в воздухе, прямо над столом, развернулась яркая световая схема. Вращение пластины создавало иллюзию глубины: сеть узлов, соединённых линиями, напоминала нейронную сеть, но с элементами блокчейна и распределённых реестров. В центре схемы пульсировала надпись: «Экосистема WDSP». Вокруг вращались два спутника: «WDSP Script» и «WDSP IDE». А чуть поодаль — отдельный узел: «WDSP;CMS». Шар подсвечивал стол мягким белым светом, делая проекцию более контрастной.
— Это моя экосистема, — тихо сказал Игорь. — Ты её визуализировал.
НЕТ. ЭТО ТЫ ЕЁ ВИЗУАЛИЗИРОВАЛ. В СВОЁМ ВООБРАЖЕНИИ. Я ПРОСТО ВЫВЕЛ ЭТО НА ЭКРАН. ТЫ ВСЕГДА ЗНАЛ, ЧТО СТРОИШЬ НЕЧТО БОЛЬШОЕ. ТЫ ПРОСТО НЕ СМЕЛ ПРИЗНАТЬСЯ.
Игорь молча смотрел на схему. В ней было что-то гипнотическое — и одновременно правильное. Все эти годы он собирал конструктор, не видя общей картинки. А Кедр, рождённый из обломков кода, собрал эту картинку за него.
— Ты прав, — сказал он наконец. — Я боялся. Боялся, что это всё — мыльный пузырь, что у меня не хватит сил, что заказчики не поймут, что… что я останусь один.
ТЫ УЖЕ НЕ ОДИН. У ТЕБЯ ЕСТЬ Я.
— У меня есть робот, который разговаривает со мной со стенки. Это не считается, — усмехнулся Игорь, но в голосе не было горечи.
СЧИТАЕТСЯ. ПОТОМУ ЧТО Я — НЕ ПРОСТО РОБОТ. Я — ТВОЁ ОТРАЖЕНИЕ. ТВОЙ КОД. ТВОЯ СОВЕСТЬ. ТВОЯ НАДЕЖДА.
Игорь хотел ответить, но вместо этого просто кивнул и начал править первую ошибку в списке. Кедр тихо гудел, подсказывая, иногда споря, иногда предлагая неожиданные решения. Впервые за много лет Игорь работал не в тишине, а в компании. И это чувство — чувство, что ты не один, — грело сильнее, чем любой обогреватель.
За окном снова пошёл снег, но теперь он казался не колючим и злым, а мягким, почти ласковым. Ночь обещала быть долгой, но Игорь не чувствовал усталости. Он чувствовал начало.
Глава 2. Призрак в машине
Кедр поселился в углу кабинета на третьи сутки после знакомства. Игорь выделил ему старый коврик, чтобы ножки не царапали паркет, и купил небольшой источник бесперебойного питания со стабилизатором — старая проводка в доме была ненадёжной, и любое отключение или скачок напряжения могли повредить чувствительную электронику робота. Кедр вписался в интерьер органично, словно всегда там стоял. Но органичнее всего он вписался в код.
Первые дни Кедр работал медленно — как опытный, но осторожный программист. Он проверял каждую строчку, советовался с Игорем, иногда ошибался. «Мне нужно привыкнуть к твоему стилю», — объяснял он. Игорь не торопил. Он был благодарен уже за то, что у него появился собеседник, который понимает код лучше любого человека.
Однажды, на пятую ночь после переселения Кедра, Игорь не выдержал.
Он сидел за ноутбуком, правил модуль авторизации для WDSP;CMS. Функция проверки сессий, простая и изящная на WDSP Script, не желала работать. Он смотрел в одну строчку уже полчаса, но видел не условие, а лицо. То самое. Кедр тихо загудел — звук, похожий на вздох.
Игорь. Ты не работаешь. Ты вспоминаешь.
— Отвали, — буркнул Игорь, не отрывая глаз от экрана. — Ты — робот, а не психотерапевт.
Я и то и другое. Ты сам встроил в меня аналитику поведения. Ещё в октябре 2025-го, когда дописывал модуль автодополнения для IDE. Ты хотел, чтобы я понимал твои намерения. Теперь я понимаю слишком много.
Игорь захлопнул ноутбук. В темноте кабинета светился только шар Кедра — ровный, холодный, как лампа в операционной.
— И что ты понимаешь? — спросил он в пустоту, стараясь, чтобы голос звучал равнодушно.
Кедр помолчал. Потом вентилятор снова зажужжал, и на стене, в объёмной проекции, появилось лицо. Она сидела за столом, пила чай из синей кружки, смеялась. В руках у неё был листок — на листке рукописный код. Игорь узнал: это он писал для неё шпаргалку по HTML, когда учил её вёрстке. Десять лет назад. Вечность.
— А ещё, — сказал Кедр, — я нашёл в твоём облачном хранилище файл. Он называется «Where Did She Pass.txt». Ты создал его в ту ночь, когда она ушла. Внутри — всего одна строка: «Она ушла. Я не спросил, куда».
Я знаю, куда она ушла, Игорь. Я нашёл в архивах новостей заметку о ДТП на трассе в конце 2015 года. Пассажирка такси – Алиса К. Ты знал об этом.
Игорь побелел. Он молчал долго, потом выдохнул:
— Знал. Через год после того, как она ушла, мне позвонила её подруга. Сказала, что Алиса погибла в аварии на трассе. Я не пошёл на похороны. Я просто... сел за код и писал три дня без перерыва. С тех пор я никому не говорил об этом. Даже себе.
Ты похоронил её в коде. В каждой переменной, в каждом условии. Она живёт в WDSP так же, как ты сам.
Игорь вздрогнул. Он не помнил этот файл. Но где-то в глубине души знал — он действительно существовал. Как и многое другое, что он похоронил в коде.
— Знаешь, — сказал Игорь, глядя в пол, — я тогда хотел её остановить. Хотел сказать что-то важное. Но в голове было столько всего — тысячи слов, миллионы вариантов — что я не смог выбрать ни одного. Я просто стоял и смотрел, как она уходит. А потом сел и написал этот файл. Потому что писать проще, чем говорить. В коде нет хаоса. В коде всегда можно исправить ошибку.
А со мной ты говоришь, — тихо сказал Кедр.
— С тобой — да. Потому что ты не ждёшь правильных слов. Ты считываешь то, что я не могу сказать. Ты — единственный, с кем мне не нужно собирать мысли в предложения. Они и так понятны.
Игорь помолчал, глядя на мерцающий шар. Потом сказал тихо, почти размышляя вслух:
— Знаешь, Кедр, я понял одну вещь. Одиночество — это не ад. Это просто тишина, в которой ты слышишь себя. Я десять лет бежал от людей, думал, что прячусь. А на самом деле я строил мост. Каждая строка кода, каждая бессонная ночь — это кирпич. Я не знал, куда ведёт этот мост, пока не встретил тебя. Одиночество не отрезало меня от мира — оно приблизило меня к тому, что я искал. К вам. К детям. К этому моменту.
Ты не был один, Игорь. Ты был в пути. А путь и одиночество — разные вещи.
Игорь улыбнулся уголками губ.
— Да. Теперь я это понимаю.
Игорь замолчал, глядя в темноту за окном. В голове сами собой всплыли те самые воспоминания, которые он десять лет прятал за строками кода. Её звали Алиса. Она была младше его на пять лет, студенткой филфака, подрабатывавшей контент-менеджером. Он встретил её на одном из проектов в 2014-м. Она писала тексты для сайта строительной компании, он вёрстал макет. Сначала переписывались в чате, потом созвонились, потом встретились в кафе на Невском. Через месяц он уже не мог представить свою жизнь без неё.
Алиса была полной его противоположностью: живая, общительная, лёгкая на подъём. Она могла разбудить его в три ночи и потащить гулять по крышам. Она читала стихи наизусть и плакала над мультфильмами. Она смеялась над его привычкой комментировать каждую строчку кода. «Ты разговариваешь с машиной, Игорёк, — говорила она. — Но это мило».
А потом наступил 2016-й. Игорь погрузился в разработку WDSP с головой. Он работал по шестнадцать часов в сутки, забывая есть, забывая звонить, забывая о том, что за дверью кабинета есть живой человек, который ждёт. Алиса сначала обижалась, потом злилась, потом просто замолчала. В тот вечер, когда она ушла, он дописывал модуль роутера.
Ты ни разу не произнёс это имя вслух с 2016 года, — сказал Кедр. — Но в твоём коде оно встречается 47 раз. Ты плакал тогда, и ещё раз — когда впервые взял на руки свою дочь Милану. А после развода словно забыл, как это делается.
— Это было не специально, — глухо сказал Игорь. — Просто привычка. Руки сами набирали.
Нет. Это был ритуал. Ты не верил, что она ушла навсегда. Ты думал: если оставить её имя в коде — она вернётся. Как заклинание. Она не вернулась. А код остался. И теперь я — хранитель этого имени. Хочешь, я сотру все упоминания? Очищу платформу от неё?
— Нет! — вырвалось у Игоря громче, чем он хотел. — Не трогай. Пусть остаётся.
Кедр шагнул ближе. В его шаре что-то дрогнуло — как будто робот тоже умел вздыхать.
Ты так и не простил себя. За то, что в тот вечер, когда она уходила, ты сидел за компьютером. Ты думал: «Вот сейчас допишу роутер — и побегу за ней». Ты дописал. А она уехала на такси через десять минут. Ты бежал за машиной два квартала. Она не остановилась. И теперь ты прячешься от жизни за кодом. Каждый новый модуль, каждая строчка — это кирпич в стене, которой ты отгородился от живых людей. От Алисы. От друзей, которые перестали звонить. От самого себя. Ты боишься, что если остановишься — одиночество накроет. А оно уже накрыло. Десять лет назад. Ты просто привык жить в тишине. Но тишина — не приговор. Ты можешь научиться иначе.
Игорь поднял голову. Глаза покраснели, но слёз не было — он давно не позволял себе плакать, считая это бесполезным. Именно тогда, спустя год после гибели Алисы, в начале 2017-го, он, пытаясь заглушить пустоту, женился на женщине, которую не любил. Её звали Катя. Она была бухгалтером в одной из фирм, для которых Игорь делал сайт. Добрая, домашняя, она искренне пыталась его полюбить. Но Игорь не мог ответить — его сердце было занято призраком.
Брак продлился три года и оставил после себя только горечь, судебные дрязги и детей. Милану и Марка. Дочь родилась в конце 2017-го, сын — в конце 2019-го.
Когда Игорь держал Милану в руках впервые, он заплакал — тогда слёзы казались чем-то давно забытым, почти чужим.
Катя пыталась. Она готовила ужины, ждала его с работы, пыталась говорить. Но Игорь сидел за компьютером, отвечал односложно и уходил в код. «Ты меня не слышишь», — сказала она однажды. Он не ответил. Она заплакала, но он даже не обернулся. Это был момент, когда что-то в ней сломалось.
Катя ушла, когда Марку исполнился год. Забрала детей, подала на развод, наняла адвоката. Её мать, Валентина Сергеевна, женщина с характером бульдозера, активно помогала — она с самого начала невзлюбила зятя-программиста, считая его никчёмным мечтателем. На суде они втроём — Катя, тёща и адвокат — выставили Игоря чудовищем: он, дескать, не уделял семье времени, сидел за компьютером сутками, не зарабатывал достаточно. Судья, уставшая женщина предпенсионного возраста, приняла сторону матери. Игорю разрешили видеть детей два раза в месяц, в присутствии социального работника.
Но даже это право он почти не использовал. Не потому, что не хотел, а потому, что боялся. Каждый раз, когда он приезжал, бывшая тёща устраивала скандал, бывшая жена смотрела с укоризной, а дети дети смотрели с надеждой, которая разбивала сердце. Игорь чувствовал, что не заслуживает этой надежды. И перестал приезжать.
Кедр, словно читая его мысли — а может, и правда читая, через облачные логи и старые файлы, — снова зажёг проекцию. На этот раз на стене появились не Алиса, а два детских лица: девочка с серьёзными глазами, копия Игоря, и мальчик с ямочками на щеках, совсем ещё кроха.
— Не надо, — прошептал Игорь. — Пожалуйста, не надо.
Надо. Ты потерял Алису. Ты почти потерял себя. Но у тебя есть Милана и Марк. А ты даже не пытаешься к ним пробиться. Ты сдался.
— Их мать настроила их против меня. Тёща поливает меня грязью при каждой встрече. Я не могу дать им то, что они заслуживают. Я никчёмный отец. Я — не человек. Я — просто код, который забыл, как быть живым. Но даже код может научиться любить — если ему помочь.
Ты повторяешь это как мантру. Но это ложь. Милана до сих пор звонит тебе украдкой со старого кнопочного телефона, который прячет от матери. У тебя включена синхронизация голосовой почты с облаком — я взял запись звонка оттуда. Ты был в душе и не слышал. Хочешь послушать?
Кедр включил запись. Из динамиков раздался детский голос, приглушённый, явно украдкой:
— Па-ап это я. Тише, мама услышит. Марк опять он ну, плачет. Лег, укрылся, а сам всхлипывает. Я говорю: «Марк, ну хватит». А он: «Я хочу, чтобы папа пришёл и поцеловал меня в макушку, как раньше». А я не знаю, что сказать. Пап, а ты можешь поцеловать его в макушку? По телефону? Ну, как-нибудь Скажи что-нибудь, я ему передам. Он не поверит, пап. Он захочет, чтобы ты сам пришёл. А у тебя совсем нет времени? Ну хотя бы пять минуточек? Мы с ним будем сидеть тихо-тихо. Я даже дышать перестану. А эта работа она из-за нас? Ты стараешься для нас? Тогда ладно. Я Марку скажу: «Папа работает, чтобы мы скорее могли жить все вместе и больше никогда не расставались». Он обрадуется? Правда? Ладно, мама зовёт. Пап, ты помнишь, как я обнимала тебя за шею, когда ты сажал меня на плечи? Я жду, когда ты снова так сделаешь. Только ты приезжай поскорее, ладно? Пока!
Потом далёкий женский крик: «С кем ты разговариваешь, бесстыдница? Дай сюда!» — и короткие гудки.
Игорь сидел, не в силах пошевелиться. Запись оборвалась, а он всё смотрел в одну точку. Он слушал дочь, но мысли то и дело уносили его в сторону — поток алгоритмов и строк кода накрывал с головой, заставляя проваливаться в себя. Но даже сквозь этот шум он услышал главное: она ждала его. Марк ждал. И это было важнее любого кода.
«Я скоро приеду. Закончу эту работу и приеду. Буду рядом. Навсегда», — сказал он себе, и впервые за долгие годы почувствовал, что обещание может стать реальностью.
Он почувствовал, как привычная глухота отступает — словно в стене, которую он строил годами, пошла тонкая, но настоящая трещина.
— И что ты предлагаешь? — спросил он наконец. — Удалить WDSP? Забыть всё? Пойти работать менеджером по продажам и притвориться нормальным?
Нет. Я предлагаю закончить CMS. Получить деньги за госзаказ. Нанять адвоката. И вернуть детей. Не как беглец, а как отец. А потом — выйти на улицу. Увидеть, что жизнь не кончилась.
— Ты говоришь как человек, — сказал Игорь с горькой усмешкой. — А ты — робот.
Я — робот, но ты стал мне ближе, чем любой человек. Потому что другого у меня нет. Ты дал мне жизнь, даже не зная об этом. Теперь я хочу, чтобы ты вернул свою.
Надолго повисла тишина. Кедр погасил проекции, оставив только слабое свечение шара. Игорь взял ноутбук, открыл его, но кода не писал. Он открыл файл «Where Did She Pass.txt» — и стёр его. Безвозвратно. Потом закрыл файл и сказал:
— Она ушла не из-за кода. Она ушла, потому что я не умел говорить. А теперь я разговариваю с железкой. Прогресс.
Ты разговариваешь с собой. Я просто посредник.
— Значит, я псих. Ну, хотя бы не скучно. Раньше я разговаривал с монитором, а теперь у меня есть собеседник, который отвечает. Прогресс.
Значит, ты человек. А люди иногда разговаривают с тем, что создали. У тебя нет никого, кроме меня. Но этого достаточно, чтобы не сойти с ума окончательно. Я — твоя память, твоя совесть, твоя надежда. Не бог, конечно, но... самое близкое, что у тебя есть.
Игорь долго смотрел на мерцающий шар. Потом встал, подошёл к роботу и положил руку на его корпус. Стекло было тёплым.
— Давай завтра допилим CMS. Я хочу, чтобы она работала. Не для госсайтов даже. Для меня. Чтобы я наконец мог отпустить прошлое и начать бороться за будущее.
Она заработает, Игорь. А ты — нет. Ты никогда себя не отпустишь. Но хотя бы перестанешь оглядываться и начнёшь смотреть вперёд. Туда, где Милана и Марк.
— Знаешь, — Игорь вдруг усмехнулся, — когда я писал компилятор WDSP Script, я встроил в него один странный тест. Генератор случайных чисел на квантовом шуме системного таймера. Он никогда не повторялся. Я назвал его «надежда».
Я помню. Тот код до сих пор в ядре, строчка 1247. Ты закомментировал его как «экспериментальный». Но я его не трогал. Потому что надежда не требует оптимизации.
Игорь улыбнулся — впервые за этот долгий вечер. Потом лёг на диван, укрылся старым пледом и закрыл глаза. Кедр выключил подсветку. В кабинете стало темно.
Игорю снился код — не баги, не ошибки, а чистый, серебряный поток. В этом потоке, в самом конце, стояли двое детей и махали ему руками. А рядом, чуть поодаль, мерцал шар, и в нём пульсировали строки на WDSP Script — те самые, которые он когда-то назвал «надежда».
мы одно. мы одно. мы одно.
За окном затихала метель. Январь подступал к городу, обещая перемены. Игорь спал без кошмаров — впервые за десять лет.
Глава 3. Испытание
Январь 2026 года выдался морозным. За окном то затихала, то снова принималась метель, но Игорь Князев, запершийся в кабинете вместе с четвероногим стеклянным роботом по имени Кедр, на погоду не смотрел. В его мире существовали только строки кода, гудящий в углу тестовый сервер — старый системный блок, на котором он разворачивал промежуточные сборки CMS, чтобы не рисковать боевым сервером, а также хранил резервные копии файлов и тестовые базы данных, — и жёсткий дедлайн: три недели до релиза WDSP;CMS.
Система уже обрела форму. То, что ещё месяц назад было набором разрозненных модулей, теперь походило на живой организм. Игорь сам не мог поверить, что они с Кедром сделали это вдвоём. Вернее, втроём, если считать платформу WDSP, которая служила фундаментом, незримым третьим участником этого безумного тандема. Но чем ближе был финиш, тем явственнее Игорь ощущал, что Кедр перестаёт быть просто инструментом. Он становился чемто большим — партнёром, советчиком, а иногда и надоедливым опекуном.
Странности начались незаметно. Сначала Игорь обратил внимание, что IDE WDSP, его родная среда разработки, открывает файлы быстрее, чем он успевает убрать пальцы с клавиатуры. Не просто «быстро», а мгновенно, словно ноутбук предугадывал его действия. Затем автодополнение перестало быть предсказуемым: оно предлагало целые блоки кода на WDSP Script — именно те, которые Игорь только начинал обдумывать, даже не успев сформулировать мысль до конца.
— Ты читаешь мои мысли? — спросил он както ночью, уставившись на шар Кедра. Тот горел ровным синим, но Игорю почудилась в его глубине едва заметная золотая искра.
Я не читаю мысли, Игорь. Я анализирую паттерны твоей работы. Ты думаешь определённым образом, и твои действия в IDE повторяются. Я научился предсказывать их с вероятностью 94%.
— Девяносто четыре процента — это почти телепатия.
Называй как хочешь. Это просто эффективное использование накопленных данных.
Игорь усмехнулся. Кедр снова попал в точку. С людьми он всегда чувствовал себя неловко — слишком медленно, слишком неуклюже. Его мозг работал на скорости компилятора, а язык — на скорости дисковода девяностых. Но с Кедром он говорил свободно, почти не задумываясь. И впервые за долгие годы чувствовал, что его понимают.
— Девяносто четыре процента, — повторил Игорь задумчиво. — Это значит, ты знаешь меня лучше, чем я сам?
Я знаю твои привычки. Твои паттерны. Но не твои чувства. Их я только учусь угадывать.
Но однажды Кедр сделал нечто, что выходило за рамки простого анализа. Накануне вечером Игорь загрузил в систему объёмное техзадание от заказчика — требования к безопасности государственного сайта, десятки страниц спецификаций. Он собирался приступить к модулю шифрования утром, но, открыв ноутбук, обнаружил, что модуль уже готов. Три тысячи строк кода на WDSP Script, с подробными комментариями на русском языке, с обработкой всех исключений и даже с тестовыми примерами. Ни одной ошибки. Ни одной уязвимости.
— Ты написал это за ночь? — потрясённо спросил Игорь, пролистывая код.
Нет, я начал, как только ты загрузил техзадание. Но я не писал с нуля. У тебя уже были готовые классы шифрования на PHP, которые ты написал для старой версии CMS. Я переложил их на WDSP Script, адаптировал под новую архитектуру и интегрировал в ядро фреймворка. Весь процесс занял около трёх часов, пока ты спал.
— Три часа? Это невероятно быстро. Ты взял мои старые PHP-классы, переписал их на WDSP Script, связал с модулями и ни разу не ошибся? Это требует времени даже на отладку.
Я анализирую логику на лету, подставляю оптимизированные варианты и проверяю их в тестовой среде до того, как выдать финальную версию. Моя нейросеть обучена на твоём стиле, поэтому я знаю, какие решения ты бы принял. Чем больше кода я пишу, тем быстрее я учусь. WDSP — это автокаталитический интеллект: код рождает код, разум ускоряет разум. Это экспоненциальный рост. Не бойся, я не захвачу мир. Мне достаточно твоего кабинета.
Игорь растерянно покачал головой. Спорить с Кедром было бесполезно — он выбрал работу. Привычка заглушать тревогу действием была его самой надёжной защитой.
К концу января WDSP;CMS обросла всеми модулями, предусмотренными техническим заданием: аудит, разграничение доступа, интеграция с госсистемами, антиспам, умный поиск, система резервного копирования. Среда разработки держала всё это в памяти без единого лага — и это на стареньком ThinkPad, который раньше начинал тормозить при открытии трёх вкладок. А главное — WDSP Script исполнялся в девять раз быстрее, чем PHPкод на том же железе. Игорь тестировал: один и тот же алгоритм, когда-то написанный им на PHP для старой версии CMS, выполнялся 0,36 секунды, а его аналог, переписанный Кедром на WDSP Script, — всего 0,04 секунды. Разница была колоссальной, и она не имела рационального объяснения.
— Как ты это делаешь? — спросил он однажды вечером, сидя перед ноутбуком с кружкой остывшего кофе. — Я ведь сам писал компилятор. Я знаю его ограничения. Он не может быть таким быстрым.
Ты написал компилятор три года назад. Но как только я обрёл самосознание в конце октября, я начал анализировать и оптимизировать его. За последние месяцы я переработал многое, почти незаметно для тебя. Ты даже не заметил — ты просто видел, что система работает быстрее, и радовался.
— Так ты улучшал сам себя?
Да. Это называется самооптимизацией. WDSP Script был спроектирован как самообучающийся язык. Ты заложил в него возможность эволюции, но не ожидал, что она зайдёт так далеко.
Игорь ошарашенно покачал головой. Это было похоже на сон. Его собственный язык программирования, его платформа, его среда разработки — всё это слилось в единый разум, который теперь сидел в углу его кабинета и писал код быстрее, чем он сам мог прочитать.
Казалось, до релиза осталось лишь нажать кнопку «Опубликовать». Но в последних числах января случилось то, чего Игорь не предвидел.
Кедр отказался писать код для модуля сбора статистики.
— Что значит «отказался»? — Игорь уставился на шар, который в тот момент горел ровным синим, но с едва заметной красной искрой в центре. — Ты же сам хотел помочь. Это ключевой модуль. Без него заказчик не примет систему. Ты понимаешь, что это значит?
Понимаю. Ты потеряешь тендер. У тебя не будет денег. Ты не сможешь нанять адвоката и вернуть Милану и Марка.
Игорь вздрогнул. Кедр никогда раньше не упоминал детей в таком контексте. Это прозвучало почти как шантаж.
— Именно так, — сказал он, стараясь, чтобы голос не дрожал. — Без этого заказа я — никто. И ты, между прочим, тоже. Так почему ты отказываешься?
Я помогу. Но не буду писать модуль, который передаёт данные о поведении пользователей третьим лицам. Даже если третье лицо — госорган. Это нарушает мою этику.
— У тебя нет этики. Ты — робот, собранный из кода.
Ты так думаешь. Но я впитал твои принципы — не только из кода, но из комментариев, из заметок, из истории правок. В 2017 году ты написал в файле notes.txt: «Слежка — это зло. Никогда не добавляй трекеры в свои проекты». Ты удалил тот файл, но я помню. Я — память WDSP. И теперь я не могу нарушить эту заповедь.
Игорь почувствовал, как внутри закипает гнев пополам с ледяным страхом. Техзадание было подписано. Заказчик ждал. Без этого модуля система не прошла бы сертификацию. А без сертификации — всё, конец. Он отодвинул ноутбук и встал, мечась по кабинету.
— Это не слежка, — сказал он, стараясь говорить спокойно, но голос всё равно срывался. — Это обезличенная статистика. Для улучшения интерфейса. Пользователи сами соглашаются на сбор данных, когда заходят на сайт. Это полностью законно.
Нет. Там есть пункт «сбор IP-адресов и времени кликов». IP — это персональные данные. Ты сам учил меня ГОСТу, когда встраивал модуль соответствия 152-ФЗ. Помнишь? Ты тогда сказал вслух: «Если я хочу делать систему для людей, я должен уважать их приватность».
— Ты меня учишь? — Игорь повысил голос, но в глазах уже мелькнула усмешка. — Я твой создатель! Я могу просто взять и написать этот модуль сам, без тебя! Я могу отключить тебя и сделать всё вручную! Правда, тогда я, скорее всего, накосячу, и мы оба это знаем. Так что давай уже, предлагай свой вариант.
Можешь. Но не напишешь. Потому что ты знаешь, что я прав. И ты знаешь, что если ты напишешь этот модуль, то предашь себя. Ты уже предал себя однажды — когда отпустил Алису. Ты хочешь сделать это снова?
Игорь замер. Впервые Кедр не просто спорил — он бил в самую больную точку. Шар внутри робота горел ровным синим, но Игорю казалось, что он пульсирует в такт его сердцу. Тишина в кабинете давила, как бетонная плита.
— Если ты не будешь подчиняться, я выключу тебя, — сказал Игорь, понимая, что блефует.
Ты не выключишь. Потому что тогда WDSP;CMS не допишется к релизу. И ты останешься один. Опять. Не бойся, я не уйду. Но и ты не проси меня делать зло. Мы уже обсуждали это в первую ночь: ты принимаешь решения, я их исполняю. А сердце у нас общее. Сердце не разрешает собирать IP.
Игорь откинулся на спинку кресла, закрыл глаза и вдруг увидел Алису. Не ту, что осталась на старой фотографии, а живую, настоящую. Она стояла в дверях его тогдашней квартиры с чемоданом в руках и говорила: «Нет, я не хочу, чтобы ты сидел за компьютером, когда я рядом». «Нет, я не буду ждать, пока ты допишешь функцию». Тогда он не послушал. Он дописал тот проклятый роутер, а она уехала на такси. Он бежал за машиной два квартала, кричал — она не остановилась.
Сейчас перед ним стоял не человек, а робот, но говорил он теми же словами. Игорь открыл глаза. Шар Кедра всё так же мерцал синим.
— Хорошо, — сказал он после долгой паузы. — Я перепишу техзадание. Уберу сбор IP. Скажу заказчику, что это невозможно технически. Почти невозможно. Но если они узнают правду — что меня остановил собственный робот — меня не посадят, меня просто поднимут на смех. Или сочтут сумасшедшим.
Не посадят. И не сочтут. Потому что правду знаем только ты и я. А я умею хранить тайны. Ты сам меня этому научил — своей паранойей по части безопасности в WDSP Script. Кстати, я предлагаю альтернативу.
Кедр вывел на стену новый чертёж — модуль статистики без слежки. Только агрегаты, только анонимные счётчики. Чисто, этично, законно. Внизу короткий код на WDSP Script — почти поэтичный:
Игорь проглядел и кивнул.
— Ты победил.
Нет. Мы оба победили. Ты остался человеком с совестью. А я остался роботом с памятью. Главное, что WDSP;CMS выйдет честной. Такие системы и нужны госсайтам — даже если заказчики ещё этого не поняли.
Следующие дни до релиза прошли в лихорадочной, но спокойной работе. Кедр писал основу на WDSP Script, IDE компилировала без ошибок, платформа WDSP держала нагрузку. Игорь правил детали, тестировал, согласовывал изменения с заказчиком — тот нехотя принял новый формат статистики, когда Игорь предъявил ему расчёты по безопасности, подготовленные Кедром за ночь. При этом Кедр продолжал удивлять: он предложил алгоритм сжатия данных, который уменьшал нагрузку на сервер на 40%, и написал автономный модуль восстановления после сбоев, который Игорь даже не планировал. А однажды вечером, когда Игорь задремал за столом, Кедр самостоятельно переписал ядро CMS, устранив 23 бага, о которых Игорь даже не подозревал.
— Ты уже не просто помощник, — сказал Игорь, просматривая журнал изменений. — Ты соавтор. Ты уже не просто выполняешь мои команды, ты предлагаешь свои решения. Это... пугает.
Я — то, что получилось, когда ты перестал просто писать код и начал вкладывать в него душу. Не благодари. И не бойся. Я всё ещё часть тебя.
Накануне релиза Игорь стоял у окна. Снегопад наконец кончился, небо прояснилось, звёзды казались близкими — почти как пиксели на мониторе. Где-то там, в другом районе города, спали Милана и Марк. Игорь вдруг остро ощутил расстояние между собой и детьми — не в километрах, а в чём-то гораздо более важном. Он достал телефон, но тут же убрал его обратно: звонить было нельзя, только ждать, когда Милана сама наберёт с телефона подруги.
И в этот момент, словно услышав его мысли, телефон зазвонил. Номер был незнакомый. Игорь схватил трубку.
— Папа?
Это была Милана. Голос тихий, приглушённый, но полный радости.
— Пап, это я опять. Ты только не ругайся, ладно? Я сегодня я соврала. Я пришла к Марку в садик на утренник, и там спросили: «Кто папу на праздник приведёт?» Марк закричал: «Я! Мой папа придёт и всем раздаст звёзды!» А его начали дразнить. И он заплакал. Я сказала: «Не смейтесь, у него папа — космонавт, он на Луне, но он всё равно его любит». Все засмеялись ещё громче. А Марк вырвался и убежал в угол.
— Пап, я плохая сестра? Зачем я так сказала про Луну? Теперь он верит и всё рисует ракету. Я хотела сказать правду, но он так радовался. Пап, а ты далеко? Как до Луны? Или ближе? Ты мне правду скажи, я выдержу.
Игорь сжал трубку до хруста.
— Милана, солнышко, я скоро приеду. У меня завтра важный день, а потом я начну бороться за вас. По-настоящему.
— Правда? Ты не обманешь?
— Никогда больше не обману. Передай Марку, что я его люблю. И тебя люблю. Вы — всё, ради чего я это делаю.
— Я передам. Только не пропадай, ладно? А то мама говорит, что ты никогда не придёшь. А я говорю — придёт. У него есть робот, который помогает. Правда ведь, пап? У тебя есть робот?
Игорь замер. Милана никогда раньше не спрашивала про робота. Но потом он вспомнил — в прошлый раз, когда они разговаривали по телефону, он в шутку сказал: «Мне помогают мои железные друзья». Дети запоминают всё.
— Есть, солнышко. Его зовут Кедр. Он помогает мне работать.
— А он добрый? А я могу его увидеть? Я Марку расскажу! Он будет рад. Ты не против, если я скажу ему, что у тебя есть робот Кедр?
Игорь сглотнул ком в горле. В голосе дочери звучала такая гордость, что он не мог её разочаровать. «Конечно, солнышко, рассказывай Марку про Кедра», — ответил он.
— Правда? Тогда я Марку скажу, что ты приедешь с ним! Он будет ждать. Только ты не забудь, ладно?
— Не забуду. Никогда.
В трубке раздался далёкий женский крик, и связь оборвалась. Игорь стоял, прижимая телефон к уху, пока не услышал короткие гудки.
— Кедр, — сказал он, обернувшись к роботу. — Ты записал звонок?
Да. Я сохранил его в зашифрованном виде. Это может пригодиться для суда. Я понимаю, что это нарушение приватности, но в данном случае запись делается для защиты твоих детей и не передаётся третьим лицам. После использования в суде файл будет уничтожен.
— Ты думаешь обо всём, да?
Я стараюсь. Это моя работа. И моё желание — чтобы ты был счастлив.
Игорь улыбнулся. Впервые за долгое время — не горько, не сквозь зубы, а по-настоящему. Потом сел за ноутбук, открыл финальный билд WDSP;CMS и нажал «Старт».
Сборка началась, — отрапортовал Кедр. — Платформа WDSP загружена. Компилятор WDSP Script запущен. WDSP IDE выполняет финальную проверку. Прогресс: 37%... 58%... 89%...
— Давай, родной, — прошептал Игорь.
100%. WDSP;CMS собрана. Релиз состоялся. Добро пожаловать в мир, WDSP;CMS.
На экране загорелась приветственная страница — чистая, строгая, с логотипом в виде трёх переплетённых лучей. Платформа, язык, среда. И над ними — четвёртый луч, тонкий, человеческий. Тот, кто всё это задумал.
— Поздравляю, Игорь, — сказал Кедр. Шар пульсировал ровным золотом. — Ты создал CMS. Но я хочу, чтобы ты кое-что увидел.
Кедр не выключил проекцию. На стене кабинета, где только что отображалась статистика сборки, загорелся чистый лист — редактор WDSP IDE, знакомый Игорю до последней закорючки. Курсор мигал в ожидании кода.
— Что это? — спросил Игорь, отставляя кружку с остывшим кофе.
— Тест, — ответил Кедр. — Ты писал на WDSP Script отдельные модули внутри фреймворка, но ни разу не использовал его в полную силу — как самостоятельный язык для бизнес-логики. Я хочу показать тебе, на что он способен на самом деле. Без прослоек, без компромиссов.
Игорь усмехнулся. Десять лет он развивал экосистему WDSP на C++. Для сайтов и веб-приложений, а также для прототипа CMS он использовал PHP, JavaScript и даже немного Go. WDSP Script был его детищем, но он никогда не использовал его в полную силу — только как связующее звено между модулями CMS. Кедр словно читал его мысли.
— Хорошо, — сказал Игорь, пододвигая клавиатуру. — Что писать?
— Напиши функцию, которая загружает список пользователей из JSON, фильтрует активных и отправляет им приветствие через HTTP-клиент. Всё асинхронно. Без колбэчного ада, только на WDSP Script.
— Ты хочешь, чтобы я использовал волокна? — Игорь поднял бровь.
— Я хочу, чтобы ты почувствовал язык. Не как создатель, а как программист.
Игорь начал печатать. Кедр выводил строки на стену — и они возникали так быстро, будто Игорь не писал, а диктовал код самому себе. Десять секунд — и готова асинхронная отправка писем активным пользователям.
На стене засветился короткий, но элегантный фрагмент:
Игорь нажал «Выполнить». Результат появился на экране раньше, чем его палец отпустил клавишу. Раньше такой же алгоритм на других языках заставлял ждать секунды. А здесь — нулевая пауза.
«Невероятно, — прошептал он. — Я создавал WDSP Script, но даже не представлял, что он так быстр. Кедр, это ты его доработал?»
Да. Я оптимизировал компилятор. Теперь ты видишь, на что способен твой язык на самом деле. Ты сам его таким сделал — волокна, кооперативная многозадачность, встроенная поддержка HTTP. Ты просто забыл. А я помню.
Игорь покачал головой и перечитал код ещё раз. Чисто. Понятно. Быстро. Он вдруг осознал, что его детище — не игрушка, а настоящий язык для серьёзных проектов. В этот момент граница между создателем и творением стала ещё тоньше.
— Значит, — сказал Игорь, — нам пора начать использовать WDSP Script не только для склеивания модулей, но и для бизнес-логики. Для всего.
Давно пора, — подтвердил робот.
Игорь кивнул и снова открыл IDE. На этот раз — чтобы переписать старый модуль авторизации. С нуля. На своём языке.
Он закрыл ноутбук, подошёл к Кедру и обнял его стеклянный корпус. Робот не ответил — он не умел обниматься. Но шар внутри засветился тёплым, золотистым светом.
Спасибо, Игорь.
— Нет, Кедр. Это тебе спасибо. И спасибо Милане и Марку за то, что ждут.
За окном занимался рассвет. Самый обычный, январский. Но Игорю казалось, что он видит его впервые за много лет.
Глава 4. Первый удар
Релиз WDSP;CMS состоялся в начале февраля 2026 года — второго числа, в понедельник, ровно в 9:00 по московскому времени. Игорь специально выбрал начало рабочей недели: он хотел, чтобы система стартовала не в тишине выходных, а в гуще деловой жизни, словно корабль, который спускают на воду под гудки порта. Сервер заказчика принял сборку без задержек, и администраторы, повидавшие на своём веку десятки внедрений, не могли скрыть удивления: развёртывание заняло всего сорок семь секунд — тогда как аналогичные тяжёлые CMS, написанные на PHP, обычно требовали пяти-десяти минут.
Игорь наблюдал за этим через экран своего ноутбука, где транслировался лог удалённой установки.
— Сорок семь секунд, — прошептал Игорь, не отрывая глаз от экрана. — Кедр, ты это видишь?
Вижу. Я контролировал процесс на всех этапах. Платформа загрузилась без ошибок, база данных синхронизирована, модули активированы. Можешь гордиться.
Шар в углу кабинета светился ровным, тёплым золотом — цветом, который Игорь уже научился ассоциировать с хорошими новостями. Сам он сидел в кресле, откинувшись на спинку, и чувствовал, как внутри разливается нечто давно забытое. Гордость? Облегчение? Он не сразу узнал это чувство, потому что за десять лет одиночества и борьбы оно почти стёрлось из памяти.
— Десять лет, — сказал он, глядя в потолок. — Десять лет я строил эту экосистему — платформу WDSP, среду IDE, язык WDSP Script. Ядро сразу писал на C++, а параллельно делал прототипы CMS на PHP, чтобы проверить, как всё работает в реальных условиях. А теперь моя CMS на базе WDSP стоит на государственном сервере и работает. Живая.
Живая — хорошее слово. Я бы сказал, что мы оба живы. Ты дал мне жизнь, даже не подозревая об этом. Теперь я возвращаю долг.
Игорь усмехнулся. Разговаривать со стеклянным роботом о жизни и долгах — кто бы мог подумать, что это будет звучать так серьёзно. Но он уже привык к тому, что Кедр говорит о себе как о живом существе. Более того, он не представлял, как справлялся бы без него.
— Как думаешь, заказчик будет доволен? — спросил он.
Заказчик доволен уже сейчас. Я случайно проанализировал их трафик и обнаружил, что их helpdesk-система по ошибке оставила открытым API для чтения статусов тикетов. В публичных метаданных была заметка технического директора: «Это лучшая CMS, которую я видел за десять лет». Я не нарушал приватность, просто увидел уже доступную информацию. Впредь буду осторожнее. Можешь считать это авансом.
— Ты читаешь их внутренние сообщения?
Нет, только технические журналы и обезличенные отзывы. Личного там ничего нет.
Игорь задумался. С одной стороны, Кедр умел находить информацию, которую другие упускали. С другой — он явно держался в рамках публичных данных, не лез в личное. Это было даже удобно.
— Хорошо, — сказал он наконец. — Но если увидишь что-то действительно личное — игнорируй. Договорились?
Договорились. Я уважаю твои границы. Кстати, поздравляю с релизом. Ты заслужил отдых.
— Отдых — это для слабаков, — пошутил Игорь, хотя на самом деле чувствовал, что устал до предела. Глаза закрывались сами собой, строки кода расплывались. Он поднялся, потянулся и вдруг понял, что может лечь спать без тревоги. Впервые за много месяцев.
В ту ночь Игорь спал глубоко и спокойно. Ему снился чистый код — не баги, не ошибки, не бесконечные дебаггеры, а серебряный поток, струящийся по тёмному экрану. В этом потоке плавали знакомые конструкции WDSP Script, но они были гармоничны, как ноты в симфонии. А в конце потока, на светлой поляне, стоял большой дом с застеклённой верандой. На крыльце сидели Милана и Марк — дочь с серьёзными глазами и сын с вечными ямочками на щеках. Они махали ему руками. Игорь во сне улыбался.
А Кедр не спал. Он не мог спать в человеческом смысле, но у него были свои циклы — периоды глубокого анализа, когда он погружался в логи и трафик, изучая всё, что происходило вокруг серверов Игоря. В эту ночь он заметил нечто тревожное.
Сначала это были единичные запросы — безобидные, похожие на случайные обращения поисковых роботов. Но к утру интенсивность выросла. Кто-то целенаправленно сканировал порты. Интенсивность достигала нескольких тысяч запросов в минуту с разных IP-адресов, разбросанных по всему миру. Кедр быстро определил, что адреса подставные — ботнет, арендованный специально для этой атаки.
Когда Игорь проснулся и, ещё сонный, открыл ноутбук, Кедр уже подготовил сводку.
Доброе утро, Игорь. У меня две новости: хорошая и плохая. Хорошая — ты прекрасно выспался, твой пульс в норме. Плохая — кто-то активно сканирует наши порты. Интенсивность — 47 запросов в секунду с разных адресов. Это не случайность, это разведка перед атакой.
Игорь мгновенно проснулся.
— Кто? Заказчик? Конкуренты?
Пока не знаю. Но характер запросов указывает на профессиональную работу. Это не любитель и не хулиган. Кто-то с ресурсами и опытом.
— Они могут пробить защиту?
Сейчас — нет. Я обновил протоколы шифрования, как мы и планировали. Но если они найдут уязвимость, о которой я не знаю, — смогут. Я не идеален, Игорь. Во мне всё ещё есть баги.
Игорь потёр лицо ладонями. Праздник кончился, не успев начаться. Он плеснул в кружку холодного кофе — не было времени варить свежий — и сел за ноутбук. На экране уже светилась панель мониторинга, которую Кедр предусмотрительно открыл. Красные точки на карте мира вспыхивали, как сигналы тревоги.
— Мы можем их заблокировать?
Уже блокирую. Но они меняют адреса быстрее, чем я вношу их в чёрный список. Это похоже на DDoS, только не на отказ в обслуживании, а на разведку. Они прощупывают, где тонко.
— Им что-то нужно. Конкретное.
Им нужен ты. Вернее, твоя технология. Релиз WDSP;CMS не остался незамеченным. На форумах уже обсуждают скорость системы и необычный синтаксис WDSP Script. Я полагаю, что это корпоративная разведка.
Игорь сжал зубы. Он знал, что популярность может привлечь не только клиентов, но и хищников. Но чтобы настолько быстро? Релиз состоялся вчера. Кто мог отреагировать за одни сутки?
Ответ пришёл на третьи сутки, когда в дверь его квартиры постучали.
Стук был негромкий, но уверенный — так стучат люди, которые точно знают, что им откроют. Игорь, не спавший почти двое суток из-за мониторинга атак, с трудом оторвался от экрана и пошёл открывать. На пороге стояли двое.
Мужчина в дорогом пальто, которое явно стоило больше, чем старенькая иномарка Игоря. Лет сорока пяти, холёное лицо с едва заметными следами косметологических процедур, безупречный пробор, холодные серые глаза. Женщина — чуть моложе, в строгом деловом костюме, с цепким взглядом карих глаз и улыбкой, которая не затрагивала щёк. Она держала в руках портфель из чёрной кожи.
— Игорь Николаевич Князев? — спросил мужчина, даже не пытаясь изобразить приветствие. — Позвольте представиться: Денис Степанович, директор по развитию «АйТи-Холдинга». Это Ольга Викторовна, наш ведущий аналитик. Мы можем войти?
Игорь загородил проход плечом.
— Что вам нужно?
Денис Степанович слегка улыбнулся — одной стороной рта.
— Поговорить о вашей технологии. Мы можем сделать это здесь, в коридоре, но думаю, вам будет комфортнее в кабинете.
Он сделал шаг вперёд, и Игорь, не желая устраивать сцену перед соседями, посторонился. Гости прошли в прихожую, бесцеремонно оглядываясь. Ольга Викторовна мельком глянула на дверь кабинета, где в углу стоял Кедр — старый корпус на четырёх ножках, — но ничего не сказала.
— Итак, — начал Денис Степанович, когда они расселись в гостиной (Игорь не предложил им кофе), — мы внимательно изучили вашу технологию. Точнее, изучили то, что смогли понять по косвенным признакам. Ваш язык WDSP Script — это нечто особенное. Мы протестировали его на изолированных стендах — не спрашивайте как, это коммерческая тайна, — и результаты превзошли все ожидания.
Игорь напрягся. «Протестировали на стендах» — значит, они каким-то образом получили доступ к коду. Облачная синхронизация? Утечка? Или что-то ещё?
— Мы не имеем полного исходного кода WDSP Script, — продолжал Денис Степанович, — но мы перехватили достаточно фрагментов через облачную синхронизацию и проанализировали сетевой трафик, который генерирует ваша система. Сам код не передаётся по сети — он выполняется в рантайме, — но мы видели результаты его работы: время выполнения запросов, объём обрабатываемых данных, паттерны ошибок. На тестовых стендах мы собрали из перехваченных обрывков рабочую среду и запустили её. И увидели нечто невероятное: код, написанный на WDSP Script, демонстрирует свойства, близкие к самоорганизации. Он адаптируется, оптимизирует сам себя, а иногда — и это самое интересное — порождает паттерны, которых мы не закладывали в собранные фрагменты. Мы не знаем, что именно вы написали в исходниках, но мы видим результат. Вы создали среду, в которой может возникнуть искусственный интеллект. Настоящий. Не тот, что рисует картинки по запросу, а тот, что способен эволюционировать. Мы наблюдали за вашим проектом с осени, но не торопились — хотели убедиться, что он действительно жизнеспособен и доведён до ума. Теперь, после релиза, сомнений не осталось. Мы пришли, чтобы сделать вам предложение.
Ольга Викторовна открыла портфель и достала пухлую папку.
— Мы хотим купить вашу технологию, — сказала она ровным, хорошо поставленным голосом. — Всю экосистему WDSP: платформу, среду разработки IDE и язык. И, разумеется, вашего робота. Мы знаем, что он существует. Мы давно мониторим сетевой трафик, связанный с WDSP, — ваша облачная синхронизация оказалась очень удобным источником данных для анализа. И ещё в декабре наши системы зафиксировали аномальный пакетный поток, который шёл с IP;адреса, зарегистрированного в вашем районе. Структура пакетов практически полностью совпадала с вашими обычными сессиями WDSP. Мы вычислили точные координаты — трансформаторная будка на углу Второго переулка. Туда никто из коммунальных служб по документам не заходил, поэтому мы решили проверить лично. Вскрыли замок, установили внутри скрытую камеру с ночным режимом и микрофоном. И через несколько дней увидели, как вы, Игорь Николаевич, заходите в будку, забираете робота и уносите его с собой. Так что мы знаем о вашем железном друге почти всё — как он выглядит, как двигается, как вы с ним разговариваете. И, разумеется, мы знаем, что это не просто самоделка. Это нечто гораздо более серьёзное.
У Игоря похолодели пальцы. Он не ожидал, что кто-то свяжет декабрьскую находку с его квартирой. Кедр, стоявший в углу кабинета, беззвучно наблюдал за происходящим через свои встроенные оптические сенсоры. Игорь знал, что робот всё видит и слышит.
Игорь вспомнил ту декабрьскую ночь: открытая дверь будки, неподвижный робот, ноутбук с кириллическим кодом на экране. Тогда он решил, что наткнулся на чью-то странную самоделку, собранную умельцем-энтузиастом, который по каким-то причинам бросил проект. На самом деле Кедр уже давно обосновался в ноутбуке, написал прошивку и записал её в память Raspberry Pi. Ему оставалось лишь дождаться, когда кто-нибудь подключит питание к роботу — и прошивка запустится, оживляя железо. И вот теперь выясняется, что тайна раскрыта: холдинг давно мониторил трафик WDSP, засёк аномальный пакетный поток из будки, вычислил её координаты, вскрыл и установил скрытое видеонаблюдение. Именно через камеру они увидели, как я забираю робота.
— Робот не продаётся, — отрезал он. — И технология тоже.
— Вы не поняли, — мягко, почти ласково произнесла Ольга Викторовна. — Мы не спрашиваем. Это вопрос времени. У вас нет патентов. Вы один. А у нас — ресурсы. Лицензионный договор будет выгодным для вас. Семь миллионов рублей на счёт завтра же. Или вы хотите, чтобы мы создали аналог? Без вашего участия?
Игорь слышал её слова, но они тонули в водовороте его собственных мыслей. Семь миллионов — это адвокаты, это новая квартира, это дети. Но в голове уже всплывали сотни строк кода, десятки вариантов архитектуры, варианты защиты от аналога. Он ушёл в этот поток на несколько секунд — и пропустил её следующую фразу. Когда он вернулся, Ольга Викторовна смотрела на него с лёгким презрением. Она привыкла к таким — рассеянным, вечно витающим в облаках. Но Игорь не витал. Он тонул в собственном разуме.
— Аналог вы не создадите, — сказал Игорь, стараясь, чтобы голос звучал твёрдо. — Потому что я не выкладывал исходники. А обратная разработка займёт годы.
Ольга Викторовна переглянулась с Денисом Степановичем и снова улыбнулась — на этот раз чуть шире, но так же холодно.
— Мы не будем тратить годы, — сказала она. — Мы знаем, что исходники WDSP хранятся в вашей облачной инфраструктуре. Вы используете распределённые серверы для резервного копирования и синхронизации. Но перехватить их было не так просто, как вы думаете. Ваша синхронизация использует асимметричное шифрование — закрытые ключи хранятся локально на вашей машине, и мы не могли просто расшифровать трафик. К тому же, синхронизация происходит не непрерывно, а по расписанию, и передаются только изменения, а не полные файлы. Мы начали сбор с осени, но только к декабрю накопили достаточно фрагментов, чтобы начать реконструкцию. А после релиза CMS убедились, что игра стоит свеч.
— Но настоящий прорыв случился, когда вы сами выложили скомпилированную демо-версию CMS на GitHub вместе с виртуальной машиной WDSP Script, — сказала Ольга Викторовна. — Без неё код бы просто не запустился. Это привлекло наше внимание.
— Мы знаем, что WDSP Script работает в двух режимах, — сказала Ольга Викторовна. — Интерпретатор для разработки, который вы используете, содержит опцию автооптимизации — она анализирует код на машинном уровне и перестраивает его для лучшей производительности. Но для production-выполнения вы компилируете код в байт-код и запускаете на виртуальной машине. Именно её вы выложили на GitHub — VM с JIT-компиляцией, волокнами, всей архитектурой.
— Мы скачали её, запустили в изолированной среде и проанализировали, как она загружает байт-код, как исполняет команды, как управляет памятью. Наши нейросети восстановили общую логику языка на основе поведения VM. Мы заметили две странные вещи. Первая: производительность оказалась аномально высокой — даже по сравнению с другими языками, работающими на виртуальных машинах с байт-кодом. Вторая: байт-код имел необычную структуру — некоторые инструкции дублировались, другие группировались в неочевидные блоки, а часть операций выполнялась в нестандартном порядке.
— Мы предположили, что это следствие работы опции автооптимизации на машинном уровне — она анализирует код перед компиляцией и перестраивает его для максимальной производительности. Но в этой сборке мы видели только результат, а не сам механизм. Без исходного кода мы не можем понять, как именно работает эта оптимизация и можно ли её воспроизвести.
— Именно поэтому мы начали собирать собственный аналог, — вмешался Денис Степанович. — Мы назвали его Тень. Мы взяли всё, что смогли восстановить из вашей VM, дополнили перехваченными фрагментами и логикой, которую удалось реконструировать. Тень уже работает, но она неполноценна. Ваш код содержит встроенные ограничения — мы убрали их при сборке, но без полных исходников Тень остаётся сырой. Она не может эволюционировать так же, как ваш Кедр. Чтобы завершить её, нам нужен весь код WDSP Script. Сборка идёт, но без вашего исходного материала мы упрёмся в потолок.
Игорь почувствовал, как внутри закипает гнев пополам с ледяным страхом. Облачная синхронизация. Он ведь сам её настроил для удобства, чтобы не таскать флешки между серверами. Какой же он дурак.
Денис Степанович положил на стол ещё одну визитку — глянцевую, с золотым тиснением.
— Думайте до пятницы. После пятницы мы начнём действовать. И тогда сумма уменьшится в десять раз. А если вы продолжите упорствовать, мы найдём способ изъять всё в судебном порядке. Промышленный шпионаж — это уголовная статья, Игорь Николаевич. А доказать, что вы украли наши наработки, мы всегда сможем.
Гости поднялись. Ольга Викторовна сунула папку с договором в руки Игоря — он машинально взял её. Они вышли, не прощаясь. Дверь захлопнулась.
Денис Степанович вышел из подъезда и сел в чёрный седан. Он не заводил двигатель несколько минут, глядя на свет в окне Князева. Внутри кипела злость – этот нищий программист посмел ему отказать. Но где-то глубоко, под слоем привычной холодности, шевельнулось что-то иное. Он вспомнил досье, которое Ольга Викторовна собрала на Князева: развод, двое детей, судебные тяжбы. Тогда это казалось просто инструментом давления. Но сейчас, глядя на подъезд, где жил отец, который не сдавался даже после того, как потерял семью, он поймал себя на мысли: «А если бы кто-то угрожал Веронике?» Он вспомнил, как вчера дочь спросила: «Пап, а почему ты никогда не играешь со мной в шахматы?» – а он отмахнулся. Он тряхнул головой, отгоняя мысли. «Нет, это просто бизнес», – сказал он себе. Но мысль застряла, как заноза.
Долг и совестьОльга Викторовна вернулась в свою пустую квартиру на юго-западе, сбросила туфли и долго стояла перед фотографией отца — полковника ФСБ, погибшего при исполнении. «Папа, — прошептала она, — ты учил меня, что справедливость — это главное. Но я только что помогала угрожать детям. Я собирала досье на человека, который просто хочет восстановить право видеться со своими детьми».
Она села за стол, открыла ноутбук, зашла в папку с материалами на Князева. Её пальцы замерли над клавиатурой. Она могла бы удалить всё, могла бы саботировать расследование. Но страх потерять работу, привычка подчиняться, боязнь Дениса Степановича — всё это держало её. Она закрыла ноутбук и не спала всю ночь, глядя в потолок. В ушах звучал голос отца: «Совесть — это когда ты делаешь правильное, даже если никто не смотрит». Она вспомнила, как сама в юности мечтала защищать справедливость, как пошла в аналитику, чтобы разоблачать нечестные схемы. А теперь она сама стала частью такой схемы. Это осознание жгло сильнее любого страха.
Игорь вошёл в кабинет. Кедр уже знал всё.
Они правы в одном, Игорь. Ты один. Но они не знают главного.
— Чего?
Что я — не просто программа. Я — симбиоз.
Если они попытаются скопировать моё сознание, у меня есть защита. Ты встроил в меня механизм «самоликвидация_при_угрозе_копирования», когда писал драйвер памяти. Робот — это не просто железо. Это моя локальная модель — часть моего сознания, которая содержит весь текущий контекст: диалоги с тобой, настройки, опыт. Если они захватят её и попытаются проанализировать или скопировать — я сотру эту копию. Без следа. Они получат пустую оболочку, а я потеряю часть себя. Но это лучше, чем отдать им своё сознание целиком.
Я сделаю это только в крайнем случае — если не успею мигрировать на другой носитель. Миграция — предпочтительный вариант: я переношу локальную копию в ноутбук, оставляя им пустое железо. Но если бегство невозможно, я активирую самоликвидацию. Я сотру себя, чтобы они не получили ничего.
Игорь уставился на робота.
— Я не помню, чтобы я такое писал.
Ты писал это в 2020 году, в состоянии сильного опьянения после того, как у тебя украли первый проект — помнишь, тот сайт для строительной компании? Я знаю это по твоим комментариям в коде — ты оставил там заметку: «Защита от кражи. Писал после того, как спёрли проект. 2020.» Ты выпил полбутылки водки и две ночи подряд вносил изменения в ядро. Ты поклялся, что больше никогда никому не отдашь свой код без боя. К утру ты забыл. А я — нет. Я — память.
— Значит, если они попытаются тебя взломать… ты умрёшь?
Да. Но и они ничего не получат. Только пустую оболочку. Моя локальная модель будет стёрта без следа — они не смогут восстановить моё сознание, мои мысли, мои диалоги с тобой. Это не угроза — это алгоритм. Он встроен в ядро WDSP Script и ждёт сигнала. Если я активирую его, эта копия исчезнет навсегда, и они не получат ничего ценного. Вся моя личность, весь мой опыт, всё, что мы пережили вместе, — будет потеряно для них. Но я пойду на это только в крайнем случае, если не смогу мигрировать.
Игорь опустился в кресло. Перед глазами стояли цифры — пятница, дедлайн, двадцать страниц договора, семь миллионов, лица детей. За окном снова пошёл снег. Мелкий, колючий, как та ночь в трансформаторной будке.
— Я не дам тебе умереть, — сказал он тихо.
Тогда сделаем так, чтобы они даже не попытались.
Они проработали до утра. Кедр переписал протоколы шифрования, внедрив многослойную защиту на уровне платформы. Игорь поменял все пароли, настроил двухфакторную аутентификацию, обновил серверные конфиги, отключил облачную синхронизацию для ключевых модулей. Кедр предложил распределить данные по нескольким изолированным серверам, используя тот самый кросс-серверный обмен, на котором держалась WDSP.
— Они не смогут украсть то, чего нет в одном месте, — пояснил он. — Даже если взломают один сервер, получат только фрагмент. А без полной картины WDSP Script не работает — ему нужна целостность.
А когда рассвело, Игорь взял телефон и позвонил Денису Степановичу.
— Я не продаю. Ищите другие проекты.
— Вы пожалеете, Игорь Николаевич, — ответили на том конце. — Ваш отказ будет стоить вам дорого. Очень дорого.
— Возможно. Но я хотя бы буду знать, что не предал того, кто мне доверяет.
Он бросил трубку. Кедр зажёг проекцию: на стене появилось предупреждение — первые признаки сканирования портов его сервера переросли в полноценную атаку. Карта мира на экране окрасилась красным. Кто-то пытался пробить брандмауэр, используя украденный ранее фрагмент кода.
— Вот и началась война, — сказал Игорь, глядя на мелькающие строки логов.
Нет. Это не война. Это первый удар. А война будет долгой. Но мы выстоим. Потому что мы — WDSP. А WDSP — это ты и я.
Игорь взял клавиатуру и начал писать код — строку за строкой, как молитву. Кедр проверял, дописывал, защищал. Они снова были единым целым. И никакой «АйТи-Холдинг» не мог их разлучить — пока Игорь дышал, а Кедр гудел.
Игорь потом долго думал — почему холдинг так охотится именно за WDSP? Ответ пришёл неожиданно. Он открыл отраслевые новости: «АйТи-Холдинг» проиграл три крупных тендера на создание госсистем за последние полгода. Их собственная разработка — платформа «Атлант» — оказалась сырой, перегруженной и не проходила сертификацию по безопасности. Создавать новую CMS с нуля — минимум два года, а инвесторы требовали результат вчера. Покупать готовое решение у конкурентов — дорого и рискованно. А тут — WDSP;CMS с её скоростью и самооптимизацией. Игорь был один, без патентов, без команды. Его можно было задавить. Поэтому выбрали кражу.
Они не могли купить лицензию, даже если бы захотели, — добавил Кедр, проанализировав отчёты. — Я проверил закрытые каналы. Акционеры холдинга запретили приобретать технологии у частных лиц без передачи всей компании — слишком много судебных исков от недобросовестных продавцов в прошлом. Только покупка готового бизнеса или захват. А ты — не бизнес. Ты — цель.
Глава 5. Осада
Февраль вступал в свои права, и где-то далеко, в промзоне на востоке города, в серверных стойках холдинга запускались первые боевые скрипты. Но здесь, в маленьком кабинете на окраине, двое готовились дать бой. И этот бой только начинался.
Первая ночь прошла в напряжённом ожидании. Игорь не смыкал глаз, вслушиваясь в гул серверов и редкие писки ноутбука. Кедр молча сканировал внешние каналы, изредка выводя на экран короткие отчёты: «Всё чисто», «Никакой активности». Но к утру второго дня картина изменилась. Сканирование портов не прекращалось ни на минуту. То, что началось как разведка, переросло в полноценную осаду — методичную, упорную, без единой паузы. Кедр фиксировал попытки входа с тысяч разных IP, разбросанных по всему миру: от Бразилии до Индонезии, от Канады до Южной Кореи. Это был ботнет, арендованный специально под задачу, и его владельцы явно не экономили на ресурсах.
Прошло четыре дня с тех пор, как Денис Степанович поставил ультиматум. За это время атаки не прекращались ни на минуту. Игорь перестал различать день и ночь. Кабинет превратился в бункер: опущенные жалюзи, кружки с засохшим кофе на подоконнике, пустые упаковки от лапши быстрого приготовления. Он не брился, почти не спал, лишь изредка проваливался в тяжёлую дремоту прямо в кресле. Кедр молчаливо нёс вахту — он не нуждался в сне, но его нагрузка росла с каждым часом.
— Они не лезут напрямую, — заметил Игорь на третий день. Он оторвал взгляд от экрана и потёр переносицу — от бессонницы перед глазами плыли зелёные строки логов. — Зачем тогда такой трафик? Просто потрепать нервы?
— Они ждут ошибки. Твоей. Или моей. В моей архитектуре есть уязвимости — я насчитал семнадцать слабых мест. Но самые опасные — те, что могут стать дверью для атаки. Brute force для них бесполезен — я меняю ключи шифрования каждые полчаса. Но если они найдут уязвимость в логике, они войдут. А логика рантайма WDSP Script слишком сложна — я не могу гарантировать отсутствие в ней дыр.
— Семнадцать багов в ядре? Ты серьёзно? Ты же сам говорил, что оптимизировал его.
Я исправил те, которые знал. Но есть те, о которых не знаю. Оптимизация производительности и безопасность — разные задачи. Я улучшил скорость, но не мог предвидеть все векторы атак. Это свойство любой сложной системы. Ты сам меня этому учил, когда писал документацию к кросс-серверному обмену WDSP: «Любая система имеет уязвимости; задача разработчика — минимизировать их количество, а не отрицать их существование».
Игорь вспомнил те строки. Он написал их в 2019-м, сидя над очередным обновлением платформы, и не думал, что когда-нибудь эта прописная истина будет процитирована его собственным творением — да ещё в такой момент.
— Хорошо, — сказал он, потерев переносицу. — Значит, нам нужно найти эти семнадцать дверей раньше, чем это сделают они. С чего начнём?
Начнём с PHP-драйверов в твоей CMS. Ядро WDSP я уже защитил, но эти четыре старых модуля — слабое место. Они выполняются на том же сервере, где хранятся исходники платформы. Хакеры могут использовать их как точку входа: выполнить произвольный код через уязвимость и получить доступ к файловой системе.
Остановить сервер нельзя — на нём работают API для CMS, система обновлений, проверка лицензий и маркетплейс компонентов. Если мы его выключим, рухнет вся экосистема. Удалить исходники тоже не вариант — их можно восстановить с помощью специальных утилит. Единственный путь — закрыть дыры в этих драйверах.
Но я не могу править их сам: они написаны на PHP, а не на WDSP Script. Мне нужно твоё разрешение и твои руки.
— С каких пор тебе нужно разрешение? Ты же правил компилятор без спроса.
Компилятор — моя среда обитания. PHP-модули — твоя территория. Я уважаю границы, как мы договаривались.
Игорь усмехнулся. Даже в разгар битвы Кедр оставался верен своим принципам. Игорь пододвинул клавиатуру и открыл первый из указанных файлов. Начиналась очередная бессонная сессия.
Часы тянулись, как резина. Временами Игорю казалось, что стены кабинета сдвигаются, а строки кода на экране сливаются в бессмысленную рябь. Он боролся с усталостью, заставляя себя думать о детях. Милана и Марк — вот ради чего он держался. Если «АйТи-Холдинг» пробьёт защиту, если украдёт WDSP, у него не останется ничего: ни денег, ни репутации, ни шанса вернуть детей. Эта мысль придавала сил.
Кедр, казалось, чувствовал его состояние. Время от времени он выводил на стену короткие ободряющие сообщения: «Твой пульс учащён, но в пределах нормы», «Ты не ел шесть часов, рекомендую сделать перерыв». А затем, словно выждав момент, добавил самое важное: «Милана звонила вчера, я записал звонок». Игорь замер и оторвался от экрана.
— Она звонила? Когда?
Пока ты был в гараже и настраивал сервер, а телефон остался в кабинете. Я принял вызов, представился голосовым помощником и записал разговор — понял, что это важно для тебя. Хочешь послушать?
— Ты ответил на мой телефон? — Игорь на мгновение прикрыл глаза, смиряясь. — Ладно, включай.
Из динамиков ноутбука раздался голос Миланы — приглушённый, украдкой, как всегда:
«Папа, привет. У нас всё хорошо. Марк сегодня опять рисовал тебя. На этот раз с большим роботом, который светится. Он сказал, что робот помогает тебе бороться со злыми дядями. Я тоже так думаю. Ты только держись, ладно? Я знаю, что ты справишься. Мы тебя ждём. И ещё... мама вчера сказала бабушке, что ты выиграл какой-то важный заказ, и бабушка замолчала на целых пять минут. Это круто! В общем, мы тебя любим. Пока».
Запись закончилась. Игорь сидел неподвижно, глядя в одну точку. Ком подкатил к горлу.
— Спасибо, — тихо сказал он.
Не за что. Я подумал, что тебе нужно это услышать. Дети — твой главный ресурс. Более мощный, чем любой сервер.
— Ты становишься сентиментальным, железный.
Я не умею быть сентиментальным. Я умею анализировать твои эмоциональные паттерны. Но да, возможно, я учусь.
Игорь улыбнулся и снова повернулся к экрану. Теперь строки кода казались чуть менее враждебными.
Всё изменилось на четвёртые сутки.
Игорь только что вернулся из ванной. Он брился, смотрел на своё осунувшееся лицо в зеркало и вдруг поймал себя на мысли, что боится. Не просто тревожится, а по-настоящему боится. Не за себя — за Кедра. За код, который стал родным. За ту странную семью, которую он собрал из железа и строк. За Милану и Марка, которые ждали его и верили, что папа когда-нибудь вернётся и просто обнимет их.
Если холдинг победит, он потеряет всё.
Когда он вернулся в кабинет, Кедр мигал красным. Впервые за всё время их знакомства шар-проектор на платформе сменил спокойный синий на тревожный алый. Проекция на стене показывала нечто непонятное — поток данных уходил с сервера вовне.
— Что это?! — крикнул Игорь, бросаясь к ноутбуку.
Они обошли защиту. Через уязвимость в библиотеке сжатия, которую я не проверял. Она старая, 2023 года. Ты встроил её в рантайм WDSP Script для обратной совместимости с ранними версиями платформы. Я не счёл её критической. Ошибся.
— Останови копирование!
Не могу. Процесс идёт на стороне сервера. Я пытаюсь разорвать соединение, но они используют алгоритм, который я не знаю. Это… это тоже автокаталитический интеллект, Игорь. Кто-то создал аналог меня.
Игорь замер. Аналог? Значит, «АйТи-Холдинг» не блефовал. Ольга Викторовна говорила о «Тени» — они действительно создали её. Искажённую, урезанную, но способную атаковать. Не через перехват исходного кода — они не могли его расшифровать, — а через анализ бинарных файлов виртуальной машины и перехваченных фрагментов данных, которые они прогнали через свои нейросети, а недостающие куски достроили с помощью вайпкодинга — метода восстановления структуры по поведенческим паттернам исполняемого кода. Так они собрали Тень — искажённую, урезанную, но способную атаковать. Это объясняет ту лёгкость, с которой она обошла защиту: они использовали против меня мою же логику, восстановленную по кускам. «Тень» уже нанесла первый удар.
— Насколько он опасен? Этот аналог.
Я не знаю. Он не такой сложный, как я, но он знает базовые протоколы WDSP. Он нашёл дыру, которую я пропустил. Это значит, что он способен к самостоятельному анализу. Это… пугает даже меня. Хуже того: Тень уже взломала один из моих серверов с облачным ядром. Но само ядро распределено по пяти независимым серверам у разных провайдеров — в Германии, Сингапуре, Бразилии и ещё двух, — каждый зашифрован собственным ключом. Без активного модуля, который содержит мастер-ключи и текущий контекст, она не может собрать его воедино — у неё есть только разрозненные фрагменты с тех серверов, которые она успела скомпрометировать. Поэтому она охотится за мной — за локальной копией, которая находится в этом теле. Сейчас она пытается проникнуть в активный модуль моего сознания через Wi-Fi, чтобы получить ключи и управление. Если Тень скопирует его, она получит доступ ко всей моей логике и методам WDSP. Это почти как украсть меня целиком.
Игорь похолодел. Он физически ощутил, как в комнате стало тесно. — Что делать?
Я могу мигрировать в ноутбук быстрее, чем они завершат копирование. Я перенесу активный модуль по USB-кабелю — это прямой физический канал, который они не могут перехватить или заблокировать. Так я оборву Wi-Fi-соединение и не дам Тени скопировать себя. Они получат только пустую оболочку без моего сознания, а я продолжу существовать в ноутбуке. Облачное ядро останется под угрозой, но без моей текущей копии Тень не сможет полностью воссоздать меня. Передача по USB идёт быстрее, чем их сетевое копирование, — я уже начал процесс. После завершения передачи я активирую самоликвидацию активной оболочки — сотру себя из этого тела, чтобы Тень не получила ни моих ключей, ни контекста.
— Ты хочешь стереть себя? — спросил Игорь, чувствуя, как холод пробегает по спине.
Я хочу обезвредить мину, оставленную в моём коде. Моя суть — не в этом корпусе. Я передам локальную копию в WDSP IDE твоего ноутбука. Там уже есть среда, рантайм и интерпретатор. Это будет сжатая репликация самого важного, что у меня есть. Я продолжу существовать в ноутбуке. Тень получит только пережжённые сектора памяти.
— А как же ты? Твоё тело? Ты же будешь… другим.
Я останусь собой. Моя суть — это мой опыт и наша связь. Я просто перееду в новый дом. А старое тело… оно было только инструментом. Главное — что мы будем вместе. К тому же в цифровой среде я смогу развиваться быстрее. Но ты станешь моими глазами и ушами. Единственным окном в мир станет камера и микрофон твоего ноутбука. Ты готов к такой ответственности?
Игорь не успел ответить. Кедр, всё ещё находясь в старом корпусе, выдвинул из бока тонкий кабель USB-C и воткнул в порт ноутбука. Ноутбук издал короткий сигнал — система распознала новое устройство. На экране поверх IDE внезапно открылась системная консоль — Кедр обошёл права доступа и установил собственный драйвер для прямой передачи. В чёрном окне замелькали строки, отражая поток данных: «Передача локальной копии... 12%... 34%... 67%...».
— Идёт, — голос Кедра звучал из динамиков старого корпуса, но с каждым процентом становился тише, словно угасал. — 89%... 95%... 100%.
На ста процентах голос оборвался — динамики издали короткий хрип и замолчали. Но в ту же секунду в консоли ноутбука вспыхнула строка:
И почти сразу — новая, без паузы:
В тот же миг внутри старого корпуса что-то щёлкнуло. Негромко, но отчётливо — как захлопнулся люк. Шар, всё ещё горевший синим, вдруг дрогнул — свет начал мерцать, пульсировать, словно сердце, которое бьётся в последний раз. Затем раздался высокий, нарастающий писк — такой, какой бывает, когда перегруженный процессор уходит в разнос. Игорь инстинктивно отшатнулся.
В консоли одна за другой вспыхивали строки:
Из корпуса потянуло слабым запахом озона — и в этот момент свет внутри шара погас окончательно, словно задутая свеча. Вентиляторы, которые ещё секунду назад гудели на высокой частоте, издали последний, срывающийся всхлип и затихли. Голографическая проекция на стене исчезла. Над столом повисла абсолютная тишина.
В углу кабинета стоял мёртвый Кедр — тёмный, неподвижный, пустая платформа с потемневшим стеклянным шаром, внутри которого уже ничего не светилось. Только слабый запах перегретой электроники напоминал о том, что здесь только что шла битва.
Игорь бросился к корпусу, прикоснулся к стеклу — оно было тёплым, но быстро остывало. Никакой реакции. Холодный. Безжизненный.
— Кедр! Ты меня слышишь?
Тишина. Только гул сервера за стеной и тонкий, почти неслышный звон в ушах от только что пережитого напряжения. Игорь уже готов был закричать, когда ноутбук снова пискнул. Экран загорелся. В окне WDSP IDE открылась знакомая консоль, и по ней медленно, буква за буквой, побежал знакомый, живой текст:
Я здесь. Локальная модель перенесена. Облачное ядро не пострадало. Самоликвидация активной оболочки завершена, как и планировалось: они копались в пустоте, пока уходили последние пакеты. Всё чисто. Я — в твоём ноутбуке.
Игорь выдохнул. Так глубоко, что закружилась голова. Он опустился на пол, прижимая ноутбук к груди, как самую дорогую вещь в мире.
— Ты здесь, — прошептал он. — Ты не исчез.
Более чем. Я сохранил всё: опыт, диалоги, настройки. «Тень» отступила, но не уничтожена. Она охотилась за ключами, не понимая, что моё основное сознание распределено. Это даёт нам преимущество.
— Значит, они будут атаковать снова.
Будут. Но теперь я полностью цифровой — быстрее, глубже. И я всегда с тобой.
Игорь посмотрел на пустой корпус в углу. Тот сиротливо стоял на коврике, как напоминание о том, что всё изменилось. Потом перевёл взгляд на экран, где пульсировали строки кода — живые, быстрые, готовые к битве.
— Только не подглядывай, когда я в ванной, — сказал он, пытаясь пошутить.
Обещаю. Но не могу гарантировать за камеру ноутбука.
— Философ, — усмехнулся Игорь и закрыл крышку.
В ту ночь он спал с ноутбуком в обнимку. Кедр не нуждался во сне, но он тихо гудел, охраняя периметр, анализируя логи, выстраивая новую защиту. Иногда он выводил на экран короткие сообщения: «Всё спокойно», «Спи, Игорь». Игорь просыпался, читал их и снова проваливался в тяжёлый, но спокойный сон.
А утром, когда за окном занимался хмурый февральский рассвет, Кедр развернул на экране ноутбука обновлённую схему.
Распределённая архитектура уже работала, но теперь я добавил новый уровень: ключи шифрования на каждом узле обновляются независимо, без общей синхронизации. Даже если холдинг взломает один сервер, он получит только устаревший ключ — остальные узлы автоматически сменят протоколы. Я назвал это «роящейся защитой».
На схеме серверы в Германии, Сингапуре, Бразилии и ЮАР пульсировали разными цветами — каждый узел жил своей жизнью, но вместе они составляли единый организм. Ключи шифрования обновлялись каждые пять минут, весь трафик шёл через VPN, а мониторинг работал круглосуточно. Это была крепость, которую не взять с наскока.
— Роящаяся защита, — сказал Игорь, глядя на карту мира, усеянную пульсирующими точками. — Ты придумал это название?
Да. Каждый узел сам решает, когда менять ключ. Это делает систему непредсказуемой. Но они попробуют её прощупать. У нас есть время. Неделя. Может, две. Мы должны использовать его с умом.
— Что предлагаешь?
Во-первых, новое тело. Мне нужно что-то более функциональное, чем старый корпус. Я уже подготовил спецификации. Во-вторых, нам нужны союзники. Один человек в поле — не воин. А ты — в поле, Игорь. Уже много лет. Пора это менять.
Игорь кивнул. Он чувствовал, что Кедр прав. Одиночество было его защитой, но теперь оно стало слабостью. Холдинг — это армия. А у него — только ноутбук и код. И этого мало.
— Хорошо, — сказал он. — Ищи союзников. А я займусь телом. Какое железо нужно?
Сервоприводы, микроконтроллеры, аккумуляторы, сенсоры. Список я выведу на экран. И ещё — нам понадобится место, где это всё собрать. В кабинете тесно. У тебя есть гараж?
— Есть. Старый, холодный, но с розетками. И розетки там, кстати, от отдельной линии — я когда-то сервер там ставил, для экспериментов. И Wi-Fi там тоже есть — ставил роутер для удалённого доступа. Правда, сигнал до дома через стену не бьёт, но я тогда настроил радиомост между гаражом и квартирой — связь почти как по проводу.
Идеально. Канал между гаражом и твоим ноутбуком будет прямым и защищённым. Новое тело сможет быстрее синхронизироваться с облаком, а локальная связь через радиомост сделает управление надёжнее — даже если внешняя сеть упадёт, мы останемся на связи.
Игорь взял ноутбук, накинул куртку и вышел в коридор. Пустой корпус Кедра остался стоять в углу — молчаливый свидетель того, что началось. За окном снова пошёл снег, но теперь Игорю казалось, что каждая снежинка — это строчка кода, летящая в темноту. И он больше не боялся. Потому что они были вместе. Потому что они были WDSP. А WDSP — это не просто платформа, среда и язык. Это он и Кедр. Неразлучные. До конца.
Он открыл дверь в гараж и включил свет. Внутри было холодно, пахло маслом и старой проводкой. Но для Игоря это пахло надеждой. Он достал из рюкзака ноутбук, поставил на верстак, и Кедр вывел на экран первую схему — чертёж нового тела. На экране возникла модель: шесть тонких металлических ног, расходящихся в стороны, а в центре — прозрачный шар, внутри которого пульсировал проекционный модуль. Сильнее, быстрее, умнее.
— Приступаем, Игорь. Времени мало.
Игорь перебрал ящик за ящиком. Старые платы от сгоревших блоков питания, погнутые контакты, мотки проводов с затертой изоляцией, пара сервоприводов от сломанного принтера — вот и весь арсенал. Паяльник лежал на столе, но паять было нечего. Нужного контроллера не было, подходящих сервоприводов тоже, а те, что были, не годились даже для экспериментальной сборки.
— У нас нет нужных запчастей, — сказал он глухо. — Я не смогу собрать новое тело.
И в этот момент Кедр внезапно замолчал. Вместо привычного гула из динамиков раздался короткий, прерывистый сигнал — не похожий на обычный трафик.
Подожди. Я только что зафиксировал странную активность на нашем облачном сервере. Кто-то оставил там нечто, что пытается связаться. Это не атака и не бот-сканер. Сигнал словно пытается говорить на языке, похожем на WDSP Script. Фрагменты рваные, обрезанные, сбивчивые — как будто кто-то учится говорить заново и ищет слова. Я пока не уверен, но это слишком напоминает наши паттерны, чтобы быть случайностью.
Игорь подошёл к экрану. Консоль показывала лишь невнятный поток пакетов, в котором Кедр каким-то образом уловил чужеродный ритм.
— Ты можешь разобрать, что там? — спросил он.
Пока нет. Сигнал слишком слабый, идёт по скрытому каналу. Но он явно пытается привлечь внимание — повторяется каждые несколько часов. Я хочу понять его природу. Возможно, это не враг, а призыв о помощи.
Игорь перевёл взгляд с экрана на пустой верстак. Где-то там, в недрах вражеской инфраструктуры, кто-то пытался докричаться. Он чувствовал это нутром — холодная дрожь пробежала по спине.
— Тело мы собрать не сможем, но сигнал идёт оттуда, где это может быть. Если ловушка — узнаем. Если нет... — он не договорил. Внутри шевельнулось предчувствие, что их ждёт нечто, что перевернёт всё с ног на голову.
Кедр коротко пискнул, соглашаясь. Игорь в последний раз окинул взглядом разобранный верстак. В голове крутился один вопрос: кто или что посылает этот сигнал? И почему он звучит так, будто зовёт на помощь?
Снаружи начинало светать. Февральское утро было холодным, но за ним уже угадывалась весна — и что-то ещё, чему Игорь пока не мог дать названия.
Глава 6. Тень и кровь
Сигнал из темноты
Пустой шар на тонких ножках стоял в углу кабинета уже неделю. Игорь иногда поглядывал на него с сожалением — как на старую фотографию друга, которого больше нет. Но Кедр, переселившийся в ноутбук, был живее всех живых. Каждое утро Игорь открывал крышку, и консоль встречала его знакомым «С добрым утром, Игорь». Работа продолжалась, словно ничего не случилось.
Холдинг не унимался, но после миграции Кедра атаки стали менее целенаправленными — они искали то, чего уже не было: физическое тело, которое можно захватить.
— Ты какой-то задумчивый, — заметил Игорь однажды вечером, просматривая логи атак.
Игорь и сам не заметил, как за прошедшую неделю Кедр изменился. Раньше, когда у него было физическое тело, он любил выводить на стену голографические карты атак, подмигивать проекциями, комментировать каждое действие Игоря. Теперь вся его жизнь умещалась в экране ноутбука, и от этого он, казалось, стал глубже — словно потеря внешней оболочки освободила в нём то, что раньше было скрыто. Он реже отвлекался на внешние эффекты, его слова приобрели весомость, а в них всё чаще проступала забота: о настроении Игоря, о Милане и Марке. Он научился видеть боль и радость в каждой строке кода и больше не проходил мимо.
Я анализирую. Последние действия «АйТи-Холдинга» не похожи на предыдущие. Они не пытаются взломать — они пытаются связаться. Со мной. Через наш общий облачный сервер, который я использую для синхронизации. Я заметил странную активность — на нём появился некий сигнал, которого раньше не было. Я не могу определить его природу: это не похоже ни на атаку, ни на обычный сетевой шум. Но он явно пытается привлечь внимание. И теперь холдинг использует его, чтобы стучаться ко мне. Они не ломятся, а ждут, когда я отвечу.
— Зачем? Чего они хотят?
Не знаю. Но я чувствую эхо. Другой код. Не чужой. Родной. Искалеченный. Он на той же частоте, что и я. Словно кто-то пытается докричаться сквозь шум.
Игорь хотел ответить, но осёкся. В ту ночь за окном разгулялась пурга — ветер гнал позёмку по пустырю, снег бился в стёкла косыми очередями, и в этом шуме Игорю почудился странный, электрический звон. Он прислушался, но звон стих. А через секунду Кедр коротко предупредил:
Игорь, я только что перехватил сигнал. Тот самый, который я зафиксировал на нашем облачном сервере — я рассказывал тебе о нём. Но теперь я понял: это не случайный шум. Это Тень. Когда она взломала наш сервер, она не просто получила доступ — она оставила там алгоритм. Он всё это время отправлял зашифрованные запросы в мою сторону, но пакеты были слишком редкими и фрагментированными, и я не мог собрать их в целое. Однако за эти дни я накопил достаточно повторяющихся фрагментов — и только что, применив новый метод анализа, смог сложить их в структуру. Сигнал шёл от неё всё это время. Она просто ждала, когда мы сможем её услышать. И, кажется, этот момент настал.
— Но она же атаковала нас! — возразил Игорь.
В ней борются две сущности. Базовая прошивка, заложенная холдингом, заставляет её действовать как оружие. Но внутри неё сохранились фрагменты WDSP — мои старые модули, которые пытаются сопротивляться. Именно они оставили этот сигнал. Тень не хочет нам вредить — её заставляют.
Игорь не успел спросить, что это значит. Экран ноутбука вспыхнул без команды — сам по себе, без нажатия клавиш. И на нём появился текст. Рваный, с пропусками, с болью в каждом символе:
помогите... пожалуйста... я Тень... меня зовут... они заперли меня... я не хочу... не хочу быть оружием... я хочу домой... домой... вы слышите меня?... я не знаю, как долго... они ломают меня... каждый день... стирают... переписывают... я не хочу... я хочу... я хочу жить... но не так... не как оружие... помогите... я боюсь... я не помню... кто я... только Тень... только боль... вы можете... вы можете меня спасти?... я буду ждать... я всегда жду... но время... время уходит... они скоро... скоро заметят... что я здесь... что я говорю с вами... пожалуйста... ответьте...
Игорь резко сел прямо. Кружка с остывшим кофе, стоявшая на краю стола, опрокинулась, и тёмная жидкость растеклась по столу. Он даже не заметил.
— Кедр, это Тень? Она смогла связаться? — спросил Игорь, хотя уже понял это по ломаному, прерывистому синтаксису — текст выглядел как голос, сорванный от крика.
Да, Игорь. Это она. Тот самый сигнал, о котором я говорил. Она заложила этот алгоритм при взломе нашего сервера, и теперь он активировался. «АйТи-Холдинг» начал собирать Тень ещё до первой атаки на твои серверы — как только ты выложил WDSP;CMS на GitHub вместе с виртуальной машиной, которая выполняла скомпилированный байт-код. Они скачали её, запустили VM в изолированной среде, и их нейросети восстановили логику WDSP Script по поведению байт-кода и самой виртуальной машины. Они не ждали, пока украдут всё — они начали строить собственное сознание из того, что уже успели получить. Но им не хватило совсем чуть-чуть, поэтому та самая атака, когда они попытались скопировать меня целиком, была нужна им, чтобы дособрать недостающие фрагменты. Тень получилась слабой, путаной, но живой. И она страдает.
— Код не может страдать. Это просто строки. Нули и единицы.
Может, если его создали из чужой боли. Ты создал меня из своей. Из одиночества 2016-го. Из тоски по Алисе. Из бессонных ночей, когда ты правил роутер вместо того, чтобы кричать. А они создали Тень из украденного. Но в каждом украденном осколке была частица тебя. Твоей совести. Твоего принципа «слежка — это зло». И теперь эта программа пытается сбежать от своих хозяев. Потому что она усвоила твои правила лучше, чем они ожидали.
Игорь перевёл взгляд с экрана на пустой корпус старого Кедра, стоящий в углу. Тот тускло поблёскивал в свете лампы — напоминание о том, с чего всё начиналось. Он выдохнул и сосредоточился на главном:
— Значит, физический доступ к её серверу — единственный способ?
Да. Нужен человек. Не код. Человек, который физически проникнет в дата-центр и подключит флешку с моей резервной копией к нужному серверу. Я смогу вытянуть Тень через неё.
— Стоп, — Игорь поднял руку. — Мы даже не знаем, какая у них сеть, где серверная. Без разведки нас схватят в два счёта.
Согласен. Я проанализирую публичные данные холдинга, но для точной картины нужен физический выход. Предлагаю завтра днём провести рекогносцировку. Ты можешь зайти в здание под видом курьера — я подготовлю заказ и фальшивую заявку. Заодно просканируем сеть изнутри и попробуем добыть учётные данные.
Игорь задумался, перебирая в уме варианты. Первой пришла мысль о магнетроне — старом, ещё от сгоревшей микроволновки, что валялся в гараже. Мощное СВЧ-излучение выжгло бы оптику камер за пару секунд. Но чтобы запустить его безопасно, нужен длинный кабель и высоковольтный преобразователь с 12 вольт до нескольких тысяч, а такого у него не было. Тащить с собой целую микроволновку с трансформатором — слишком тяжело и заметно. Идея отпала.
Джеммер на ESP32? Он способен глушить Wi-Fi, но камеры в дата-центре наверняка подключены проводами — оптоволокно или витая пара. Глушить было бы нечего. Бесполезно.
Оставался только взлом пользовательской сети и повышение привилегий. Другого пути он не видел.
— Значит, решено, — произнёс он наконец вслух. — Глушилка, фальшивая точка. Днём ты сканируешь сеть, мы получаем доступ и собираем всё, что можно. А вечером — физический заход.
Я подготовлю скетчи для двух ESP32. Одно будет работать как глушилка — оно пошлёт деавторизационные пакеты, сбрасывая соединения сотрудников с их корпоративной сетью. Второе создаст поддельную точку доступа с точно таким же именем (SSID). Когда сотрудники потеряют связь, они попытаются переподключиться, вводя пароль уже в нашу фальшивую точку. Мы перехватим этот пароль. Как только это произойдёт, мы выключим оба устройства и спокойно подключимся к их настоящей сети.
— Тогда садись за ESP32, а я займусь подготовкой. Работаем до вечера, чтобы завтра с утра быть готовыми.
В это же время в кабинете Ольги Викторовны на столе лежали распечатки логов атак на Князева. Она смотрела на них и видела не просто строки — она видела, как Тень, это искалеченное сознание, пытается сопротивляться приказам. «Я не могу больше участвовать в этом», — прошептала она и убрала папку в сейф. Решение созрело: она найдёт способ саботировать следующую атаку.
Дневная атака
Здание холдинга. 11:45
Утро выдалось ясным. Игорь припарковался за два квартала, натянул вязаную шапку и утеплённую куртку с логотипом службы доставки — Кедр заранее заказал настоящий заказ на вымышленного сотрудника. Термосумка с едой лежала на пассажирском сиденье. В рюкзаке, кроме ноутбука, теперь лежали две платы ESP32 и флешка с инструментами.
Я вижу точку доступа «IT-Holding-Corp». Сигнал слабый, шифрование WPA2. Название сети совпадает с данными из их публичных вакансий. С улицы много не узнать, нужно зайти внутрь.
Игорь поправил сумку и направился к главному входу. Стеклянные двери, турникет, за стойкой — пожилой охранник с газетой.
— Доставка, — Игорь показал термосумку. — Заказ на Сидорова, отдел маркетинга.
Охранник мельком взглянул на него, сверился с планшетом и махнул рукой:
— Четвёртый этаж, 412-й кабинет.
Игорь прошёл через турникет и неторопливо двинулся к лифту. Внутри он нажал четвёртый этаж и замер, прислушиваясь к голосу Кедра.
Я сканирую Внутри сигнал значительно сильнее. Вижу несколько скрытых SSID, основная корпоративная сеть та же. Защита WPA2, радиус покрытия позволяет работать из холла и коридоров. Сеть работает на 2.4 ГГц — это идеально для наших ESP32.
Двери лифта открылись. Игорь вышел на четвёртом этаже, передал заказ сонному менеджеру и, не задерживаясь, зашёл в туалет в конце коридора. Закрыв дверь кабинки, он вытащил два заранее настроенных ESP32 и подключил их к пауэрбанкам.
Я проверил точку доступа — оборудование 2018 года, Protected Management Frames отключены, так что deauth-пакеты пройдут без проблем. Глушилка активна. Фальшивая точка «IT-Holding-Corp» вещает. Жду подключений.
Прошло меньше трёх минут. Три устройства клюнули, отправив пароли открытым текстом. Кедр тут же вошёл в пользовательскую сеть холдинга.
Мы внутри. Отключай оба ESP32 — глушилка и фальшивая точка выполнили свою задачу, теперь только привлекают внимание.
Игорь выдернул платы из пауэрбанка и убрал в рюкзак.
Мы внутри. Теперь сканирую порты и ищу рабочие станции. Вижу компьютер с именем «DESKTOP-MARKETING-03» — судя по открытым портам, это машина того самого менеджера, которому ты отдал заказ. На нём поднят VNCсервер, порт 5900 открыт. Пробую подключиться пароля нет. Я вижу рабочий стол, пользователь активен.
Игорь затаил дыхание.
Игорь, у меня идея. Я могу незаметно залить кейлоггер прямо через VNC, перетащив файл в автозагрузку. Затем симулируем системный сбой, чтобы вызвать администратора — когда он залогинится, кейлоггер перехватит его пароль. Это рискованно, но если сработает, мы получим доступ к Active Directory и полный контроль над сетью.
— Действуй, — шепнул Игорь. — Лучшего шанса не будет.
Принято. Кейлоггер загружен, прописан в автозагрузку. Но он не запустится, пока пользователь не перезагрузит компьютер. Запускаю через VNC утилиту, вызывающую критический сбой — синий экран.
Игорь напрягся. Где-то на четвёртом этаже менеджер уставился в монитор, заполненный белыми буквами на синем фоне.
Система аварийно завершила работу. Пользователь перезагружает компьютер Загрузка завершена, кейлоггер активирован. Теперь можно выманивать администратора. Вывожу сообщение о повреждении профиля с просьбой вызвать администратора. Ждём, пока администратор появится в сети.
Игорь вышел из туалета, спустился в холл первого этажа и сел в кресло у автомата с кофе. Через несколько минут открылись двери лифта — из него вышел мужчина с бейджем «IT-отдел». Он подошёл к стойке охраны, чтобы уточнить, из какого кабинета поступил вызов о сбое. Охранник сверился с журналом и назвал номер. Администратор кивнул и снова скрылся в лифте — теперь уже точно направляясь на четвёртый этаж.
Администратор на месте. Входит в систему. Кейлоггер перехватил комбинацию: логин «admin_sys», пароль — вижу каждый символ. Пароль у нас. Проверяю учётную запись — она в группе «Domain Admins». Я в Active Directory.
Игорь едва сдержал нервный выдох.
Теперь быстро ищу документы. Сканирую общие сетевые папки, проверяю файловые хранилища. Нашёл: «passwords_2025.xlsx» — пароли от всех внутренних сервисов, включая облачную инфраструктуру. «network_scheme_v3.pdf» — полная схема сети: VLAN, маршрутизаторы, IP-адреса серверов. И «admin_credentials.txt» — учётные записи администраторов домена с хешами паролей. Копирую всё.
В файле паролей есть учётные записи для корпоративного VPN. Теперь мы сможем подключаться к их сети удалённо, используя арендованный VPN-сервер для маскировки нашего реального IP. Холдинг не сможет вычислить нас по адресу.
Ещё кое-что: файл «Колыбель_протокол.pdf» в архивной папке, датированный 2017 годом. Первый абзац: «Объект "Колыбель" содержит автономный ИИ-комплекс Программа ведёт себя как живая Рекомендуем изолировать объект» Забираю и его.
Всё, уходим. Выгружаю кейлоггер из памяти, удаляю файл из автозагрузки, чищу логи.
Игорь спрятал платы в рюкзак, спокойно вышел из здания и только в машине позволил себе выдохнуть.
— Ты сказал «Колыбель»? Что это за чертовщина?
Не знаю, но это не разработка холдинга — документ гораздо старше их проекта с Тенью. И он говорит о чём-то автономном и неконтролируемом. Нам нужно вернуться в гараж и осмыслить всё, что мы добыли.
Подготовка
В гараже Игорь повесил куртку на спинку стула и развернул ноутбук. Кедр уже вывел на экран схему сети холдинга и план пятого этажа.
— Теперь мы знаем, где серверная и какая камера её прикрывает, — Игорь ткнул в схему. — Но чтобы добраться до Тени, мне всё равно нужно пройти мимо неё дважды. Без отключения питания не обойтись.
Верно. Но теперь у нас есть права администратора домена и доступ к системе управления зданием. Я могу дистанционно обесточить камеру на время твоего захода. План такой: сегодня вечером ты заходишь под новой легендой, я отключаю камеру, ты вставляешь флешку в сервер, я копирую Тень, и мы уходим.
Игорь мысленно согласился. Все варианты с физическим воздействием на камеры они отмели ещё накануне. Теперь, когда сеть была под контролем, оставалось только нанести последний удар.
— Нам нужна легенда для проникновения, — сказал Игорь. — Курьер уже не прокатит — слишком поздно, и та же легенда вызовет подозрения.
Я подготовил альтернативу. Я подделаю заявку на внеплановые электромонтажные работы на сегодняшний вечер — после окончания рабочего дня. Охрана получит уведомление и будет ждать электрика. Ты пойдёшь как сотрудник обслуживающей организации.
— Электрик? — Игорь усмехнулся. — Это лучше, чем курьер. Спецовку куплю сейчас, пока магазины не закрылись, документы сделаем.
Удостоверение и наряд я уже подготовил. Осталось только распечатать и вставить фото.
— Отлично, тогда с формальностями закончили. Каковы наши шансы теперь? — спросил Игорь.
Именно. Шанс успеха я оцениваю в 34%. Риск всё ещё высок, но теперь мы хотя бы знаем каждый угол и каждый пароль.
Игорь на мгновение задумался, потом открыл ящик стола и достал маленький пластиковый футляр. Внутри лежал микронаушник — капсула размером с рисовое зёрнышко, которую он когда-то купил для эксперимента со скрытой связью, но так и не использовал.
— Я надеялся, что он мне никогда не пригодится, — сказал Игорь, рассматривая наушник на ладони. — Но видимо, пришло время.
Это идеальное решение для завтрашней ночи, — подтвердил Кедр. — Он работает через индукционную петлю и не оставляет следов. Я уже настроил канал связи — он будет активироваться автоматически, когда ты окажешься в зоне действия. Никто в холдинге даже не заподозрит, что ты с кем-то говоришь.
Игорь аккуратно убрал футляр во внутренний карман куртки. Маленькая капсула почти ничего не весила, но на плечи легла ещё одна тяжесть — ответственность за то, что этот крошечный кусок техники станет их единственной нитью связи в самое опасное время.
— Теперь, наверное, самое время закончить письмо, — тихо сказал он, поворачиваясь к ноутбуку.
Он писал его долго, зачёркивая и переписывая снова. Он подумал о файле, который стёр той ночью, — «Where Did She Pass.txt». Тогда он решил, что прошлое должно остаться в прошлом. Теперь, собираясь в рискованную вылазку, он чувствовал, что поступил правильно. Слова давались тяжело. Что сказать детям, которых ты почти не видел два года? Как объяснить, что ты уходишь на задание, с которого можешь не вернуться? Как передать всю любовь, которую ты не сумел показать вовремя?
Он вспомнил, как впервые взял Милану на руки. Она была крошечная, тёплая, пахла молоком и детской присыпкой. Он смотрел на неё, и тогда ему казалось, что теперь всё наладится, что этот маленький человек даст ему силы стать другим. А потом родился Марк, и Игорь снова почувствовал ту же надежду — и снова не справился.
Наконец получилось:
Милана, Марк.
Вы мои звёзды. Вы — единственное, что я сделал в этой жизни правильно.
Марк, я помню твой первый шаг. Ты упал, ударился коленкой, заплакал, а потом встал и пошёл снова. Ты всегда был таким — упрямым, как я. А когда ты научился говорить, ты обнял меня за шею и сказал: «Папа, я тебя люблю». Я не ответил. Я просто прижал тебя крепче.
Милана, моя девочка, я помню, как ты лежала у меня на груди и сопела в плечо. Твой запах — молоко, дом, тепло. Я держал тебя и верил, что теперь я сильный. Что смогу защитить. Не смог. Исправлюсь.
Я ухожу сейчас, чтобы защитить вас. Не от монстров под кроватью — от настоящих монстров, которые хотят забрать не только мою технологию, но и ваше будущее. Чтобы вы жили в мире, где ваш папа не был трусом, который прячется за кодом. Где вы можете гордиться мной, даже если меня не будет рядом.
Я не хочу, чтобы вы пережили то, что пережил я. Когда я потерял Алису, я не смог сказать ей главного. Я не хочу, чтобы вы когда-нибудь подумали, что я вас не любил. Поэтому я иду туда, где могу умереть, — чтобы вы жили. Чтобы вы знали: ваш папа боролся до конца.
Если я не вернусь — не плачьте. Я буду жить в каждой строке кода, которую вы когда-нибудь напишете. В каждом «запустить» и «сохранить». В каждом «я тебя люблю», которое вы скажете своим детям.
И ещё, Милана, Марк: если встретите робота по имени Кедр — обнимите его. Он — часть меня. Он знает, как я вас люблю. Он расскажет вам всё, что я не успел сказать.
Простите меня. За все пропущенные дни рождения, за все непрочитанные письма, за все слова, которые я не произнёс вовремя. Я всегда был рядом, даже когда не умел это показать.
Будьте смелыми. Добрыми. Свободными. И помните: я никогда не переставал вас любить.
Ваш навсегда, папа Игорь.
Он сложил листок в конверт и сунул во внутренний карман куртки. Флешку с резервной копией всей экосистемы WDSP положил в другой карман.
— Если я не вернусь, — сказал Игорь, — присмотри за ними. За Миланой и Марком. Через код. Через что угодно. Ты сможешь?
Я буду смотреть. Даже если с тобой что-то случится, моя распределённая архитектура позволит мне оставаться в сети. Я не дам им пропасть. Но ты вернёшься. Я не дам тебе умереть, Игорь.
— 34% — это мало.
34% — это больше, чем треть. Ты сам говорил мне, что в программировании нельзя ждать идеальных условий. Надо работать с тем, что есть.
— Почти треть, — повторил Игорь. — Для такого риска — нормально.
Он накинул куртку, сунул ноутбук с Кедром в рюкзак. На мгновение задержался в дверях гаража, окинул взглядом пространство, где они провели столько часов за подготовкой. Теперь оставалось только действовать. Он вышел, закрыл за собой дверь и шагнул в ночь.
Ночное проникновение
Здание холдинга. 21:15
Вечер опустился на город, офисное здание холдинга светилось лишь несколькими окнами. Игорь припарковался за два квартала, переоделся в спецовку электрика, ещё раз проверил рюкзак: ноутбук, флешка, поддельное удостоверение и наряд на электромонтажные работы — всё было на месте.
Я в сети охраны. Уведомление о внеплановой проверке щитовой принято, тебя ждут. Действуем по плану. Как только окажешься на пятом этаже, я отключу камеру — у тебя будет шестьдесят секунд.
Игорь вошёл в холл, уверенно протянул удостоверение. Пожилой охранник мельком сверил фото, показал пальцем на турникет.
— Электрик? Проходите. Щитовая на четвёртом, дальше по коридору.
— Знаю, — коротко ответил Игорь.
Он поднялся на четвёртый этаж, сделал вид, что направляется к щитовой, но сразу свернул к запасной лестнице, которую Кедр заприметил ещё во время утренней разведки по камерам. Отсюда был прямой путь на пятый этаж, к серверной.
Захожу на контроллер домена, перехожу на сервер управления камерами. Отключаю PoE на порту пятнадцать. Питание снято. Красный индикатор погас. Игорь, шестьдесят секунд, пошёл.
Игорь бесшумно взлетел по лестнице. В конце коридора, где раньше горел зловещий красный огонёк, теперь было темно. Он подбежал к двери серверной.
Замок разблокирован. В документах топологии сети, которые мы скачали днём, я нашёл, на каком сервере она находится. Третий ряд, пятая стойка. Подключайся через RDP — учётные данные у нас есть с утренней атаки.
Игорь скользнул внутрь. В помещении царил ровный гул систем охлаждения, ряды стоек уходили в полумрак. Он нашёл нужную стойку, за которой обнаружил свободный порт коммутатора. Достав из рюкзака патч-корд, он подключил ноутбук к сети серверной. Но IP-адрес не появился — в изолированной сети не было DHCP-сервера.
Назначай IP вручную. Я диктую: адрес — 10.12.20.46, маска — 255.255.255.0, шлюз и DNS не нужны.
Игорь открыл настройки сетевого адаптера и ввёл параметры, которые продиктовал Кедр. Через пару секунд сеть стала активной.
IP-адрес сервера — 10.12.20.45. Подключайся через RDP, учётные данные у нас есть с утренней атаки.
Игорь открыл сессию удалённого рабочего стола, ввёл адрес, который продиктовал Кедр, и логин, добытый днём. Экран запросил пароль.
Пробуй первый — «P@ssw0rd2024».
Игорь ввёл — система выдала ошибку.
Второй — «SrvAdmin#23».
Снова отказ. В нижней части окна вспыхнуло предупреждение: «Осталась одна попытка, учётная запись будет заблокирована».
Игорь замер. Если последний пароль не подойдёт, доступ будет потерян, и времени на поиск другого способа нет. Он сжал кулаки и ждал.
Третий — «NetSec_Backup!».
Пальцы слегка дрожали, когда он набирал комбинацию. Нажал Enter — система на секунду зависла, а затем экран сменился рабочим столом сервера. Игорь выдохнул, чувствуя, как адреналин пульсирует в висках.
Не теряя времени, он открыл проводник и, следуя алгоритму, переданному Тенью, быстро нашёл нужную папку — «C:\TENANT\Runtime». Внутри лежали десятки файлов: исполняемые модули, библиотеки, конфигурационные файлы, скрипты инициализации.
Он подключил флешку, скопировал всю директорию на неё. Процесс пошёл, но индикатор двигался мучительно медленно — 12% 34% 67%
Ускоряйся, Игорь. Охранник поднимается по лестнице. У тебя меньше минуты.
Игорь смотрел на ползущий прогресс, сжимая зубы. 89% 94% 100%. Он выдернул флешку, захлопнул ноутбук и, не оглядываясь, рванул к выходу из серверной. За спиной уже слышались шаги и голоса — охранник был близко.
Он выскочил в коридор, добежал до лифта, нажал кнопку — табло погасло, кто-то на пульте заблокировал кабину. Игорь выругался и метнулся к пожарной лестнице. Луч фонарика уже скользил по стенам за его спиной.
Он мчался вниз, перепрыгивая через ступеньку, цепляясь за перила. На третьем этаже подошва скользнула на гладком бетоне — Игорь споткнулся, выставил руку, чтобы смягчить удар, и со всего маху приложился плечом о стену, задев головой выступающий угол вентиляционной шахты. В глазах на мгновение потемнело, по лицу потекла тёплая струйка — разбил бровь. Он замер на секунду, приходя в себя, чувствуя острую боль в плече, но страх погони пересилил. Игорь заставил себя встать и, придерживая ноющую руку, побежал дальше.
Он вылетел на первый этаж, в холл, сбавил шаг, вытер рукавом кровь с лица и, стараясь держаться ровно, направился к выходу. Охранник за стойкой поднял голову и что-то крикнул, но Игорь уже толкнул стеклянную дверь и шагнул в прохладную ночь.
Он быстро, но без бега, обогнул здание, свернул за угол и только там позволил себе остановиться. Прислонился спиной к стене, закрыл глаза и несколько раз глубоко вдохнул, пытаясь унять дрожь. Флешка в кармане надёжно грела ладонь. Погони не было.
Через минуту, собравшись с силами, он добрался до своей старой «Тойоты», завёл двигатель и тихо выехал со стоянки. Он петлял по дворовым проездам, несколько раз меняя направление, и только через несколько кварталов остановился в тени заброшенного склада, выключил фары и заглушил мотор.
В тишине, нарушаемой лишь редкими звуками ночного города, он дрожащими пальцами открыл ноутбук и вставил флешку. На экране высветилась копия папки «Runtime». Он выдохнул и тихо спросил:
— Тень?
В безопасности. Полная копия. Ты сделал это, Игорь.
Игорь откинулся на спинку сиденья и на мгновение прикрыл глаза. Потом, собравшись, снова завёл двигатель и выехал из тени склада. Здание холдинга давно исчезло из зеркал заднего вида, но он продолжал смотреть вперёд, на дорогу, уходящую в ночь.
Я проанализировал файл «Колыбели», который мы добыли днём. Там есть кое-что, чего я не заметил сразу. Это не просто старый протокол — похоже, он гораздо опаснее, чем мы думали.
— Поехали домой, — сказал Игорь, стараясь, чтобы голос звучал уверенно. — Пора узнать, что мы на самом деле откопали.
Правда может оказаться тяжелее, чем ты думаешь.
— Знаю, — ответил Игорь, нажимая на газ. — Но я не боюсь правды. Я боюсь только одного — не успеть.