Модуль 1 · Как устроен агент · урок 5 из 24
Компакция и длинные сессии
Любая серьёзная задача рано или поздно упирается в границу окна. Codex умеет сжимать историю сам, и делает это неплохо. Но для harness-инженера важен не сам факт сжатия, а его свойства: что сохраняется, что теряется, можно ли это проверить и как построить работу так, чтобы потеря деталей ничего не ломала.
Зачем вообще сжимать
Из урока об агентном цикле: каждый запрос несёт всю историю треда, а за один ход может пройти сотни вызовов инструментов. Без сжатия длинная задача либо упрётся в лимит окна, либо будет работать в зоне, где качество уже деградирует (context rot, урок о контекстной инженерии). Компакция — способ продолжить работу в том же треде, заменив историю её сжатым представлением.
Как компакция устроена в Codex
Майкл Болин в «Unrolling the Codex agent loop» описывает эволюцию:
- Раньше была только ручная команда
/compact: отдельный запрос с инструкцией «суммаризируй», и итоговое сообщение заменяло историю. - Теперь есть эндпоинт
/responses/compact. Он возвращает список элементов, среди которых элемент типаcompactionс непрозрачным зашифрованным содержимым. По словам Болина, оно сохраняет латентное понимание разговора моделью. Codex вызывает компакцию автоматически при превышении порога.
В статье OpenAI о компьютерной среде для Responses API (март 2026) добавлено: модели обучены сами выдавать элемент компакции, экономный по токенам. Её можно включить на сервере с порогом или вызывать отдельно. Авторы пишут, что Codex опирается на этот механизм в длинных задачах.
Ключевое свойство для нас: результат нативной компакции непрозрачен. Вы не можете прочитать, что именно сохранилось, и не можете его поправить.
Рычаги в конфигурации
Справочник конфигурации Codex описывает несколько ключей (имена проверяйте по актуальной документации — они меняются):
| Ключ | Что делает |
|---|---|
model_auto_compact_token_limit |
Порог токенов для автоматической компакции; если не задан — значение по умолчанию для модели |
model_auto_compact_token_limit_scope |
Считать порог по всему активному контексту (total, по умолчанию) или только по росту после перенесённого префикса (body_after_prefix) |
compact_prompt |
Переопределение промпта сжатия истории |
tool_output_token_limit |
Бюджет на хранение одного вывода инструмента в истории — косвенно отдаляет компакцию |
У сторонних провайдеров есть параметр возможностей remote_compaction: unsupported означает локальную компакцию через промпт, v2 — компакцию через Responses. То есть качество сжатия зависит и от того, через какого провайдера вы работаете.
Наш вывод. Порог по умолчанию трогать без измеримой причины не стоит. Понижать его имеет смысл, если вы видите деградацию задолго до автоматического сжатия. Повышать — почти никогда: вы просто дольше работаете в зоне худшего качества.
Компакция или сброс контекста
Anthropic в материале «Harness design for long-running application development» (март 2026) сравнивает компакцию на месте с полным сбросом контекста и структурированной передачей дел новой сессии. Для одной модели сброс был необходим: она проявляла «тревожность контекста» и сворачивала работу у границы окна. У следующей модели проблема почти исчезла, и надобность в сбросах уменьшилась.
Что из этого следует. Ответ на вопрос «сжимать или начинать заново» зависит от модели и меняется с каждым поколением. Но одна практика полезна при любом ответе: состояние работы живёт вне контекста — в плане исполнения, прогресс-файле, коммитах. Тогда компакция теряет только то, что легко восстановить, а новая сессия стартует с чтения файла, а не с пустоты. Форматы таких артефактов — в уроках о планах исполнения и о длинных задачах.
Хуки вокруг компакции
Раз результат сжатия непрозрачен, полезно детерминированно напоминать агенту, где лежит состояние. В Codex для этого есть:
PreCompactиPostCompact— срабатывают до и после сжатия, matcher проверяет триггер:manualилиauto. Если хук вернётcontinue: false, Codex остановится.SessionStartс источникомcompact— запускается после компакции перед следующим запросом к модели, в том числе если автоматическая компакция случилась посреди хода. Обычный текст из stdout такого хука добавляется как дополнительный developer-контекст.
{
"hooks": {
"SessionStart": [
{
"matcher": "compact|resume",
"hooks": [
{
"type": "command",
"command": "python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/reorient.py\"",
"statusMessage": "Напоминание об активном плане"
}
]
}
]
}
}#!/usr/bin/env python3
"""После компакции или возобновления напоминает агенту, где лежит состояние работы."""
import pathlib
import subprocess
root = pathlib.Path(
subprocess.check_output(["git", "rev-parse", "--show-toplevel"], text=True).strip()
)
plans = sorted((root / "docs" / "exec-plans" / "active").glob("*.md"))
if plans:
names = ", ".join(str(p.relative_to(root)) for p in plans)
print(
"Контекст был сжат или сессия возобновлена. Прежде чем продолжать, "
f"перечитай активные планы: {names} — разделы Progress и Decision Log. "
"Детали из памяти перепроверяй по файлам."
)
else:
print("Контекст был сжат. Перед продолжением проверь git status и git log -5.")Проектные хуки работают только в доверенном (trusted) проекте и запускаются после того, как вы просмотрите и одобрите их через /hooks.
Гигиена сессий
Лучшая компакция — та, которая не понадобилась. В best practices Codex есть прямое правило: один чат на одну связную единицу работы, а один чат на весь проект назван антипаттерном. Инструменты:
/new— новый чат для новой задачи;/fork— ответвиться, когда работа действительно разветвилась;/side— побочный вопрос, который не засоряет основной тред;/compact— сжать вручную в удобный момент, например после завершения этапа плана, а не посреди отладки;/recap— краткое изложение без сжатия.
Наше правило выбора:
| Ситуация | Что делать |
|---|---|
| Задача та же, этап завершён, детали отладки больше не нужны | /compact |
| Задача та же, но агент начал путаться и повторять ошибки | Обновить план, новый тред с чтения плана |
| Новая задача | /new |
| Хочется попробовать альтернативу, не теряя текущую линию | /fork |
Попробуйте сами
10–15 мин на рабочем месте- Поработайте над реальной задачей до ощутимого объёма истории, сделайте
/compactи попросите агента перечислить ограничения задачи и изменённые файлы. Сравните с тем, что было на самом деле. То, что потерялось, должно было жить в файле. - Добавьте хук из урока (адаптируйте путь к своим планам), одобрите его через
/hooksи проверьте, что после/compactагент первым делом читает план. - Пересмотрите свою последнюю неделю: сколько тредов вы держали на одну задачу и сколько задач в одном треде. Если больше одной задачи на тред — попробуйте неделю жить по правилу «чат на единицу работы».
Коротко
- Codex сжимает историю автоматически; нативная компакция возвращает непрозрачный зашифрованный элемент.
- Порог, область подсчёта и промпт сжатия настраиваются ключами config.toml.
- Компакция или сброс — зависит от модели; внешние артефакты состояния нужны в обоих случаях.
- Хук
SessionStartс источникомcompactдетерминированно возвращает агента к плану. - Один чат — одна связная единица работы.