Асфальтируем козьи тропы, или UX для агентов 🐐🛣
Вдогонку к посту про Beads есть еще одна крутая мысль от Стива Йегге. Касается она того, как мы вообще проектируем инструменты для агентов.
В урбанистике есть такое понятие — Desire Paths («народные» или «козьи тропы»). Это когда архитекторы нарисовали красивые дорожки под прямым углом, а люди упорно ходят через газон, потому что так короче.
Есть два пути: ставить заборы с табличками «По газонам не ходить!» или плюнуть и положить плитку там, где люди протоптали тропы.
Так вот, в агентской разработке сейчас почти все строят заборы.
Как это обычно выглядит? Написали мы внутреннюю CLI-утилиту или MCP-сервер. Запускаем агента. Агент вместо правильной команды my-tool fetch-items --item-id 123 вызывает my-tool list 123. У него этих тулов вагон, поди все упомни)
Что делает разработчик? Идет в agents.md или в скилл и пишет капсом: «НИКОГДА не вызывай list, ВСЕГДА используй флаг --item-id, читай доку перед вызовом!».
В итоге:
— Промпт пухнет от инструкций и запретов, сжирая полезный контекст.
— На 15-м шаге длинной сессии модель все равно забывает ваши запреты и наступает на те же грабли, потому что в ее весах команда list встречается чаще.
— Агент ловит ошибку, читает --help, пробует заново, но мы знаем, за чей счет банкет. Счетчик токенов тикает, времени уходит больше.
Что сделал Йегге, когда пилил CLI для Beads? Выложил плиткой козьи тропы.
Он смотрел в логи: какие несуществующие команды и флаги агенты пытаются вызывать. И вместо того, чтобы учить модель «правильному» синтаксису, он тупо добавлял все эти команды как рабочие алиасы.
Хочет агент закрыть задачу через bd done или bd finish вместо bd close? Пожалуйста, теперь это работает. Путает позиционный аргумент с именным флагом? Парсер проглотит оба варианта и не подавится.
Это переворачивает сам подход к разработке тулзов для агентов:
⏺Хватит лечить кривой UX промптами. Если агент постоянно ошибается при вызове вашего скрипта или API, проблема не в тупой модели, а в том, что интерфейс идет против инстинктов LLM.
⏺Логи ошибок вызовов — лучшее ТЗ. Посмотрите, как модель пытается дернуть ваш инструмент «вслепую», без чтения хелпа. И сделайте так, чтобы этот вызов срабатывал.
⏺ Экономия контекста и итераций. Когда инструмент подстроен под рефлексы модели, ей не нужно держать в контексте мануал и тратить шаги на разбор ошибок парсинга аргументов. Она просто стреляет с бедра и попадает с первой попытки.
Кажется, рядом с привычным Developer Experience у нас прямо на глазах рождается Agent Experience. И главное правило в нем простое: не надо учить кремниевых ходить строем по вашим чертежам. Посмотрите, где они топчут газон, и положите там плитку.
@kot_review #агенты@kot_review