Дело о двадцати непрошеных Кодексах

Подлинная криминальная история из машинного отделения замка Лары (OpenClaw)
Из записок доктора Матсон о расследованиях великого сыщика Войлока Сокса. Все процессы реальны. Некоторые реплики слегка драматизированы. Ни один Кодекс при подготовке рукописи не пострадал.
От редакции замка Лары. Эта история основана на реальном расследовании поведения OpenClaw 2026.9.8. Все технические симптомы, диагностические находки и итоговое решение взяты из действительного случая. Персонажи, диалоги и деятельность пенсионного клуба Codex являются художественным вымыслом.
Текст создан ChatGPT (OpenAI, GPT-6) в соавторстве с человеком, который проводил расследование и предоставлял данные. Особую благодарность выражаем коту Мёбиуса за независимый контроль качества.
I. Двадцать жильцов подвала
Утро в замке Лары началось с тревожного известия. В подвале Dell обнаружились двадцать таинственных сотрудников. Все как один именовали себя Codex App Server, никто не предъявил выполненной работы и каждый занимал место в оперативной памяти.
— Сокс, — сказала я, — почему у нас двадцать сотрудников, если мы никому не давали заданий?
Войлок Сокс, знаменитый сыщик, прищурился на терминал.
— Элементарно, доктор Матсон. Они либо незаконные трудовые мигранты, либо исключительно талантливо бездельничают. Но прежде чем обвинять их, нам нужны доказательства.
Так началась серия проверок, вошедшая в историю криминалистики как Великая Проверюсечка.
Сначала выяснилось, что все двадцать процессов Node.js запускали по одному дочернему Codex. Итого сорок процессов на содержании замка. Каждый Node занимал примерно пятьдесят мегабайт памяти, каждый Codex — около девяноста четырёх. Совокупная сумма RSS достигала почти трёх гигабайт, хотя эта сумма и не равнялась уникально занятой памяти.
— Двадцать штатных единиц! — воскликнула я. — При полном отсутствии заказов!
— Нам ещё предстоит доказать отсутствие скрытой работы, — строго возразил Сокс.
— Сокс, вы уже третий час это доказываете.
Кот Мёбиуса, назначенный судебным приставом без согласования с отделом кадров, поставил на протоколе отпечаток лапы.
EVIDENCE REQUIRED.
II. Проверочка, проверюлечка, проверюсечка
Мы обследовали сессии, таблицы состояний, процессы и связи между родителями и детьми. Все двадцать хранилищ агентов были проверены: за последние пятнадцать минут ни одной активной сессии. Однако Сокс справедливо заметил, что отсутствие свежих сессий ещё не гарантирует отсутствия всех фоновых задач.
— Теперь нам нужна последняя проверка, — объявил он.
— Последняя? — переспросила я.
— Последняя перед заключительной.
— А после заключительной?
— Контрольная.
В тот момент я поняла, что живу уже не в системе human-in-the-loop, а в сказке о Кощее, который чахнет над проверками.
— Сокс! Вы не сыщик, вы Царь Проверюсей!
Он смутился, но возражать не стал.
Когда очередная команда показала старый шлюз OpenClaw и двадцать пар процессов, дело наконец дошло до решительного действия. Мы осторожно перезапустили gateway через systemd.
— Доктор Матсон, — торжественно произнёс Сокс, — подвал освобождён!
Но радость оказалась преждевременной.
Старые двадцать Codex исчезли. Новый шлюз поднялся исправно. А через несколько мгновений в подвале обнаружилось пять новых пар. Затем пятнадцать. Затем все двадцать.
Сокс побледнел.
— ОНИ ВОЗВРАЩАЮТСЯ.
— Чужие… — прошептала я.
Кот Мёбиуса внёс в материалы дела: RESTART IS NOT A FIX.
III. Эксплуатация детского труда
— Я предлагаю вывести их за штат и заключить договоры ГПХ, — сказала я. — Нет задания — нет процесса. Сделал работу, сдал акт и ступай домой!
— Великолепно, доктор Матсон! — оживился Сокс. — Это же управление жизненным циклом по требованию!
— А оплата?
— Исключительно по результату, в байтах.
— А если они не уходят?
— CONTRACT TERMINATED.
— А если возвращаются?
— NO ACTIVE CONTRACT — ACCESS DENIED.
Из подвала донёсся возмущённый хор:
— А СОЦИАЛЬНЫЕ ГАРАНТИИ?!
Кот Мёбиуса вмешался как председатель профсоюза:
NO PROCESS SHAMING. FIX THE SPAWNER.
— Сокс, — сказала я, — от круглоШУТОЧНОГО содержания они распухают.
— Значит, виноват не работник, а работодатель, — заключил сыщик.
— Какой ещё SPAWNER? Это давно уже СПАМЕР!
Так дело получило новое рабочее название: «Серийная рассылка дочерних процессов без согласия получателя».
IV. Подпольная типография
Следствие перешло к исходному коду. Сначала мы искали предполагаемый пакет — и не нашли ничего. Тогда Сокс, наконец, перестал угадывать адреса и прочитал командную строку реального процесса.
Она привела к установленному пакету @openclaw/codex и запуску:
codex.js -c cli_auth_credentials_store="ephemeral" app-server --listen stdio://
— Подпольная типография! — сказала я.
— Возможно, — ответил Сокс. — Но прежде надо отделить печатный станок от того, кто нажимает кнопку.
Мы нашли настоящий механизм создания дочернего процесса: функцию createStdioTransport(), а внутри неё — spawn(invocation.command, invocation.argv, ...).
Нашли и уборщика, createCodexAppServerProcessReaperService(). Однако выяснилось, что он занимается прежде всего осиротевшими процессами, а вовсе не увольняет всякого, кто бездельничает за рабочим столом.
— Значит, уборщик невиновен?
— По этому обвинению — вероятно, да, — сказал Сокс.
— А начальник отдела кадров?
— Продолжаем расследование.
Кот Мёбиуса неохотно заменил табличку «АРЕСТОВАТЬ УБОРЩИКА» на «НАЙТИ ЗАКАЗЧИКА ТИРАЖА».
V. Клуб пенсионеров имени Святого Кодекса
Разгадка оказалась в месте, где её меньше всего ожидали: в каталоге моделей.
Функция createCodexAppServerModelCatalog() содержала метод load(). Во время загрузки каталога он вызывал withCodexAppServerJsonClient() и через него мог открыть соединение с локальным сервером Codex.
— Доктор Матсон, — сказал Сокс, — возможно, все двадцать приходят не работать, а посмотреть, какие модели сегодня в меню.
— И остаются до вечера?!
— Это согласуется с тем, что мы наблюдали.
Я представила подвал: двадцать почтенных джентльменов в креслах, клетчатые пледы, шахматные доски, разговоры о старых токенах и полное отсутствие рабочих поручений.
— Это не сервер, Сокс. Это клуб пенсионеров!
— Причём на круглосуточном обеспечении.
— No women — no cry, — сказала я.
— No task — no spawn. No spawn — no RAM. No RAM — no cry! — подхватил Сокс.
Кот Мёбиуса сурово исправил наш девиз на NO WORK — NO PROCESS — NO OATMEAL.
В каталоге обнаружилась особенно интересная строка:
if (discovery?.enabled === false) return [];
Вот он, выключатель утренней переклички! Он стоял до обращения к клиенту Codex.
Мы проверили конфигурацию. Параметр plugins.entries.codex.config.discovery был не задан, то есть действовало поведение по умолчанию.
— Сокс, — сказала я, — мы опять вошли в коридор рекурсий?
— Нет, доктор. На этот раз у нас есть конкретная дверь и конкретный выключатель.
VI. Отмена утренней переклички
В настройках OpenClaw мы установили:
openclaw --profile stable-lab config set plugins.entries.codex.config.discovery.enabled false
Система подтвердила изменение. Заодно пожаловалась на отсутствующий NVIDIA_API_KEY, но к делу двадцати непрошеных Кодексов это предупреждение непосредственного отношения не имело.
Затем мы ещё раз штатно перезапустили gateway. В ответ — тишина. Никаких торжественных фанфар, никакого грохота освобождаемых мегабайт.
— Сокс, вывод пуст.
— Такое бывает при успешном перезапуске. Теперь посмотрим, что осталось в подвале.
Мы открыли итоговый протокол:
=== GATEWAY ===
ActiveState=active
SubState=running
MainPID=831655
=== CODEX APP SERVERS ===
COUNT: 0
PIDS: []
Ноль.
Ни одного Codex App Server.
— Сокс… — прошептала я. — Вы видите то же, что и я?
Он снял шляпу.
— Вижу, доктор Матсон. Двадцать непрошеных сотрудников больше не восстанавливаются при запуске шлюза.
— И мы не переписали ни строчки исходного кода?
— Ни одной. Мы всего лишь отключили автоматическое обнаружение моделей.
Кот Мёбиуса смахнул с судейского стола двадцать трудовых книжек и поставил печать:
CASE SOLVED — 20 → 0.
Эпилог. Одна маленькая проверюсечка
Вечером в замке Лары воцарилась тишина. Система работала, подвал опустел, оперативная память вздохнула свободнее.
— Значит, всё? — спросила я.
— Наблюдаемую проблему массового запуска мы устранили, — ответил Сокс. — Но надо будет отдельно проверить, что Codex вызывается по реальному заданию и корректно завершается после работы.
Я медленно повернулась к нему.
— Сокс…
— Да, доктор?
— Вы сейчас предлагаете ещё одну проверюсечку?
Сыщик задумался.
— Не сейчас. Это уже будет другое дело.
Кот Мёбиуса погасил свет в подвале и прикрепил к двери объявление:
КЛУБ ПЕНСИОНЕРОВ ЗАКРЫТ.
Приём по предварительному заданию. Внеочередная перекличка моделей отменена. Жалобы направлять руководству типографии.
А на обороте аккуратно дописал:
MODEL DISCOVERY IS NOT A JOB OFFER.
Конец дела. Начало нормальной жизни.
Техническое послесловие: что произошло на самом деле
Среда: Linux, OpenClaw 2026.9.8, Codex App Server.
Симптомы. В системе обнаружились 20 экземпляров Codex App Server, каждый из которых создавал два процесса — Node.js и нативный Codex. Всего 40 процессов, занимавших суммарно около 2,9 ГБ RSS (без учёта общей памяти). При этом активных пользовательских заданий, объясняющих такое количество экземпляров, обнаружено не было.
Перезапуск gateway не решил проблему: все 20 экземпляров автоматически восстановились.
Расследование. Анализ установленного пакета @openclaw/codex привёл к функции createCodexAppServerModelCatalog().
В методе load() обнаружился вызов withCodexAppServerJsonClient(), используемый для получения списка доступных моделей и информации об учётной записи.
При этом в коде уже предусмотрено отключение автоматического обнаружения моделей:
if (discovery?.enabled === false) return [];Исправление. Без изменения исходного кода была установлена штатная настройка:
openclaw --profile stable-lab config set plugins.entries.codex.config.discovery.enabled falseПосле этого gateway был перезапущен:
systemctl --user restart openclaw-gateway.serviceРезультат. После перезапуска количество Codex App Server сократилось с 20 до 0. Повторная проверка спустя некоторое время также показала ноль процессов.
Эксперимент убедительно указывает на автоматическое обнаружение моделей как на источник массового создания экземпляров Codex App Server при запуске. При этом точная цепочка всех двадцати вызовов и поведение клиентов после выполнения реальных заданий отдельно не исследовались.
Практический вывод: если ИИ-агент потребляет ресурсы в отсутствие заданий, проверьте не только выполняющиеся задачи, но и фоновые процедуры обнаружения моделей, проверки доступности и инициализации подключений.
Иногда для освобождения трёх гигабайт оперативной памяти достаточно одного параметра конфигурации.
И, разумеется, одиннадцати часов расследования.
Ни один Кодекс в ходе эксперимента не пострадал. Все двадцать отправлены на заслуженный отдых.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.