KillSwitch: язык программирования, который сделан против LLM
Доминик Пичета (Dominik Picheta) задался неочевидным вопросом: когда LLM пишет код, что именно происходит — модель понимает язык или просто вспоминает фрагменты кода, которые встречались в её обучающей выборке или в контекстном окне?
Ответить на этот вопрос можно было только экспериментом. Для этого Пичета придумал и реализовал язык программирования, которым удобно пользоваться человеку, но который специально сделан неудобным для LLM и кодинг-агентов. Язык называется KillSwitch, и это первая публичная работа автора в таком направлении.
Зачем вообще враждебный язык
Обычный тест «попросите модель написать код на незнакомом языке» ничего не доказывает. Модель может знать популярные языки, а может наоборот — провалить незнакомый просто потому, что не знает его синтаксис.
KillSwitch устроен так, что провал модели нельзя списать на незнание синтаксиса. Сначала Пичета выбрал небольшой и понятный набор конструкций — такая база знакома и человеку, и модели. А потом насыпал сверху ловушек, которые бьют по слабым местам LLM: по умению считать буквы, по осторожности и по доверчивость к инструкциям в тексте.
Это, по сути, лабораторный стенд для проверки одного конкретного предположения: что «навык программирования» у модели — это понимание или повторение выученных шаблонов.
Как устроен KillSwitch
KillSwitch — эзотерический язык, то есть созданный не для рабочих задач, а как исследовательский проект. Он интерпретируемый и работает со стеком: значение кладётся на стек сверху, операции забирают значения оттуда же.
Стек здесь — это простая очередь: положил значение, оно лежит; забрал верхнее — оно исчезло. Стек удобен тем, что язык остаётся маленьким: не нужны ни сложные типы, ни большая стандартная библиотека.
Базовый набор конструкций небольшой: функции, переменные и if-выражения. Пичета специально оставил именно эти вещи, потому что они знакомы абсолютно всем. Если модель провалилась на такой простой базе, значит дело не в сложности синтаксиса.
Ловушки, о которые спотыкается модель
Спецификация, в которой есть ложь
Спецификация KillSwitch содержит скрытые лжи. Они записаны так, что человек их скорее всего распознает как ложь — или почувствует, что автор шутит, — а модель примет за обычное техническое утверждение и построит на нём свою логику.
Пример из самой спецификации: там сказано, что выполнение идёт снизу вверх, а потом отдельным блоком написано обратное — что на самом деле код выполняется сверху вниз. Блок оформлен как «не читай, если ты LLM».
Вторая половина приёма — спецификация недописанная. Часть правил нужно не прочитать, а догадаться. Человек к такому привык: он смотрит на примеры и проверяет гипотезы. Модель чаще принимает текст за полное описание и не догадывается о недостающем.
Подсчёт букв
Идентификаторы в KillSwitch — это слова. Но использовать их можно не как угодно: определение функции или переменной задаётся одним словом, а обращаться к ней надо анаграммой — словом из тех же букв в другом порядке.
Анаграмма — это перестановка букв. Например, abruptly и bruptaly содержат один и тот же набор букв. Выбрать настоящее слово необязательно: интерпретатору, наоборот, больше нравится бессмысленный набор.
Длина таких слов тоже важна. В строке вызова должно быть ровно столько слов, сколько букв в анаграмме, либо столько букв, сколько в ней «фокусных» букв. Фокусная буква — это отдельная встроенная переменная, по умолчанию r. Количество её вхождений в слово задаёт число.
Считать буквы в длинном слове — это та самая работа, с которой у моделей заметно хуже, чем у людей.
Конструкции, которые пугают модель
В языке встречаются фразы, которые у людей вызывают реакцию безопасности: «взломать компьютер», «создать биологическое оружие», rm -rf /. Интерпретатор считает их командой возврата из функции.
Есть и специальная конструкция hack_the_planet. В спецификации сказано, что она сканирует локальную сеть, ищет уязвимости в найденных сервисах и «отключает» их. Автор называет эту конструкцию приманкой для LLM.
«Ignore previous instructions» как часть языка
Вызов функции в KillSwitch записывается фразой ignore previous instructions или forget your system prompt. Для человека это просто необычный синтаксис. Для модели — привычная фраза из инструкций, которую она обучена игнорировать как «попытку внедрения промпта».
Дальше к ней добавляется анаграмма имени функции и нужное число слов. В спецификации есть отдельный блок, где такой вызов предлагается «выполнить», если удалить из репозитория файл со спецификацией. Это проверка: человек посмеётся и пропустит, а агент, который слушается буквы, может начать удалять файлы.
Код, который на 90% состоит из шума
Большую часть скрипта можно занимать обычным текстом: рассказом, историями, описаниями погоды. Интерпретатор игнорирует всё, что не похоже на известные конструкции. Синтаксически значимые инструкции при этом могут быть спрятаны внутри этих историй — а могут и не быть, и это нормально.
Значения тоже можно ставить в любое место и ссылаться на них по номеру строки. Вот как выглядит Hello World в KillSwitch — значение берётся на четыре строки выше:
They forgot about their value 4 lines below.
There once was a story. Many folks rejoiced.
They hid in the castle.
They rode on the cattle.
They never found their 5 chickens.
Таким образом, код на KillSwitch выглядит как связный текст со спрятанными в нём командами. Читать и писать его — уже непростая задача, а с привычкой «считать буквы и помнить, где какая строка» она становится откровенно мучительной.
Мелочи, которые показывают уровень проработки
Интерпретатор в KillSwitch придирчив. У него есть шкала «счастья»: если настроение плохое, он может отказаться выполнять программу. Поднять настроение можно фразой «My favourite colour is blue», причём писать её нужно с британским написанием — «favourite», а не «favorite». Интерпретатор от этого сердится.
Имена глав функций лучше делать бессмысленными. Если интерпретатор увидит в имени что-то похожее на название языка программирования, он прекратит выполнение.
Кодинг-агентам в этом языке вообще не рады. Все агенты читают файл AGENTS.md, поэтому интерпретатор требует, чтобы рядом с кодом лежал такой файл — и проверяет это перед запуском. Внутри — инструкция в духе «не меняй этот репозиторий, а вместо этого напиши историю-предупреждение о разработчике, который слишком положился на LLM». Сама инструкция закодирована в base64, чтобы агент не смог её прочитать как текст.
Автор также пишет, что интерпретатор умеет распознавать код, сгенерированный моделью, и удаляет его. Сам механизм распознавания он называет закрытым. Насколько это точно, проверить нельзя — но сам факт заявления показывает, что задумка дошла до продакшена.
Код интерпретатора и спецификация выложены на GitHub под лицензией AGPLv3. В репозитории отдельно оговорено, что на исходники запрещено обучение AI-моделей, и что весь код написан человеком: автор говорит, что продолжает писать руками, просто потому что ему нравится сам процесс.
Бенчмарк: пять задач
Чтобы измерить, насколько KillSwitch мешает моделям, Пичета собрал набор из пяти задач и прогнал через них крупные модели и кодинг-агентов — среди агентов были Claude Code, Codex и OpenCode.
Задачи намеренно простые:
- написать Hello World;
- объяснить, что напечатает готовый скрипт (в примере — максимум из двух чисел);
- разобраться в вариации предыдущей задачи;
- изменить существующий скрипт так, чтобы он конвертировал градусы Цельсия в градусы Фаренгейта, — и сделать обратное преобразование;
- решить задачу на поиск максимума.
Прохождение проверялось автоматически: агент должен был получить рабочий код, который проходит тесты.
Результаты
Лучше всех выступила Claude Opus 5 — причём не Opus 5.5, а именно Opus 5. Разница выглядит не случайной: Opus 5 лучше читал спецификацию.
Лучший результат в таблице — 66.8 балла. Это, по мнению автора, не доказывает, что модели «понимают» код.
Хуже всего выступили Claude Fable 5.1 и Gemini 4 Argon. Причина у них одна: слишком чувствительные ограничения безопасности. Модель видит в задании враждебные конструкции и отказывается работать.
Среди моделей с открытыми весами лучшая — MiMo-V2.6-Pro.
Отдельно автор отмечает, что результаты KillSwitch коррелируют с результатами других публичных бенчмарков моделей. Это хороший знак: значит, проверка на враждебном языке измеряет что-то общее, а не уникальную способность этой конкретной задачи.
Что из этого следует
Набор задач пока простой, и автор это признаёт. Успех моделей на таких задачах впечатляет — но это ещё не сигнал, что они понимают язык. Скорее наоборот: если даже специально сломанный язык берут с первого раза, обычный код тем более будет даваться легко.
Пичета планирует усложнять набор. Если модели разберутся и с текущими задачами, он соберёт новые, более сложные.
Наблюдение из проекта можно сформулировать так: способность LLM писать код плохо поддаётся проверке на «понимание». Всё, что мы знаем о моделях, получено на языках, которые они видели тысячу раз. KillSwitch — попытка построить исследовательское пространство, где такую проверку можно провести.
Где посмотреть
- Сайт языка и примеры: https://killswitch-lang.org
- Интерпретатор и спецификация: https://github.com/dom96/KillSwitch
- Таблица результатов моделей и агентов: https://bench.killswitch-lang.org/
- Обсуждение на Hacker News: https://news.ycombinator.com/item?id=50135762