Amiga
Оглавление курса · урок 6 из 24

Модуль 2 · Направляющие · урок 6 из 24

Читаемость для агента

Один и тот же агент в одном репозитории работает уверенно, а в соседнем блуждает, дублирует код и ломает соглашения. Разница чаще всего не в сложности задачи, а в том, насколько среда читаема для агента. Этим уроком открывается модуль о направляющих: прежде чем писать инструкции, стоит сделать так, чтобы большую часть ответов агент находил в самом коде.

Что значит «читаемость»

Термин agent legibility (в официальном русском переводе — «читаемость для агента») пришёл из статьи OpenAI «Harness engineering». У него две стороны:

  • Читаемость работающего приложения — агент сам видит UI, логи, метрики и может воспроизвести баг. Это тема урока о наблюдаемости.
  • Читаемость репозитория — агент находит знания, понимает структуру, умеет запустить и проверить код. Об этом урок.

Исходный тезис статьи: для агента не существует того, чего он не видит в репозитории. Обсуждение в чате, решение на созвоне, знание в голове ведущего разработчика — всего этого нет. Как превратить такие знания в версионируемые артефакты, разберём в уроке о системе записи. Здесь — свойства самого кода и проекта.

Скучные технологии

Команда OpenAI сознательно выбирала зависимости, которые можно целиком понять внутри репозитория. Их аргумент: «скучные» технологии агенту моделировать проще — они композиционны, у них стабильный API и они хорошо представлены в обучающих данных. Иногда команда шла дальше и переписывала нужное подмножество функциональности, чтобы не обходить неочевидное поведение библиотеки. Их пример — собственный хелпер параллельного выполнения вместо готового пакета, интегрированный с OpenTelemetry и покрытый тестами на 100%.

Наш вывод для агентства. Первая часть переносится напрямую: при выборе стека для нового проекта «насколько это знакомо модели» — законный критерий наряду с привычными. Вторая — осторожно. Переписывать библиотеку оправдано, когда нужна малая её часть, поведение неочевидно и агент регулярно на нём спотыкается. Для типового сайта на OctoberCMS или мобильного приложения на стандартном стеке это редкость.

Типы, границы, опинионированность

Биргитта Бёкелер в «Harness engineering for coding agent users» называет это свойство harnessability: не каждая кодовая база одинаково поддаётся обвязке. Помогают строгая типизация, явные границы модулей и опинионированные фреймворки. Она приводит термин своего коллеги Неда Летчера ambient affordances — структурные свойства самой среды, которые облегчают агенту работу.

Важное наблюдение оттуда же: в greenfield читаемость закладывается выбором технологий, а в легаси обвязка нужнее всего именно там, где её труднее всего построить.

Как это выглядит на нашем стеке:

Свойство PHP / OctoberCMS Мобильная разработка
Строгие типы declare(strict_types=1), типизированные свойства, PHPStan на высоком уровне Kotlin и Swift типизированы, не глушить предупреждения компилятора
Явные границы Плагин = модуль: модели, компоненты, сервисы в своих каталогах Модули или пакеты по фичам, без циклических зависимостей
Опинионированный каркас Структура плагина OctoberCMS задана фреймворком Единая архитектура экрана для всего приложения

Типы — это не только корректность, но и навигация: агент по сигнатуре понимает, что передать и что вернётся, не читая реализацию. Каждый mixed и каждый массив неизвестной формы — место, где агенту придётся гадать.

Единообразие важнее идеальности

Codex воспроизводит шаблоны, которые уже есть в репозитории, включая неудачные, — это отмечают и авторы статьи OpenAI. Если в проекте три способа делать HTTP-запросы к CRM, агент выберет случайный, причём не обязательно актуальный.

Практические следствия:

  • Один способ на задачу. Устаревший способ либо удаляется, либо явно помечается как устаревший, а линтер запрещает новые использования.
  • Эталонные файлы. Ссылка из AGENTS.md на образцовый компонент, контроллер, экран.
  • Найденное поиском. Говорящие имена, без магических строк и динамических вызовов по собранному из кусков имени: агент ищет код через rg, и то, что не находится поиском, для него почти невидимо.
  • Разумный размер файлов. Файл на 3 000 строк агент читает частями и теряет связи. У OpenAI лимиты размера файлов закреплены линтером.

Как превращать такие правила в механические проверки, разобрано в уроке об инвариантах, а как бороться с накоплением плохих шаблонов — в уроке об энтропии.

Запуск и проверка одной командой

В best practices Codex среди типичных ошибок прямо названа такая: агенту не сказали, как запускать сборку и тесты. Там же — мысль, что многие проблемы качества на деле оказываются проблемами настройки.

Минимальный набор для читаемого проекта:

text
make setup        # поднять окружение (Docker, зависимости, сиды)
make test         # юнит- и интеграционные тесты
make test-agent   # то же с коротким выводом для агента
make lint         # линтеры и статический анализ
make e2e          # Playwright против локального стенда

Конкретные имена неважны — важно, чтобы они были одинаковыми во всех проектах команды, работали без ручных шагов и были упомянуты в AGENTS.md. Если для запуска e2e нужно «попросить у Пети дамп базы», для агента e2e не существует.

Внешние зависимости

Знания о внешних библиотеках агент берёт из обучающих данных, а они могут устареть. Команда OpenAI держит в docs/references/ файлы вида *-llms.txt для ключевых внешних зависимостей. Для агентства кандидаты — API CRM клиента, внутренняя дизайн-система, особенности конкретной версии OctoberCMS. Короткий справочник в репозитории надёжнее, чем надежда, что модель помнит нужную версию.

Попробуйте сами

10–15 мин на рабочем месте
  1. Сделайте холодный старт. Новая сессия в корне репозитория, промпт:
text
Не меняя файлов, ответь только по содержимому репозитория:
1) как поднять проект локально; 2) как запустить тесты и линтер;
3) где эталонный пример компонента или экрана.
Для каждого ответа укажи файл-источник. Если ответа в репозитории нет — так и напиши.

Каждое «ответа нет» — пробел в читаемости.

  1. Найдите в проекте задачу, которая решается двумя-тремя разными способами (HTTP-клиент, работа с датами, валидация). Выберите канонический и запишите его в AGENTS.md ссылкой на эталон.
  2. Для одной внешней зависимости, на которой агент уже ошибался, создайте docs/references/<имя>-llms.txt на 30–80 строк: версия, ключевые вызовы, подводные камни.

Коротко

  • Чего агент не видит в репозитории, того для него нет.
  • Скучные, хорошо известные модели технологии — законный критерий выбора стека.
  • Типы, явные границы и опинионированный каркас повышают harnessability.
  • Агент копирует существующие шаблоны: держите один способ на задачу и эталонные файлы.
  • Запуск, тесты и линтер — одной командой, одинаково во всех проектах.
Отметка хранится только в вашем браузере
Хотите связаться с владельцем
компании напрямую?
Дмитрий Тарасов
Дмитрий Тарасов
СЕО

НАПИСАТЬ

Написать в MAX