Андрей Жаров, iOS-разработчик компании Doubletapp, опубликовал на Habr подробный разбор того, как управлять контекстным окном при ежедневной работе с локальными ИИ-агентами. Материал вырос из практики: автор заметил, что вежливые развёрнутые инструкции в духе «Please carefully analyze the project» работают хуже коротких телеграфных команд — и объяснил, почему это так устроено.

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

Тип done-критерияПримерОценка
Хорошийtest passesОбъективен, проверяем автоматически
Хорошийno errorsОбъективен, однозначен
Хорошийui matches designПроверяем визуально
Плохойсделай хорошоСубъективен, агент угадывает
Плохойчтобы не сломалосьРазмыт, нет критерия проверки
Плохойсам поймёшьПерекладывает понимание на агента

Почему краткость работает технически. Нейросеть читает токены последовательно, слева направо. Академическая работа Lost in the Middle зафиксировала эффект: модели хуже используют информацию, спрятанную в середине длинного контекста. Из этого следует практическое правило — важные данные кладут в начало, вопрос или задачу — в конец. Кроме того, развёрнутые вежливые конструкции («Please, say to me, is our code okay?») требуют дополнительного парсинга: модель должна отбросить воду и добраться до смысла. Короткий вариант («code is okay?») передаёт тот же смысл за меньшее число токенов.

Для структурирования команд Жаров предлагает минималистичный шаблон с полями Task, Done, Context, Rules и If stuck. Пример из статьи:

Task: fix empty password validation in AuthScreen Done: AuthViewModelTests pass + new empty password test Context: AuthScreen.swift, AuthViewModel.swift, AuthViewModelTests.swift Rules: don't change backend API, don't touch registration, minimal patch If stuck: ask with exact blocker

Формат не обязателен дословно — автор подчёркивает, что важна сама идея: команда пишется для машины, а не для коллеги. Русскоязычные инструкции работают по тем же правилам: «почини валидацию пустого пароля / готово = тест проходит / API не менять / если непонятно → спроси».

Отдельный блок посвящён done-критериям. Без чёткой проверки завершения агент сам решает, когда остановиться, — и нередко продолжает «улучшать» соседние части кода, которых никто не трогал. Хорошие критерии объективны и проверяемы: «test passes», «no errors», «ui matches design». Плохие — субъективны: «сделай хорошо», «чтобы не сломалось». Жаров формулирует это жёстко: не учите агента понимать задачу за вас, поймите её сами и опишите ему.

Тот же принцип применяется к стартовым координатам. Вместо «где-то в auth сломалась кнопка, посмотри проект» — конкретные файлы и гипотеза: «Bug: login button stays disabled / Start here: AuthScreen.swift, AuthViewModel.swift». Агент всё равно может расширить поиск, если стартовая гипотеза не подтвердилась, но не начинает с хаотичного обхода всего репозитория. Это сокращает объём чтения и уменьшает шум в контексте.

Подход Жарова вписывается в более широкую дискуссию об эффективности prompt engineering при работе с кодовыми агентами — такими как Cursor, Aider или локальные решения на базе open-source LLM. Разница между «умным промптом» и «инфраструктурой контекста» становится заметной именно в длинных сессиях: когда задача занимает не один запрос, а десятки итераций, накопленный шум в окне начинает деградировать качество ответов. Контекстная гигиена — это не разовый приём, а постоянная практика управления тем, что агент видит в каждый момент времени.