<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">40Ants</title><id>https://40ants.com/</id><updated>2026-10-12T19:53:02.908281Z</updated><link>https://40ants.com/</link><subtitle type="text">Just an example of the static file generated by StatiCL.</subtitle><entry><title type="text">Common Lisp &amp; Hardware Security</title><id>https://40ants.com/ru/posts/common-lisp-hardwa-85/</id><updated>2026-10-12T19:53:02.860703Z</updated><link>https://40ants.com/ru/posts/common-lisp-hardwa-85/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/85.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Сегодня наткнулся на ещё одно интересное применение Common Lisp — &lt;a href=&quot;https://github.com/AB-KeyNub/KeyNub-SDK/tree/master/bindings/common-lisp&quot;&gt;SDK KeyNub&lt;/a&gt; для работы с аппаратным USB-ключом. Такой ключ хранит лицензию и нужен для использования коммерческого ПО. Получается, что можно на Common Lisp писать софт, для использования которого потребуется такой вот hardware-ключ.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/85.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Сегодня наткнулся на ещё одно интересное применение Common Lisp — &lt;a href=&quot;https://github.com/AB-KeyNub/KeyNub-SDK/tree/master/bindings/common-lisp&quot;&gt;SDK KeyNub&lt;/a&gt; для работы с аппаратным USB-ключом. Такой ключ хранит лицензию и нужен для использования коммерческого ПО. Получается, что можно на Common Lisp писать софт, для использования которого потребуется такой вот hardware-ключ.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Классно, что в SDK есть поддержка Common Lisp наряду с несколькими десятками других языков программирования. Причём для него есть &lt;a href=&quot;https://www.keynub.com/developers/common-lisp/&quot;&gt;отдельная страничка с документацией&lt;/a&gt; и примером — можно посмотреть, как прочитать лицензию из ключа.&lt;/p&gt;

&lt;p&gt;Для меня это ещё один приятный признак того, что на Common Lisp пишут коммерческий софт.&lt;/p&gt;
</content></entry><entry><title type="text">Как не открыть лишний порт на сервере</title><id>https://40ants.com/ru/posts/kak-ne-otkryt-lishni-84/</id><updated>2026-10-12T19:53:02.862783Z</updated><link>https://40ants.com/ru/posts/kak-ne-otkryt-lishni-84/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/84.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Сегодня возился с настройкой сервисов умного дома на Raspberry Pi. На таких машинках постоянно что-нибудь меняется: устанавливаешь новое ПО, обновляешь старое, правишь конфиги, пробуешь очередной сервис. И в какой-то момент хочется убедиться, что после всех этих изменений наружу не стал смотреть какой-нибудь неожиданный порт.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/84.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Сегодня возился с настройкой сервисов умного дома на Raspberry Pi. На таких машинках постоянно что-нибудь меняется: устанавливаешь новое ПО, обновляешь старое, правишь конфиги, пробуешь очередной сервис. И в какой-то момент хочется убедиться, что после всех этих изменений наружу не стал смотреть какой-нибудь неожиданный порт.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Проверять это вручную неудобно. Можно запустить Nmap, но тогда придётся сканировать диапазон портов и потом разбираться с результатом. Мне же нужна была более узкая проверка для собственных серверов: узнать, какие сетевые порты машина действительно слушает, и проверить, доступны ли они с моего компьютера.&lt;/p&gt;

&lt;p&gt;Поэтому я сделал небольшую утилиту &lt;a href=&quot;https://40ants.com/ports-checker/&quot;&gt;ports-checker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Сначала она подключается к серверу по SSH и получает список портов, которые слушают на внешних интерфейсах. Затем SSH-соединение закрывается, и каждый найденный порт проверяется уже с компьютера, на котором запущена команда. Таким образом, &lt;code&gt;ports-checker&lt;/code&gt; сопоставляет взгляд изнутри сервера с тем, что реально доступно по сети.&lt;/p&gt;

&lt;p&gt;Ожидаемые открытые порты можно перечислить через allowlist:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
ports-checker --allow 22,80,443
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Если доступен только SSH, веб-сервер и HTTPS — всё хорошо. Если после установки очередного сервиса обнаружится ещё один порт, которого нет в списке, утилита сообщит об ошибке и завершится с кодом 1.&lt;/p&gt;

&lt;p&gt;Благодаря коду возврата такую проверку можно встроить в скрипт настройки сервера или запускать после обновлений. Тогда неожиданно открытый порт не затеряется среди остальных изменений, а сразу сломает проверку и привлечёт внимание.&lt;/p&gt;

&lt;p&gt;Это не замена Nmap и не универсальный сканер безопасности. &lt;code&gt;ports-checker&lt;/code&gt; проверяет только те порты, которые уже слушает удалённая машина. Зато для автоматического контроля собственных Raspberry Pi и небольших серверов этого как раз достаточно. А ещё, эта утилита решает проблему того, что на запуски nmap по широкому диапазону портов, в некоторых окружениях, могут срабатывать секалерты, например у провадера. Такой же кастомный скрипт, делающий несколько проверок, их не стриггерит.&lt;/p&gt;
</content></entry><entry><title type="text">Узнал про git switch</title><id>https://40ants.com/ru/posts/uznal-pro-git-switch-83/</id><updated>2026-10-12T19:53:02.863657Z</updated><link>https://40ants.com/ru/posts/uznal-pro-git-switch-83/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/83.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Наблюдая за нейронками, за тем, как они работают, порой узнаёшь для себя что-нибудь новенькое, какой-нибудь приёмчик, который каким-то образом прошёл мимо тебя.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/83.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Наблюдая за нейронками, за тем, как они работают, порой узнаёшь для себя что-нибудь новенькое, какой-нибудь приёмчик, который каким-то образом прошёл мимо тебя.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Сегодня я узнал таким образом про команду &lt;code&gt;git switch&lt;/code&gt;, которая появилась в версии 2.23, вышедшей аж в 2019 году. Интересно, как я проспал целых семь лет?!&lt;/p&gt;

&lt;p&gt;На картинке к этому посту как раз показаны различия между &lt;code&gt;git checkout&lt;/code&gt;, которым я до сих пор пользовался, &lt;code&gt;git switch&lt;/code&gt; и &lt;code&gt;git restore&lt;/code&gt;. Прежде все эти функции выполнялись одной командой, а затем появились две новые. При этом и legacy-поведение до сих пор поддерживается.&lt;/p&gt;

&lt;p&gt;Короче, век живи — век учись. Теперь буду &lt;code&gt;git switch&lt;/code&gt; использовать, как молодёжь и LLM :)&lt;/p&gt;
</content></entry><entry><title type="text">Конец эпохи программирования</title><id>https://40ants.com/ru/posts/konec-epohi-programm-82/</id><updated>2026-10-12T19:53:02.865292Z</updated><link>https://40ants.com/ru/posts/konec-epohi-programm-82/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/82.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Вот эту картинку я сегодня стырил в одном из каналов. Не смог не перепостить, потому что последние пару дней именно такие ощущения меня преследуют - что ушла целая эпоха. Раньше ты мог считать себя программистом на C++, Python или JS, а теперь мы все просто макаки, перекладывающие промпты.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/82.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Вот эту картинку я сегодня стырил в одном из каналов. Не смог не перепостить, потому что последние пару дней именно такие ощущения меня преследуют - что ушла целая эпоха. Раньше ты мог считать себя программистом на C++, Python или JS, а теперь мы все просто макаки, перекладывающие промпты.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;При чем думаю что сейчас люди будут ещё более разделяться на две категории:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;тех кто в общем то программированием и не горел никогда&lt;/li&gt;
&lt;li&gt;и тех, кто любит писать код&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Первые сейчас с энтузиазмом внедряют AI-first подходы и грезят о времени когда машины заменят весь ручной труд.&lt;/p&gt;

&lt;p&gt;Вторые, даже несмотря на повсеместное использование AI будут продолжать писать код руками, хотя бы как хобби.&lt;/p&gt;

&lt;p&gt;Я сейчас где-то между этими двумя категориями. С одной стороны, я живу на то, что платит копорация, а корпорация хочет везде и всюду внедрять AI и заменять людей. С другой, я всегда любил писать код и получаю от этого дофамин, особенно когда использую Common Lisp (его быстрый REPL очень способствует тому, чтобы ты как можно быстрее видел результат своих изменений).&lt;/p&gt;

&lt;p&gt;При этом, даже и в хобби проектах я нет нет да и скатываюсь уже к тому, чтобы какую-то часть работы перепоручить LLM. Главное - не увлекаться этим и делегировать только задачи, которые никогда не приносили удовольствия, например обновление документации, создание тестов или HTML вёрстка.&lt;/p&gt;

&lt;p&gt;А у вас какие ощущения от AI гонки?&lt;/p&gt;
</content></entry><entry><title type="text">В чём сложность форматирования кода на Lisp?</title><id>https://40ants.com/ru/posts/v-chyom-slozhnost-form-81/</id><updated>2026-10-12T19:53:02.866581Z</updated><link>https://40ants.com/ru/posts/v-chyom-slozhnost-form-81/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/81.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;В нынешние времена, когда большую часть кода пишут LLM, особенно остро встаёт проблема форматирования. Нейронки часто с этим косячат — особенно с отступами. В идеале перед коммитом они должны одной командой приводить все изменённые файлы к принятому в проекте формату.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/81.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;В нынешние времена, когда большую часть кода пишут LLM, особенно остро встаёт проблема форматирования. Нейронки часто с этим косячат — особенно с отступами. В идеале перед коммитом они должны одной командой приводить все изменённые файлы к принятому в проекте формату.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Вы скажете, что форматирование кода — простая задача, которую давно решили. Но, к сожалению, для моего любимого Common Lisp это не так. Всё потому, что Lisp отличается от многих других языков макросами: они позволяют определять новые синтаксические конструкции, и заранее написанный форматтер может просто не знать, как правильно их форматировать.&lt;/p&gt;

&lt;p&gt;Впрочем, тут на помощь приходят библиотеки, в которых можно задать правила форматирования кастомных макросов. Да и сами редакторы вроде Emacs + SLY пытаются с помощью разных эвристик угадать, какой стиль лучше подойдёт той или иной форме.&lt;/p&gt;

&lt;p&gt;В целом меня устраивает то, как Emacs + SLY форматирует мой код. Но сейчас я ищу способ дать AI-агенту возможность из командной строки отформатировать Lisp-код так же, как это делает редактор. В следующих нескольких постах расскажу, какие способы попробовал и на чём в итоге остановился.&lt;/p&gt;
</content></entry><entry><title type="text">Мой сетап с Atomic Spec и Beads</title><id>https://40ants.com/ru/posts/moj-setap-s-atomic-s-80/</id><updated>2026-10-12T19:53:02.868869Z</updated><link>https://40ants.com/ru/posts/moj-setap-s-atomic-s-80/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/80.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;В одном из предыдущих постов я писал о том, &lt;a href=&quot;https://40ants.com/ru/posts/chto-takoe-atomic-spe-75/&quot;&gt;что такое Atomic Spec&lt;/a&gt;. А в одном из последних проектов настроил упряжь так, чтобы скиллы Atomic Spec работали вместе со скиллами Beads.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/80.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;В одном из предыдущих постов я писал о том, &lt;a href=&quot;https://40ants.com/ru/posts/chto-takoe-atomic-spe-75/&quot;&gt;что такое Atomic Spec&lt;/a&gt;. А в одном из последних проектов настроил упряжь так, чтобы скиллы Atomic Spec работали вместе со скиллами Beads.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Роли у них разные. Atomic Spec формирует и правит кейсы и спеки, описывающие, как должна работать система. А Beads используется для оперативного трекинга задач: хранит их статусы, контекст и связи между ними. Туда же агент складывает заметки на память, когда я прошу LLM порефлексировать и запомнить уроки на будущее.&lt;/p&gt;

&lt;p&gt;Сложную задачу агент разбивает на этапы, и хочется, чтобы этот план переживал сжатие контекста. Если держать его только в сессии, то какие-то детали могут потеряться. С Beads агент может вернуться к сохранённым задачам и посмотреть, что уже сделано, а что ещё осталось. А так же он может запускать сабагентов параллельно и каждый из них будет работать над своей подзадачей.&lt;/p&gt;

&lt;p&gt;Помимо прочих плюсов, агент обновляет статус каждой подзадачи и оставляет комменты по ходу работы. Потом можно достаточно легко проверить ключевые моменты: что он делал, на чём застрял и к чему пришёл. Без этого, разобраться что делал агент, пришлось бы копаясь в сессии.&lt;/p&gt;

&lt;p&gt;Ещё у меня был активен набор скиллов Superpowers — мне нравится оттуда навык проведения брейнштормов. Только если Atomic Spec работает достаточно автономно, то когда активен Superpowers агент периодически &amp;quot;соскакивает&amp;quot; на него, и начинает писать план в стиле superpowers, а не как atomic spec.&lt;/p&gt;

&lt;p&gt;Чтобы этого избежать, нужно явно прописать в &lt;code&gt;AGENTS.md&lt;/code&gt;, что оркестратором выступает только Atomic Spec, а Superpowers не должен перехватывать управление. Так у агента остаётся один понятный порядок работы, а Beads хранит её текущее состояние и накопленные заметки.&lt;/p&gt;

&lt;p&gt;А ещё у Beads есть возможность шарить задачи между участниками команды и мерджить изменения базы. Под капотом там Dolt — база данных с версионированием, ветками и слиянием изменений. Идея похожа на работу с ветками в Git, только здесь речь о данных трекера. Эту часть я пока не опробовал, но интересно посмотреть, как она поведёт себя в командной работе.&lt;/p&gt;

&lt;p&gt;• &lt;a href=&quot;https://github.com/dab512/atomic-spec&quot;&gt;Atomic Spec&lt;/a&gt; — скилл для работы по этой методе
• &lt;a href=&quot;https://github.com/gastownhall/beads&quot;&gt;Beads&lt;/a&gt; — код и описание возможностей&lt;/p&gt;
</content></entry><entry><title type="text">Отсчет времени в разметке на GitHub</title><id>https://40ants.com/ru/posts/otschet-vremeni-v-raz-79/</id><updated>2026-10-12T19:53:02.870156Z</updated><link>https://40ants.com/ru/posts/otschet-vremeni-v-raz-79/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/79.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Недавно исследовал, как выглядят комментарии Codex в pull request на GitHub. В некоторых из них увидел время, показывающее, как давно агент сделал ревью. Сначала подумал, что это какая-то обычная часть интерфейса GitHub, но оказалось — нет.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/79.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;Недавно исследовал, как выглядят комментарии Codex в pull request на GitHub. В некоторых из них увидел время, показывающее, как давно агент сделал ревью. Сначала подумал, что это какая-то обычная часть интерфейса GitHub, но оказалось — нет.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;В markdown разметку GitHub можно вставить специальный элемент &lt;code&gt;&amp;lt;relative-time&amp;gt;&lt;/code&gt;. Ему передаётся момент времени, а на фронтенде он сам превращается в понятную надпись вроде «5 minutes ago». И продолжает её обновлять, даже если страницу не рефрешить.&lt;/p&gt;

&lt;p&gt;Например, выглядит это так:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&amp;lt;relative-time datetime=&amp;quot;2026-09-05T12:00:00Z&amp;quot;&amp;gt;
  5 сентября 2026
&amp;lt;/relative-time&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Я сделал &lt;a href=&quot;https://gist.github.com/svetlyak40wt/716a74948f3dc09dd3030932af122d32&quot;&gt;простой gist&lt;/a&gt;, где можно посмотреть на это вживую.&lt;/p&gt;

&lt;p&gt;Мне кажется, такой элемент особенно хорошо подходит для документации. Можно пометить функцию как устаревающую и написать, что она будет удалена из API в определённую дату. Вместо статичной даты читатель увидит, сколько дней осталось до удаления.&lt;/p&gt;

&lt;p&gt;Прикольно то, что &lt;code&gt;relative-time&lt;/code&gt; — не внутренний компонент GitHub. Это &lt;a href=&quot;https://github.com/github/relative-time-element&quot;&gt;отдельный веб-компонент&lt;/a&gt;, который можно поставить в свой проект.&lt;/p&gt;
</content></entry><entry><title type="text">Herdr вместо tmux для работы с несколькими AI-агентами</title><id>https://40ants.com/ru/posts/herdr-vmesto-tmux-dl-78/</id><updated>2026-10-12T19:53:02.871797Z</updated><link>https://40ants.com/ru/posts/herdr-vmesto-tmux-dl-78/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/78.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;У меня обычно одновременно запущено несколько AI-агентов: один что-то пишет в одном проекте, другой разбирается с багом в другом, третий ждёт, пока я отвечу на вопрос. Раньше для этого я поднимал tmux-сессии.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/78.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;У меня обычно одновременно запущено несколько AI-агентов: один что-то пишет в одном проекте, другой разбирается с багом в другом, третий ждёт, пока я отвечу на вопрос. Раньше для этого я поднимал tmux-сессии.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Tmux отлично решает базовую задачу: процессы не умирают при закрытии терминала, есть окна и панели. Но когда агентов становится несколько, проверять их состояние не очень удобно. Приходится переключаться между панелями и смотреть: он ещё думает, закончил или уже ждёт от меня решения?&lt;/p&gt;

&lt;p&gt;Недавно попробовал &lt;a href=&quot;https://herdr.dev/&quot;&gt;Herdr&lt;/a&gt;. Это тоже терминальный мультиплексор: есть workspaces, вкладки и панели. Но в боковой панели он ещё показывает состояние агентов: работает, заблокирован вопросом, закончил работу или уже просмотрен. Поэтому можно одним взглядом понять, куда сейчас стоит пойти, а кого лучше не трогать.&lt;/p&gt;

&lt;p&gt;Особенно понравился remote-режим. Достаточно запустить локально:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
herdr --remote user@server
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Herdr сам подключается по SSH, а если на сервере нет подходящей версии, ставит совместимый бинарник и поднимает удалённую сессию. Интерфейс при этом остаётся локальным: по умолчанию используются мои локальные клавиши. Не надо, как раньше с tmux, отдельно переносить и синхронизировать конфиг между ноутбуком и сервером, хотя конечно, SSH-доступ и окружение для самих агентов на сервере всё равно надо подготовить.&lt;/p&gt;

&lt;p&gt;Кстати, сами настройки Herdr, более человечные, чем в Tmux. Начать хотя бы с того, что табы по умолчанию нумеруются с 1 а не с 0 и заканчивая тем, что настроечки можно менять через TUI диалоговые окна, а не только через конфиг.&lt;/p&gt;

&lt;p&gt;Короче, попробую пожить с Herdr вместо tmux.&lt;/p&gt;
</content></entry><entry><title type="text">Собираюсь на AI Native Conf</title><id>https://40ants.com/ru/posts/sobirayus-na-ai-nati-77/</id><updated>2026-10-12T19:53:02.872634Z</updated><link>https://40ants.com/ru/posts/sobirayus-na-ai-nati-77/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/77.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;В октябре собираюсь пойти на &lt;a href=&quot;https://ainativeconf.ru/&quot;&gt;AI Native Conf&lt;/a&gt;. Интересно посмотреть, что сейчас происходит вокруг разработки с AI и агентами, и послушать доклады людей, которые это всё уже пробуют в реальных проектах.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/77.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;В октябре собираюсь пойти на &lt;a href=&quot;https://ainativeconf.ru/&quot;&gt;AI Native Conf&lt;/a&gt;. Интересно посмотреть, что сейчас происходит вокруг разработки с AI и агентами, и послушать доклады людей, которые это всё уже пробуют в реальных проектах.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Кстати, организаторы этой конфы поделились материалами с предыдущей Agentic Dev Conf — транскрипциями докладов. Я решил собрать их в &lt;a href=&quot;https://github.com/svetlyak40wt/agentic-dev-conf-materials-2026&quot;&gt;отдельный репозиторий на GitHub&lt;/a&gt; и дополнительно добавил README с выжимками самого важного из каждого доклада. Пользуйтесь!&lt;/p&gt;

&lt;p&gt;Если тоже собираетесь на конференцию 20 октября — давайте там встретимся!&lt;/p&gt;
</content></entry><entry><title type="text">Залупливание кодового ассистента</title><id>https://40ants.com/ru/posts/zaluplivanie-kodovog-76/</id><updated>2026-10-12T19:53:02.908270Z</updated><link>https://40ants.com/ru/posts/zaluplivanie-kodovog-76/</link><summary type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/76.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;На днях мне понадобилось добавить в &lt;a href=&quot;https://github.com/40ants/bots&quot;&gt;40ants-bots&lt;/a&gt; поддержку клиента мессенджера MAX. Раньше библиотека работала только с Telegram, а теперь хочется уметь поддерживать разные мессенджеры.&lt;/p&gt;
</summary><content type="text">&lt;p&gt;&lt;img src=&quot;https://40ants.com/ru/posts/images/76.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;

&lt;p&gt;На днях мне понадобилось добавить в &lt;a href=&quot;https://github.com/40ants/bots&quot;&gt;40ants-bots&lt;/a&gt; поддержку клиента мессенджера MAX. Раньше библиотека работала только с Telegram, а теперь хочется уметь поддерживать разные мессенджеры.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Решил сделать это с помощью AI-ассистента и заодно испытать подход Atomic Spec, о котором недавно писал. Попросил агента продумать внедрение, разложить его на отдельные спеки и описать в них весь нужный функционал. С этим он справился вполне неплохо.&lt;/p&gt;

&lt;p&gt;А вот дальше хотелось максимально вайбово: дать модели реализовать всё самой, а потом только проверить результат. Тут и началось. Codex периодически останавливался и спрашивал: &amp;quot;Что делать дальше, хозяин?&amp;quot; Так происходит даже если явно попросить действовать автономно, решать максимум вопросов по дороге и иногда делать коммиты.&lt;/p&gt;

&lt;p&gt;Я задумался: сейчас много пишут, что агентов надо запускать в цикле. Но как запустить цикл, если агент в случайный момент просто заканчивает работу?&lt;/p&gt;

&lt;p&gt;Оказалось, что в Codex есть режим &lt;code&gt;/goal&lt;/code&gt;. Передаёшь ему конечную цель, например «реализовать поддержку MAX по спекам и прогнать тесты». Дальше Codex хранит цель отдельно от очередного сообщения: после остановки проверяет, достигнута ли она, и запускает следующий заход, если нет. Агент должен либо показать, что работа действительно завершена, либо признать настоящий блокер.&lt;/p&gt;

&lt;p&gt;То есть автономность здесь создаёт не промт «РАБОТАЙ АВТОНОМНО», а рантайм, у которого есть понятие незавершённой цели. В этом режиме Codex несколько часов работал над задачами из спек и вот только что сообщил о финальном результате. Теперь пойду смотреть, чего он там назалупливал.&lt;/p&gt;

&lt;p&gt;Кстати, заодно решил посмотрел есть ли подобное в OpenCode. В нём такого режима из коробки нет, но есть плагины. &lt;a href=&quot;https://github.com/danshapiro/opencode-goal-plugin&quot;&gt;danshapiro/opencode-goal-plugin&lt;/a&gt; старается буквально воспроизвести поведение Codex: после остановки снова запускает агента и не ставит лимитов по числу заходов, времени или токенам. Полная остановка — только когда модель доказала завершение, сообщила о блокере или её остановил человек.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/prevalentWare/opencode-goal-plugin&quot;&gt;prevalentWare/opencode-goal-plugin&lt;/a&gt; делает похожую вещь, но с предохранителями: бюджетами, лимитом автоматических ходов, проверкой отсутствия прогресса, учётом дочерних задач и compaction. А &lt;a href=&quot;https://github.com/watzon/opencode-goal&quot;&gt;watzon/opencode-goal&lt;/a&gt; продолжает работу более консервативно: если в очередном ходе не было вызовов тулов, он не продолжает бесконечный разговор модели с собой.&lt;/p&gt;

&lt;p&gt;Получается, &lt;code&gt;danshapiro&lt;/code&gt; — для тех, кто хочет максимально буквальный &lt;code&gt;/goal&lt;/code&gt; из Codex. &lt;code&gt;prevalentWare&lt;/code&gt; — для тех, кто хочет оставить агента работать над большим проектом, но с ограничителями.&lt;/p&gt;

&lt;p&gt;Надо будет обязательно сделать визуализацию таких циклов в Codabrus: смотреть, как кодовый ассистент сам себя залупливает, гораздо веселее, чем просто читать чат.&lt;/p&gt;
</content></entry></feed>