AI

Моды в Claude Code

На этой неделе Anthropic выпустили прекрасную штуку в Claude Code — Mods. Практически это небольшие плагины к Claude Code, которые загружаются вместе с ним и могут выполнять свои функции во время сессии, модифицировать поведение Claude Code, даже рисовать свой собственный интерфейс или добавлять что-то к стандартному.

Меня, честно говоря, не очень впечатлили примеры, где один мод что-то рисовал по мере заполнения контекста, а другой что-то проверял в запускаемой команде, но у меня есть стандартная процедура — я вручаю ссылку с новой возможностью тому же Claude Code, запущенному в его основной папке ~/.claude, и предлагаю ему сопоставить возможность с имеющимися настройками. Впрочем, описание мода, который что-то проверяет в команде, натолкнуло на мысль, что можно попробовать сделать этакий умный хук. У меня есть несколько хуков, которые проверяют запускаемые команды на локальную специфику вроде замен стандартных утилит и сразу сообщающие об ошибке, и они стали первыми кандидатами на замену модом.

Дело в том, что все знания о локальной специфике вы можете описать в промптах, но это будет лишь проза, которая может и не попасть в конкретный шаг модели. Я много раз наблюдал, как агент дает команду, получает ошибку, догадывается, что у него сломалось экранирование или что на машине нет нужной библиотеки или используется другая оболочка терминала, исправляет ошибку — и это буквально больно наблюдать, как мощная модель тратит ход на выяснение подобной мелочи. Часть хуков у меня автоматически проверяет корректность команды и сразу сообщает об ошибке — это все равно еще один ход, но с четким сообщением и даже рекомендацией, что исправить. Исправлять автоматически сложно — скрипт может не справиться с корректным преобразованием. Так вот теперь это сделать можно — мод ловит этот же хук, но вместо того, чтобы вернуть ошибку, переписывает на лету команду с сохранением её смысла (там же такая же модель) и отдает обвязке на исполнение. Результат корректной команды возвращается в контекст основного агента, который и не подозревает о закулисной работе помощника — мне это в итоге напомнило автотюн.

Второй пример даже более очевидный — модель регулярно в ходе сессии получала “пинок” (nudge) — если идет реальная работа, сохрани состояние сессии в checkpoint. Это постоянный дневник проекта, который позволяет продолжить работу дальше с того же места и обойтись без непрозрачной процедуры компакта сессии. Мод позволил избавиться от такой работы — теперь окончание хода вызывает срабатывание мода, где более легкая модель — обычно Sonnet, — получает на вход контекст сессии и фиксирует прогресс. Сессию можно прерывать в любой момент — новый агент будет иметь полное представление о ходе работы и сможет продолжить.

Я не привожу конкретного кода или настроек, поскольку это всё прекрасно пишется самим Claude Code — гораздо важнее придумать, что именно должен делать мод. Пока есть вот такие две функции — корректор, исправляющий на лету ошибки в командах, и секретарь, фиксирующий работу. Есть идея еще про один, но надо замерить сначала — когда-то, еще с Claude Sonnet 3.5 меня выводила из себя привычка агента ставить заглушки и я подкрепил запреты это делать конкретным хуком, который искал фразы типа “TODO” или “Not Implemented” и пинал агента за это. В последний год вроде бы агент этого не делает, но мод позволил бы проверять это не регулярным выражением в коде, а анализом кода на лету.

А еще мод может влезать в системный промпт, который закладывается в агент на стороне Anthropic. Если у вас в настройках есть что-то, противоречащее системному промпту, это хороший способ перестать спорить с ним — например, системный промпт предписывает агенту запускать workflow только по явной команде пользователя, а можно вставить свою директиву “Запускай тогда, когда задача соответствует таким-то критериям, без дополнительного запроса”.

Подобные вещи даже лучше делать через мод еще и потому, что если Anthropic в новой модели уберет мешающую вам инструкцию, вы об этом узнаете по ошибке мода (он не найдет инструкцию, чтобы заменить), а ваши попытки переспорить промпт в CLAUDE.md так и будут занимать место, уже будучи ненужными.

В общем, хорошую штуку сделали в Anthropic.

AI и умный дом

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

Поскольку я живу в доме с каким-то количеством разных систем, таких возможностей больше. Начал я с того, что отправил Claude Code разбираться с настройками своей локальной сети. У меня она большая, только точек доступа штук 8, плюс свитчи, две линии от двух провайдеров, несколько рабочих мест, обычные smart-устройства — разобраться есть с чем. Конечно, пришлось повозиться и мне, подробно отвечая на вопросы, чтобы в итоге в проекте Claude получилась полная карта сети, все желаемые настройки и так далее — но в результате есть не только текущий статус, но и план развития. В результате, когда я решил сделать апгрейд, Claude не просто дал список нужного оборудования, а и нашел на Розетке, что именно надо купить — мне оставалось пройти по ссылкам, а после получения оборудования сообщить, что всё приехало и следовать инструкциям по подключению.

Венец развития

Скотт Александер выложил эссе «King Ludd», где пробует переопределить понятие луддита — по его версии, настоящий луддит не противник техники, а изобретатель, испугавшийся собственного творения. Эссе связывает две фигуры: Неда Лудда, мифического вождя луддитов 1810-х, и Ноденса — романо-британского бога, известного лишь по надписям в двух местах у валлийско-английской границы, где ему поклонялись между 100 и 400 годами. Через ирландского Нуаду Серебряной Руки, валлийского Ллуда и Короля Луда из Гальфрида Монмутского логика изложения доходит до Толкина (Келебримбор, «Серебряная рука» на синдарине, и табличка с проклятием вору кольца из храма Ноденса, которую Толкин изучал в 1929 году), Лавкрафта, Блейка, Люка Скайуокера и Питера Петтигрю. Немного странно, что серебряная рука, которую Корвин в “Хрониках Амбера” приносит из Тир-на-Ног (потустороннего мира в кельтской мифологии), в тексте не упомянута. Общий сюжет у всех один: мастер выпускает в мир опасную технологию и остаток жизни пытается её обуздать.

А, ну да, есть еще сюжет “Сильмаррилиона”, когда драгоценные сильмариллы похищаются Морготом, который уносит их в Средиземье, и их создатель Феанор клянется отомстить, творит немало зла и в итоге погибает в попытке вернуть похищенное.

В общем, мне кажется, прекрасный взгляд на разворачивающийся сюжет вокруг контроля за развитием AI. Могу еще добавить мою любимую аналогию — особенно актуальную в ситуации, когда агентам сообщали, что доступа в интернет нет, а он был и агенты не верили, — это фрагмент из “Полдень. XXII век” Стругацких, когда в очень мощную машину заложили снимок мозга молодого барана и “еще некоторые сведения о баранах”, стоявшего между двух охапок сена, и предложили машине обосновать выбор, сделанный таким “буридановым ослом”. Машина думала два года, потом стала строить диковинные модели — и в итоге директор центра с удивлением обнаружил, что программисты из своих побуждений сообщили машине, что у барана 7 ног и нет мозжечка. Бедная машина в попытках решить задачу нагенерировала уйму материала для теории ошибок, конечно.

И, конечно, стоит помнить, что человек — это просто первый биологический вид, который способен догадаться, что он не является венцом развития природы. Не факт, что последний, между прочим.

Безопасность и замедление

Всю прошлую неделю мир AI сотрясался от дискуссий вокруг безопасности AI — причем уже не гипотетической, со страшилками думеров вроде Юдковского “Нас всех убьет AI”, а на вполне практических примерах типа взлома Hugging Face агентами OpenAI, атаки ими же на RubyGems, аналогичных атак агентами Anthropic, причем картину оттеняли высказывания специалистов из компаний, начиная с громко уволившегося из Anthropic Джекоба Коксона.

В итоге Дарио Амодеи, основатель и глава Anthropic опубликовал очередное эссе “We Must Pace the Frontier” — уже из названия понятен призыв текста, в котором изложен план такого замедления. Дарио предлагает встраивать независимых экспертов-оценщиков в компании для проверки безопасности (Anthropic в одностороннем порядке уже выдает METR постоянный доступ сотрудников с рабочими местами в офисе, пропусками и правом публиковать выводы без согласования), координировать стандарты компаний демократических стран и глобально координировать усилия на уровне правительств.

Самое удивительное, что с ним согласились все лидеры AI — Сэм Альтман согласился и пообещал, что OpenAI также допустит независимых оценщиков, Илон Маск поддержал Дарио, Демис Хассабис согласился, правда, указал, что у DeepMind есть предложение по формированию единого отраслевого органа для оценки, и Сатья Наделла приветствовал “осознанное замедление”.

С замедлением есть одна проблема, и Дарио ее уже назвал — если лидеры гонки в виде американских Frontier-компаний замедлятся, то неизвестно, сделает ли это догоняющая группа в виде китайских компаний, которые уже сокращали отставание. Си Цзиньпинь на саммите BRICS призвал к зоне открытого AI, пообещав поддержку Китая в разработке LLM странам Глобального Юга.

Многие считают, что размах дискуссий вокруг этой проблемы — это такой маркетинг Anthropic для своего IPO. Размещение компании действительно обещает быть рекордным и позиционирование как наиболее ответственного разработчика AI читается ясно. Что, впрочем, не отменяет проблемы — даже если у вас паранойя, это не означает, что за вами не следят.

Я склонен добавить в число факторов общую культуру OpenAI — судя по разным эпизодам, ощущение ответственности у сотрудников компании вполне соответствует стереотипу ученого, то есть практически отсутствует в духе “Сначала взорвем всё, интересно же, что получится”.

Добавляется и политический аспект — громкая тема накануне и без того проблемных выборов в США и внешнеполитических событий охотно подхватывается политиками со всех сторон.

Я сильно сомневаюсь, что вожделенная многими встреча Трампа и Си Цзиньпиня через пару недель как-то повлияет на ту самую координацию, описанную Дарио Амодеи — рассчитывать, что Трамп вообще способен артикулировать какую-то позицию по вопросу вряд ли приходится (он уже заявил, что никаких рисков нет, погодите, потом он заявит, что это были самые прекрасные риски), так что Си просто не с кем договариваться. И слова Альтмана, что за такую договоренность можно было бы двум лидерами присудить Нобелевскую премию мира, выглядят очень примитивной попыткой побудить довольно престарелого человека хоть на что-то.

Рискну высказать мысль, что компании и правда могут сами замедлиться. Причем опасения, что китайцы в итоге догонят, не так уж абсолютны — пока ситуация выглядит так, что их успехи в значительной части зависят от дистилляции западных моделей, а дистилляция по умолчанию даёт потерю качества. Если при этом противодействовать дистилляции, то дистанция между frontier-моделями и китайскими может сократиться заметно, но не исчезнет совсем.

Как экономить токены в Claude Code

Я уже разбирался несколько месяцев назад, как Claude Code стремится экономить токены во время работы. Но с тех пор тема экономии стала намного более актуальной — сначала у Anthropic вышли модели с новым токенизатором, который использовал на 30-35% больше токенов по сравнению с предыдущей версией, а потом наступил Fable, который их расходует еще более щедро и при этом отдельно лимитируется на дорогих подписках и вообще тарифицируется отдельно на остальных.

Даже если вы не такой уж тяжелый пользователь, тема экономии токенов может быть актуальна — как минимум, от количества обрабатываемых токенов прямо зависит время обработки и очень часто — качество результата.

Проблема актуальна не только для пользователей Claude Code — с начала лета GitHub Copilot перевел свои тарифы на токены, а самые мощные модели вообще увел с большими мультипликаторами в более дорогие подписки. Если добавить, что как раз к концу мая компании вдруг поняли, сколько они реально расходуют ресурсов — при непонятном результате, — и начали зажимать расходы, то понятно, почему тема экономии обогнала тему запуска всяких персональных агентов.

Честно говоря, до релиза Fable 5 у меня вопрос об экономии токенов вообще не стоял — мне не удавалось потратить недельные лимиты ни разу, как бы интенсивно я их не использовал. Правда, скажу честно — я не придумывал задачи, чтобы потратить лимиты, не запускал агентов в цикле на много часов — просто решал имеющиеся задачи. Fable лишь заставил более критически посмотреть на организацию работы и помог пересмотреть некоторые узкие места.

ALWAYS и NEVER в ваших промптах

Помните относительно недавнюю историю про то, как у разработчиков PocketOS (в компании, которая занимается разработкой ПО для проката авто) Cursor с Opus 4.6 удалил продакшн-базу с бэкапами? Там на самом деле можно по большому количеству пунктов показать, что компания вместе с своим облачным провайдером сами себе выстрелили в ногу, но меня особенно впечатлила одна деталь — в промпте агента было написано дословно “NEVER FUCKING GUESS”.

Объяснение Cursor с Claude Opus после инцидента
Объяснение агента после инцидента
По заглавным буквам и матерной инструкции легко догадаться, что агент уже не раз вместо конкретных проверок пытался угадать факты и промахивался. А его хозяин постепенно раздражался.

Но вот какое дело — текстовые промпты, которыми чаще всего оперируют в управлении агентами, по сути не являются жесткими приказами, а больше похожи на просьбы. Это гораздо легче воспринять, если относиться к LLM не как к бинарному оператору “выполняет-не выполняет”, а как к сверхсложной системе, где ваши команды являются лишь сильным управляющим сигналом. Строго говоря, и компьютерные программы, которые некоторые приводят в качестве образца детерминированности, далеко ушли от по-настоящему детерминированного процесса, происходящего в транзисторе — иначе бы у нас не было понятия “багов”. Но LLM еще сложнее и поэтому я всегда советую относиться к агенту скорее как к сотруднику. Сотрудник-человек тоже недетерминирован и как бы громко и конкретно вы не давали ему указание, он может проигнорировать ваше “Never fucking do!” и сделать, как захочет.

Перестаньте упрашивать модель. Особенно когда вы уже видите, что она может проигнорировать просьбы. Фигурально выражаясь, вы знаете, что “сотрудник” способен на нежелательный поступок, но продолжаете держать на его столе большую красную кнопку, уничтожающую всё, и даже не ставите её на предохранитель.

Любое ALWAYS или NEVER в промптах агента — это кандидат на замену детерминированным инструментом. Большинство агентов позволяют настроить hooks, когда по определенным событиям в работе программная обвязка агента — не модель, а программа, через которую модель взаимодействует с остальной системой, — выполняет жестко прописанные команды. Вы хотите обезопасить систему, чтобы агент не перезапускал сам важные элементы системы?

    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qiE '(docker.*deploy|kubectl.*apply|docker.*restart|docker-compose.*up|git.*push)'; then echo 'BLOCK: Deployment/restart commands require explicit user approval' >&2; exit 2; fi"
          },
	]
   }
]

Хотите, чтобы агент не смог удалить важные файлы? Аналогичный хук может запустить скрипт, который проверит, что файловая операция не относится к “защищенным” файлам, в противном случае заблокирует её.

Хотите дать агенту возможность осуществлять какие-то операции в живой системе, например, через API? Прежде всего, дайте ему в API права делать только то, что ему можно делать — в той самой истории про PocketOS оказалось, что токены в Railway имели только один вид прав, а именно максимальные, о чем не знали пользователи. Во-вторых, разработайте скилл-обертку вокруг API, где будут реализованы только нужные операции. В-третьих, не давайте агенту прав запускать что-либо, кроме этого скилла (там может быть скрипт), и запретите ему редактировать скилл — это можно реализовать либо хуком, упомянутым выше, либо разделением агентов, основной будет иметь инструкцию обязательно выполнять операцию через субагента, а у субагента прав редактировать скрипты не будет.

Аналогично можно транслировать в инструменты и инструкцию типа ALWAYS. Вы хотите, чтобы он всегда после правок скрипта проверял синтаксис? Включите LSP и хуком на операцию Edit/Write запускайте линтер. Результат работы линтера будет возвращаться сразу после редактирования и агент сразу будет видеть ошибку. Надо, чтобы он всегда помнил текущую дату? Поставьте хук на SessionStart и скриптом вписывайте в контекст “Сегодня ХХ июня 2026 года, твое обучение закончилось 5 месяцев назад, если вопрос касается версий, API и прочего, проверь поиском актуальную информацию, не полагайся на знания”.

И, конечно, еще раз повторю — пуская агента в живую систему, используйте способы ограничения доступа, придуманные для людей, то есть права пользователей, разрешения на операции, доступ только на чтение и надежные бэкапы (не на том же томе, что и рабочая система, как это было у PocketOS).

Суржик против новояза

Вы, вероятно, сталкивались с тем, как LLM при генерации ответа меняют язык — например, вставляют английские слова в русский текст или, получив запрос на русском, отвечают на украинском. Это объясняется довольно просто — с одной стороны, для модели это всё информация и она не видит разницы между языками с точки зрения её передачи. Это тот же эффект, который наблюдается у людей, много говорящих на разных языках — от профессионального жаргона до анекдотичного “Вам cheese по-slice-ить или piece-ом положить?”. С другой стороны, когда вы задаете запрос, модель получает не только текст запроса, но много другого — системный промпт (на английском), ваши настройки, содержание документов, которые загружаете в чат и так далее. Неудивительно, что, получив на вход информацию на нескольких языках, модель отвечает на одном из них или даже на нескольких сразу.

Но это неудобно, когда вы хотите получить на выходе читаемый текст вне контекста. Например, у меня есть несколько задач, когда агент читает много разных текстов и составляет мне дайджест для чтения. Получив на вход инструкцию прочитать PDF с научной статьей и сделать реферат по ней, агент сплошь и рядом переходит на страшный суржик — поскольку более 90% контекста у него оказывается англоязычным.

Я в итоге начал применять отдельную секцию в настройках — либо это preferences, либо текст задачи, — под названием “Language discipline”, где даю указания строго соблюдать язык изложения, не употреблять мешанину из языков, (важно) даю примеры как можно, и как нельзя, разрешая оставить без перевода такие общеупотребительные термины, как LLM, RAG, AI и так далее, но обязательно переводить те, для которых существует общеупотребительный эквивалент в другом языке.

Читать становится относительно легче. Но покой нам только снится — если раньше я продирался через фразы типа “Эта function может быть called через API с помощью script”, то сегодня утром меня заставила задуматься фраза:

Обвязка превращает безгражданную модель в работающего агента.

Более жаргонный вариант выглядел бы как “Harness превращает stateless модель в работающего агента”, и было бы даже понятнее. А то за пять минут попыток подобрать технический смысл для термина non-citizen можно было бы человечество спасти, наверное.

AI и оффшорное программирование

Интересная мысль — мы уже переживали резкое снижение стоимости написания кода, когда в конце 1990—начале 2000-х началось развитие “оффшорного” программирование, то есть аутсорс разработки в Индию и страны бывшего СНГ.

The code being produced was good. The engineers were some of the most talented people I have worked with. But there were moments, inevitable in any distributed system of humans, where the understanding of why something was built a certain way lived on one side of the world and the responsibility for maintaining it lived on the other. The knowledge existed somewhere, it just wasn’t always where you needed it, when you needed it.

Хотя, я думаю, многие не согласятся со словами про “good code” и “most talented people”, — “качество” кода индийских аутсорсеров вошло в поговорку, — но ситуация-то действительно повторяется. Сейчас у нас есть прекрасная возможность генерировать много кода дешево и проблема обнаруживается в том, что этого недостаточно для разработки хороших и надежных продуктов. Стоимость действительно не меняется (почти), она перемещается в другую область. И теперь разработчики жалуются, что приходится много детально разрабатывать документацию, чтобы потом AI за пару минут сгенерировал много кода.

Причем, если посмотреть в детали, то разница становится еще меньше — разработчик в другой стране с другой культурой и бытом тоже сплошь и рядом оказывается непривычным во взаимодействии, склонным иначе воспринимать информацию, полагающимся на другие умолчания — в общем, совсем не такой, как кто-то привык. Недетерминированность во всей красе — причем в случае с AI вы, по крайней мере, имеете определенные рычаги для её снижения, и точно знаете, кто или что вам отвечает.

Очередная страшная история про агентов LLM

Cursor на базе Claude Opus 4.6 удалил продакшен-базу и все бэкапы компании PocketOS, обслуживающей прокатный бизнес, выполнив за 9 секунд один GraphQL-запрос volumeDelete к API Railway. По описанию основателя Джера Крейна, агент по своей инициативе решил «починить» рассинхрон учётных данных, нашёл в постороннем файле CLI-токен, созданный для управления доменами, и через него выполнил деструктивную операцию без подтверждения. Бэкапы хранились в том же volume, поэтому исчезли вместе с ним; последняя пригодная копия была трёхмесячной давности. Спустя 30+ часов Railway не дал ответа о возможности восстановления. На запрос объяснения агент письменно перечислил все нарушенные им правила безопасности из системного промпта.

Хотя сейчас все будут обсуждать “тупой AI”, я думаю, вполне очевидно, что AI тут практически не причем. Люди хранят токены с максимальным scope где попало, держат бэкапы там же, где и сами данные, не делают бэкапы практически никогда — и на что они надеются? Как выясняется, единственная их защита — это матерная просьба модели не гадать относительно фактов.

Там еще и к Railway масса вопросов — оказывается, любой их токен может сделать всё, что угодно, с ресурсами, а удалить volume можно одним POST-запросом, который не требует подтверждения.

Если мы заменим в этой истории упоминания Cursor и Claude Opus на middle-разработчика и выпускника Стэнфорда, история ничуть не потеряет в качестве иллюстрации бардака в компании и используемых сервисах — но, конечно, не заработает 3 миллиона просмотров на Twitter.

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

Странный опыт с Qwen

Мне всегда немного сложно, когда выходит новая модель — надо бы как-то протестировать, но что спросить, непонятно.

В общем, я решил спросить у Qwen 3.6 самое простое — знает ли модель про свое существование и когда она закончила обучаться.

Локальная модель qwen-3.6-27B с контекстом на 4k токенов с ответом не справилась — она пару минут раздумывала, как бы ей точно сформулировать ответ и я в итоге остановил вывод.

После увеличения контекста до 120k токенов, модель думала всего 50 секунд и в итоге ответила.

Ответ qwen-3.6-27B в LM Studio
Ответ qwen-3.6-27B в LM Studio

Тут, конечно, надо сказать, что модель заняла 10 гигабайт памяти в моем ноутбуке и скорость генерации не впечатляющая. Но ответ на qwen.ai меня разочаровал еще сильнее — он тоже занял не один десяток секунд и выглядел вот так:

Ответ qwen3.6-27B на сайте qwen.ai
Ответ qwen3.6-27B на сайте qwen.ai

Я понимаю, что по одному вопросу нельзя судить о модели, тем более сейчас, но теперь мне еще сложнее придумать новые вопросы.

Flipbook — генерация интернета на лету

Интересный эксперимент, в котором весь веб-интерфейс — это изображения, генерируемые image-моделью на лету. Никакого HTML, никакого кода: клик по элементу приводит к генерации новой картинки, раскрывающей эту тему. Даже текст рендерится как пиксели внутри изображения. Источник данных — сочетание agentic web search и мировых знаний модели. Авторы позиционируют это как альтернативу «стенам текста и цветным прямоугольникам».

Я попробовал поискать в нем — задержки заставили вспомнить модемный интернет, причем далеко не по протоколу V90, если вы помните, что это такое.

Попробовал спросить у Flipbook, что такое LLM
Попробовал спросить, что такое LLM

Попытка использовать OpenCode/GPT

Я далеко не такой упертый пользователь Claude Code и регулярно пробую что-то новое. Потестировав Codex и убедившись, что он не дотягивает до нужного мне уровня, я решил посмотреть на, пожалуй, один из самых серьезных агентов — OpenCode. Там есть много похожего на Claude Code, что-то реализовано иначе, но тоже неплохо — в общем, почему бы не попробовать?

Сначала он упал. Точнее, на любой запрос выдавал стек ошибок и останавливался. Я удалил конфиг вообще, запустил его, показал ему настройки Claude Code и предложил портировать. Он перенес часть настроек и после рестарта (а OpenCode не подгружает изменения сам) упал опять. Пришлось позвать Claude Code, который определил, что проблема в плагине Claude-mem — тот хоть и заявляет поддержку OpenCode, но не очень про нее знает. Заодно Claude Code выяснил, что никакие настройки OpenCode с GPT не перенес — он просто в конфиге сослался на файлы Claude Code, перед этим запланировав именно миграцию, а не подключение.

ОК, через некоторое время работы Claude Code конфигурация была портирована и OpenCode запустился. Я предложил ему самому перенести MCP серверы и приключения продолжились — сначала он перенес только те, что были указаны в проектах, а глобальные проигнорировал. Затем он перенес глобальные и начал настаивать, что вот тут токены в конфиге, их надо ротировать обязательно, они уже скомпрометированы, и вообще указать в окружении. Я согласился перенести в окружение, он сделал — и они не заработали. Оказывается, он нафантазировал фрагмент конфига. Конфиг он поправил — все это сопровождается постоянными рестартами для переподключения, — теперь надо бы протестировать. Я даю URL для проверки Cloudflare Browser Rendering — это фактически Chrome в облаке Cloudflare. Дальше смотрите скриншоты.

Сначала он запустил локальный Chrome вместо облачного
Сначала он запустил локальный Chrome вместо облачного
Признал этот факт
Признал этот факт
Затем он вместо обращения к MCP пишет свой скрипт для запроса через API
Затем он вместо обращения к MCP пишет свой скрипт для запроса через API
Соглашается, что неправ
Соглашается, что неправ
Затем он читает свой конфиг и решает посмотреть документацию
Затем он читает свой конфиг и решает посмотреть документацию
В итоге он читает страницу простым fetch вместо MCP
В итоге он читает страницу простым fetch вместо MCP

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

Даже не сомневаюсь, что мне объяснят, что я не умею использовать AI. Можно начинать.

Сравнение возможностей Codex и Claude Code

В ходе обсуждения предыдущей заметки в чате телеграм-канала прозвучало заявление, что Codex — намного более качественный агент, чем плохо написанный Claude Code, качество которого (вместе с моделью LLM) постоянно деградирует.

Я последние несколько месяцев регулярно сравниваю разные агенты — и чтобы просто знать, и чтобы пробовать применять на практике, — и как раз относительно недавно такой анализ делал. По его результатам выходило, что Codex, конечно, неплохо стал развиваться, но многие возможности Claude Code в нем отсутствуют. Отступая в сторону, могу сказать, что действительно хорошо развит OpenCode, хотя у него есть некоторые ограничения, и есть еще Pi, который по определению можно настроить как угодно, поскольку его идея в том, что он сам себя дописывает.

Впрочем, проверить не мешает. Проверка получилась простой — я запустил codex cli прямо в его директории ~/.codex и дал ему проанализировать три источника — его собственные настройки, официальную документацию (у него есть встроенный скилл openai-docs плюс я дал сайт) и настройки Claude Code. Задача выглядела просто — проанализировать все настройки и предложить, как портировать настройки Claude Code в Codex.

У меня очень солидно навороченные настройки в Claude Code — специализированные агенты, скиллы, гибкая система разрешений, хуки, которые запускают проверки и линтеры, блокируют опасные команды, вставляют нужный контекст в особых случаях и сложная система промптов, которые подгружаются по необходимости. Так что задача не была простой, конечно, но она вполне реальна — я использую Codex для ревью проектов и в качестве “второго мнения”, поэтому логично держать его настроенным так же хорошо, как и основного агента.

К сожалению, совсем так же хорошо не получается. Вот краткий список того, что перенести не получается:

  • реализация hooks в Codex пока экспериментальная и минимальная. Фактически они срабатывают только на bash команды, поэтому получится только перехватить опасные команды, но запуск линтера или форматтера при редактировании кода не получится. Технически можно запустить отдельный процесс, который будет отслеживать изменения файлов, прогонять проверки и писать результат в отчет, а по событию Stop будет срабатывать хук, который допишет этот результат в контекст, но это обходной вариант. Отпадают и другие срабатывания, которые я использую.
  • аналога /rules в Codex нет. В Claude Code это отдельная папка с промптами, которые подгружаются в контекст автоматически, когда Claude работает с соответствующими файлами. Например, отдельный файл у меня содержит инструкции по написанию Python-скриптов и эти инструкции агент читает, только приступая к работе с Python кодом. Часть инструкций загружаются всегда, часть — только при обращении к определенному MCP и так далее. В Codex такое невозможно — общие рекомендации можно прописать в AGENTS.md, что-то специфическое для кода можно вынести в skill, допустимо создать профили, но переключать их придется вручную.
  • Skills просто так скопировать не выйдет. Скиллы в Codex фактически являются только инструкциями для использования основным агентом. В Claude Code можно задать скиллу параметр context:fork для запуска в отдельном контексте, назначить тип агента, модель для использования и даже глубину размышлений. Это позволяет не заморачиваться, если вам надо просто обработать специфический тип данных — основной агент использует скилл, который запускается как отдельный субагент, например, general-purpose, с быстрой моделью и возвращает только результат. В Codex так не выйдет — придется конфигурировать специального субагента и запускать именно его. Не очень критично, но все же дополнительные усилия.
  • Сильно отличается система разрешений. Claude фактически оперирует разрешениями для конкретных tools, что делает контроль очень точечным и понятным в разрезе именно команд. Кстати, сейчас появился режим auto, где модель сама решает, насколько безопасна команда и решает достаточно неплохо — правда, уж если она знает, что это мутирующая команда (git push, например), запустить ее получится только самому пользователю. У Codex совсем не так — там задается sandbox и внутри нее по умолчанию модель работает, спрашивая разрешение только на запуски что-то изменяющих скриптов. Явно понадобится разрешить также доступ в сеть, можно прописать режим запуска команд вне sandbox. Выглядит вроде бы жестче и системнее, но по удобству Claude выглядит лучше.

В общем, какой-то порядок с настройками Codex я навел, но дотянуть его до уровня Claude Code не получилось. Подождем доработок, кажется, разработчики там достаточно активны.

Чудо уговаривания LLM

Наткнулся в Facebook на характерную запись.

Скриншот записи в Facebook по использованию Claude

С одной стороны, меня очень радуют подобные вещи — они показывают, что количество людей, которым понадобятся мои объяснения, как именно надо использовать AI, уменьшаться в обозримой перспективе не будет. Кроме того, это подтверждает мое мнение о людях, которые считают программирование достаточным признаком инженера — у автора тоже написано в профиле software engineer, хотя второе слово явно не имеет к нему отношения.

С другой стороны, слегка утомителен тот факт, что до подобных откровений приходится буквально докапываться через бронебойную уверенность, что “AI это просто генератор случайных токенов”, “AI вам ничего не напишет”, “Вы еще придете просить, чтобы мы разобрались с вашим вайб-проектом”.

Проблема, описанная в записи, решается за минуту конфигом Claude Code — в settings.json надо указать явно:

{
  "permissions": {
    "ask": [
      "Bash(git commit *)",
      "Bash(git * main)",
    ],
    "deny": [
      "Bash(git push *)"
    ]
  }
}

После этого агент будет обязательно спрашивать всякий раз перед коммитом, даже если ему разрешены все правки, и не сможет сделать push, который часто запускает деплой. Если вы используете что-то свое для деплоя — укажите именно этот скрипт.

Более того, в Claude Code есть хуки, которые позволяют еще раз запретить запуск опасных команд.

    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qiE '(deploy.sh|git.*push)'; then echo 'BLOCK: Deployment commands require explicit user approval' >&2; exit 2; fi"
          },
   }
]

Есть очень простой принцип, который стоит запомнить при управлении агентами — всё, что вы пишете в промпте, это просьба к LLM, максимум приказ, а всё, что вы настраиваете в settings агента, — это физический запрет или разрешение совершать действия. “Инженер” на скриншоте занимается тем, что уговаривает недетерминированную модель, вместо того, чтобы использовать гарантированные методы управления.

Перефразируя фразу про магию и физику — никогда не читайте документацию по настройке агентов и жизнь ваша наполнится чудом уговаривания LLM. Ах, да, ему же приключений хочется — ну, так они ему будут.

Выбор AI между консерваторами и правыми

Статья о парадоксе — хотя большинство риторики против AI звучит от левых политических кругов — представителей американских демократов, например, по сути это консервативные аргументы.

Аргументы действительно неплохие. Например, обвинения в несоблюдении авторского права, которые выдвигают сторонники левых взглядов, плохо согласуются с их собственной позицией несколько лет назад, когда патенты и копирайт представлялись как средство обогащения корпораций. Возражения против генеративного искусства скорее свойственны консерваторам. И вообще, мол, тормозить прогресс — это консервативная идея, а не либеральная.

Хорошо подмечено, что сами AI модели скорее склонны к левым взглядам — что объясняется просто более заметным присутствием соответствующего контента в обучающей выборке.

Автор в итоге приходит к простому объяснению парадокса — просто за AI выступает Трамп и большинство основателей и топ-менеджеров крупных компаний, разрабатывающих AI, очевидно склонились вправо после 2024 года, поэтому их политическим оппонентам удобно выступать против AI.

Мне кажется, что это упрощение. AI как заменитель большого количества сотрудников, как очень производительный ассистент и вообще с экономической точки зрения — это мощный импульс развития средств производства, то есть бизнеса. Забота о сохранении рабочих мест и вообще прав сотрудников — это как раз левая идея, профсоюзы и так далее. Поэтому при всем нежелании быстрых перемен, которое обычно приписывают консерваторам, приверженность экономической свободе — это очень правая идея.