Суть за 30 секунд
Каждый раз, когда ты отправляешь сообщение, модель получает не только его. Она получает весь контекст заново: системный промпт, твои глобальные правила, все файлы, подключённые к автозагрузке, описания всех установленных скиллов, инструкции всех подключённых коннекторов — и всю историю диалога.
Назовём то, что грузится до первого твоего слова, стартовым весом сессии. Ключевое свойство: он платится не один раз за сессию, а каждый ход. Задал 40 вопросов подряд — заплатил за стартовый вес 40 раз.
Отсюда простое следствие: один лишний файл в автозагрузке дороже десяти чтений по запросу. Чтение по запросу случается один раз, когда реально нужно. Файл в автозагрузке едет с тобой всю сессию, в каждом ходу.
Сначала померь — не оптимизируй вслепую
Прежде чем что-то резать, получи цифры. Иначе вырежешь не то: сэкономишь пятьсот токенов на правилах и не заметишь тридцать тысяч в одном файле.
SessionStart: он выполняется при запуске и всё, что напечатает в консоль, уезжает в контекст сессии. Через него в агента вливают рабочее состояние: над чем работали вчера, какие проекты живы, где что лежит. Штука полезная — и ровно поэтому самый частый источник лишних десятков тысяч токенов: скрипт молча растёт, а платишь за него каждым ходом. Как их писать, какие бывают и что в них класть — отдельный гайд про хуки.# 1. Что автозагружается в каждую сессию
for f in ~/.claude/CLAUDE.md ~/.claude/settings.json; do
[ -f "$f" ] && printf "%8d байт %s\n" "$(wc -c < "$f")" "$f"
done
grep -o '@[^ ]*' ~/.claude/CLAUDE.md | tr -d '@' | while read p; do
p="${p/#\~/$HOME}"; [ -f "$p" ] && printf "%8d байт %s\n" "$(wc -c < "$p")" "$p"
done
# 2. Сколько выдаёт SessionStart-хук — частый источник мегабайтов
python3 -c "
import json,os,subprocess
s=json.load(open(os.path.expanduser('~/.claude/settings.json')))
for grp in s.get('hooks',{}).get('SessionStart',[]):
for h in grp.get('hooks',[]):
out=subprocess.run(h['command'],shell=True,capture_output=True).stdout
print(len(out),'байт ~',len(out)//3,'токенов <-',h['command'])
"
# 3. Вес описаний всех скиллов — грузится всегда
find ~/.claude/skills ~/.claude/plugins -name SKILL.md 2>/dev/null | while read f; do
awk '/^---$/{c++;next} c==1' "$f" | grep -E '^(name|description):' | wc -c
done | awk '{s+=$1} END {printf "скиллы: %d байт (~%d токенов)\n", s, s/3.5}'grep -E '^(model|model_reasoning_effort|model_context_window|project_doc_max_bytes)' ~/.codex/config.toml
find . ~/.codex -maxdepth 2 -name 'AGENTS.md' 2>/dev/null | while read f; do
printf "%8d байт %s\n" "$(wc -c < "$f")" "$f"
doneКак читать цифры. Примерно 3 байта на токен для русского текста, 4 — для английского и кода. Здоровый стартовый вес — до 15 000 токенов. Всё, что выше 30 000, требует разбора.
Пять правил, которые дают 90% экономии
1. В автозагрузке — только карты, а не данные
Главная и самая дорогая ошибка: сгружать в автостарт справочники «чтобы агент всё знал». Агенту не нужно знать всё. Ему нужно знать, где искать, и уметь туда сходить.
У меня стартовый хук грузил канбан проектов целиком — 97 КБ, то есть 32 500 токенов в каждой сессии. Я заменил его номенклатурной картой на 2 КБ: название проекта → одна строка сути → где лежат детали. Агент по-прежнему знает все проекты по именам, может сослаться на любой и сам открывает нужную карточку грепом, когда до неё доходит дело.
Критерий простой: файл в автозагрузке должен отвечать на вопрос «куда пойти?», а не «что там написано?». Если он длиннее сотни строк — это данные, а не карта.
2. Хук не должен срабатывать после сжатия контекста
Тонкая деталь, которая дорого стоит. Хук SessionStart в Claude Code без указанного matcher срабатывает на все события: запуск, продолжение, очистку — и автосжатие контекста.
Получается петля, которая разгоняет сама себя: контекст переполнился → произошло сжатие → хук снова влил свой мегабайт → ты быстрее приехал к следующему сжатию. Лечится одной строкой:
"hooks": {
"SessionStart": [
{
"matcher": "startup",
"hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/твой-хук.sh" }]
}
]
}3. Одна копия правды
Проверь, не приезжает ли одно и то же двумя путями. У меня фокус по проектам грузился трижды: через @-импорт в правилах, через хук и отдельным файлом состояния. Три версии, местами разошедшиеся между собой — то есть агент получал ещё и противоречивые данные, не только лишние.
Крайний случай, который я нашёл у себя: две разошедшиеся копии всего хранилища — одна в iCloud, вторая в Syncthing, и разные инструменты читали разные. Если у тебя заметки синкаются несколькими способами, сравни копии:
md5 -q /путь/копия1/файл.md /путь/копия2/файл.md4. Модель и effort — по классу задачи
Дефолт «самая умная модель плюс максимальное рассуждение» — самый дорогой способ переименовывать файлы. Разложи по классам.
| Класс задачи | Claude Code | Codex | Effort |
|---|---|---|---|
| Архитектура, планирование, стратегия, разбор проблем | Opus | Sol | xhigh |
| Работа с текстом, правки, понятные задачи | Sonnet | Terra | medium |
| Механика: коммиты, деплой, парсинг, переименования | Sonnet | Terra | medium |
| Массовая однотипная работа, где задача заведомо узкая | Sonnet | Luna | low |
Линейка Codex, если ты её не разбирал. Три модели одного поколения, разложены ровно по той же логике, что Opus и Sonnet:
gpt-5.6-sol— флагман: сложный код, computer use, ресёрч. Аналог Opus, берётся под тяжёлое.gpt-5.6-terra— сбалансированная, рабочая лошадка на каждый день при меньшей цене. Аналог Sonnet, это дефолт.gpt-5.6-luna— быстрая и самая дешёвая, под понятные повторяемые задачи. Ближе к Haiku; в Claude Code аналогом злоупотреблять не стоит, а вот у Codex это осмысленный нижний ярус для массовой однотипной работы.
Пол — Sonnet и medium. Ниже не спускайся: экономия там копеечная, а качество проваливается заметно. Дешёвый ответ, который надо переделывать, стоит дороже дорогого.
5. Одна сессия — одна задача
Самое скучное правило и самое денежное. Каждый ход пересылает весь тред целиком. Пятьдесят ходов при стартовом весе 15 тысяч — это 750 000 токенов только на преамбулу, и это ещё до самой переписки.
Задача закрыта — /clear. Подошёл к автосжатию (примерно 70% окна) — зафиксируй, где остановился, и начни заново: это дешевле, чем сжиматься, и точнее, потому что ты сам решаешь, что перенести.
Готовый блок правил — копировать целиком
Один и тот же блок работает в обоих инструментах: Claude читает CLAUDE.md, Codex — AGENTS.md, формат одинаковый.
## Выбор модели и уровня рассуждений
**Явное указание пользователя важнее всего.** Сказал «работай Опусом»,
переключил через `/model` или `/effort` — так и работаем, правила ниже молчат.
| Класс задачи | Модель | Effort |
|---|---|---|
| Рассуждение, планирование, архитектура, разбор проблем, стратегия | Opus | xhigh |
| Работа с текстом, правки, простые и понятные задачи | Sonnet | medium |
| Механика: коммиты, деплой, парсинг, переименования, форматирование | Sonnet | medium |
- **Пол — Sonnet + medium.** Ниже не опускаться никогда, даже на самой тупой
подзадаче: экономия копеечная, качество проваливается заметно.
- **Дефолт сессии — Sonnet + medium.** Opus поднимается руками под задачу.
- **Модель на ходу переключить нельзя.** Если задача явно из верхней строки,
а сессия идёт на Sonnet — сказать ОДНОЙ строкой в начале: «Это архитектурная
задача — имеет смысл `/model opus` + `/effort xhigh`. Продолжать на Sonnet?»
И работать дальше, не дожидаясь ответа. Один раз за задачу, не повторять.
- **Автоматический даунгрейд подзадач.** Когда модель не названа явно, подзадачи,
уходящие в субагентов, ставятся по таблице самостоятельно, без вопроса: поиск
по файлам, сбор фактуры, механические правки, прогон тестов → `model: sonnet`,
`effort: medium`. Наверх субагента поднимать только под настоящий разбор.## Экономия контекста
Стартовый вес сессии пересылается КАЖДЫЙ ход — один лишний файл в начале дороже
десяти чтений по запросу. Отсюда правила:
- **Не читать файл целиком, если нужен кусок.** Сначала `rg` с контекстом или
`Read` с `offset`/`limit`, и только потом весь файл. Для всего, что тяжелее
~20 КБ, — обязательно.
- **Не перечитывать то, что уже прочитано в этой сессии.**
- **Широкий поиск — субагентом.** Он перелопачивает десятки файлов у себя
в контексте и возвращает в главный тред только вывод. Тридцать чтений
«посмотреть, где это лежит» в главном треде — так делать не надо.
- **Не пересказывать в ответе то, что уже в контексте.** Не отчитываться списком
прочитанных файлов и не резюмировать проделанное, если не просили: это оседает
в истории навсегда и пересылается каждый ход.
- **Одна сессия = одна задача.** Задача закрыта — записать, где остановились,
и предложить `/clear`. Подошли к автосжатию (~70% окна) — то же самое:
зафиксировать и начать заново дешевле, чем сжиматься.
- **Автозагрузка — только карты.** Справочники и каталоги читаются по запросу.
Файл X (~N КБ) целиком НЕ читать никогда: номенклатура уже в карте,
детали доставать точечно `rg -A 12 'НАЗВАНИЕ' X`.## Выбор модели и уровня рассуждений
| Класс задачи | model_reasoning_effort |
|---|---|
| Рассуждение, планирование, архитектура, стратегия | high или xhigh |
| Работа с текстом, правки, понятные задачи | medium |
| Механика: коммиты, деплой, парсинг, переименования | low |
- Дефолт — `medium` (задаётся в `~/.codex/config.toml`).
- Effort переключается прямо в сессии: `/effort high`, либо `Alt+.` / `Alt+,`.
- Разовый запуск с другим уровнем: `codex -e high "задача"`.
- Ниже `low` не опускаться.Промпты — копировать и вставлять
Проведи аудит расхода токенов в моём сетапе. По шагам:
1. Померь стартовый вес сессии: размер глобального файла правил, всех
@-импортов внутри него, вывод всех SessionStart-хуков, суммарный вес
описаний скиллов. Дай таблицу в байтах и примерных токенах.
2. Найди в автозагрузке всё, что является ДАННЫМИ, а не картой: справочники,
канбаны, каталоги, логи, накопительные файлы. Для каждого — размер.
3. Найди дублирование: одна и та же информация, приезжающая двумя путями.
4. Проверь, ограничен ли SessionStart-хук matcher'ом "startup".
5. Посчитай, сколько токенов освободится по каждому пункту.
Не правь ничего — сначала покажи цифры и план.Файл [ПУТЬ] загружается в контекст каждой сессии и весит [N] КБ.
Преврати его в карту: название → одна строка сути → где лежат детали.
Требования:
- Не выдумывай факты: всё берётся из текущего содержимого файла.
- Ничего не теряй по номенклатуре — все сущности должны остаться
перечисленными по именам, чтобы я мог сослаться на любую.
- Детали не пересказывай, а заменяй указателем: путь к файлу или
готовая команда греп.
- Цель — уложиться в [N] строк.
- Полную версию не удаляй: она остаётся источником, просто перестаёт
грузиться автоматически.Заканчиваем. Перед завершением:
1. Запиши в [ФАЙЛ РЕЗЮМЕ] 3-6 строк: над чем работали, следующий шаг,
какие файлы тронуты. Старое из этого файла выкинь — там должны
оставаться только 1-2 последние сессии.
2. Если в этой сессии выяснилось что-то, что стоит помнить дальше, —
допиши это в правила одной строкой.
3. Скажи одной строкой, можно ли делать /clear.Прежде чем начинать: оцени задачу по трём осям и скажи одной строкой —
①нужен ли Opus или хватит Sonnet, ②какой effort, ③уложимся в одну сессию
или лучше разбить. Дальше работай, ответа не жди.Установка: Claude Code
- Правила
Открой
~/.claude/CLAUDE.md(создай, если нет) и вставь блоки 1 и 2 из раздела выше. Файл подхватывается автоматически в любой папке. - Дефолтная модель и effort
В
~/.claude/settings.json:"model": "sonnet"и"effortLevel": "medium". Значения effort:low,medium,high,xhigh,max. В сессии переключается через/model opusи/effort xhigh. - Ограничь хук стартом
Добавь
"matcher": "startup"— иначе хук перезаливает вывод после каждого автосжатия. - Ревизия хука Открой скрипт и вычеркни из списка загружаемых файлов всё, что является данными. Оставь карты. Запиши бюджет прямо в шапку скрипта, чтобы будущий ты его видел.
- Отключи то, чем не пользуешься
MCP-коннекторы:
claude mcp listпосмотреть,claude mcp remove ИМЯ -s userубрать. Коннекторы из claude.ai отключаются в настройках claude.ai, локально их не видно. Скиллы: их описания грузятся всегда — проверь, нет ли десяти скиллов про одно и то же. - Личное — вон из глобального автостарта Отдельно проверь, не грузится ли в глобальные правила файл с личным: финансы, семья, здоровье. Глобальный автостарт работает в любой папке и светится на записи экрана и на демонстрациях. Такие файлы читаются по запросу.
#!/usr/bin/env bash
# ⚠️ БЮДЖЕТ: суммарно ≤ 25 КБ (~8k токенов).
# Этот вывод пересылается КАЖДЫЙ ход каждой сессии — один лишний файл
# здесь дороже, чем десять чтений по запросу.
#
# Что НЕ грузим сюда осознанно:
# большой канбан/справочник — вместо него карта, детали грепом
# личное (финансы, семья) — хук работает в ЛЮБОЙ папке и светится на записи
set -euo pipefailУстановка: Codex
- Правила
Codex читает
AGENTS.mdиз корня проекта. Вставь туда блоки 2 и 3. Если правила общие для всех проектов — можно положить в~/.codex/AGENTS.md. - Не дублируй файл правил
Если ты уже ведёшь
CLAUDE.md— скажи Codex читать его вместо второго файла:project_doc_fallback_filenames = ["CLAUDE.md"]. Один файл правил вместо двух расходящихся. - Модель и effort
В
~/.codex/config.toml:model = "gpt-5.6-terra"иmodel_reasoning_effort = "medium". Уровни идут от low до max, есть ещё ultra под параллельных субагентов. ⚠️ Набор моделей и точные строки уровней меняются от версии к версии — сверься командой/modelпрямо в сессии, она покажет, что доступно именно тебе. - Жёсткий лимит на вес инструкций
Ключ, которого нет у Claude, и он очень полезен:
project_doc_max_bytes. Codex сам обрежет проектные доки по этому потолку. У меняAGENTS.mdразросся до 37 КБ — без лимита это просто уезжает в контекст каждой сессии. - Профили под режимы работы
Разные наборы настроек под разные типы задач, запуск через
codex --profile deep.
# дефолт — экономный
model_reasoning_effort = "medium"
# потолок на вес проектных инструкций (AGENTS.md и т.п.)
project_doc_max_bytes = 20000
# не заводить второй файл правил — читать существующий CLAUDE.md
project_doc_fallback_filenames = ["CLAUDE.md"]
# профили под режимы: codex --profile deep / --profile mech
[profiles.deep]
model_reasoning_effort = "xhigh"
[profiles.mech]
model_reasoning_effort = "low"/effort high в интерфейсе или сочетания Alt+. и Alt+,. Разовый запуск с другим уровнем — codex -e high "задача". Это делает низкий дефолт безболезненным: поднял, когда упёрся.Чек-лист — пройти один раз
- Померил стартовый вес сессии
- Из автозагрузки убраны данные, остались карты
- Самый тяжёлый файл автозагрузки заменён номенклатурной картой
- SessionStart-хук ограничен
matcher: "startup"(Claude) - Выставлен
project_doc_max_bytes(Codex) - Дефолтная модель — Sonnet, effort — medium
- Блок правил вставлен в CLAUDE.md / AGENTS.md
- Отключены неиспользуемые MCP-коннекторы
- Проверено дублирование: одна информация — один путь загрузки
- Личное убрано из глобального автостарта
- Померил стартовый вес заново, записал разницу
Что НЕ надо делать
Три ошибки, которые выглядят как экономия, но ей не являются.
Не режь контекст, который реально нужен. Экономия не в том, чтобы агент знал меньше, а в том, чтобы он не таскал справочник, когда хватает оглавления. Если после уборки агент начал переспрашивать очевидное — ты вырезал карту, а не данные. Верни.
Не спускайся ниже разумного минимума модели. Разница в цене между medium и low невелика, разница в качестве заметна. Дешёвый ответ, который надо переделывать, стоит дороже дорогого.
Не экономь на ресёрче под конкретный вопрос. Пять чтений, которые дали верный ответ, дешевле одного, давшего неверный, и последующей переделки. Резать надо чтения «на всякий случай», а не чтения по делу.
Что вышло у меня
| Источник | Было | Стало |
|---|---|---|
| SessionStart-хук | 39 500 | 7 400 |
| └ из них канбан проектов (97 КБ) | 32 500 | 0 |
| Файл правил + ядро | 8 900 | 7 800 |
| Стартовый вес сессии | 48 400 | 15 200 |
В 3,2 раза. Работы — минут сорок, эффект — на каждой сессии дальше.
Попутно нашлось отдельное: файл-кэш «где я остановился» разросся с обещанных в его же шапке «3–6 строк» до 22 КБ и девяти накопленных сессий. Любой авто-файл без явного лимита рано или поздно это делает. Ставь потолок и в самом файле, и в правилах — иначе он тихо превратится в ещё один справочник в автозагрузке.
Забрать правила файлом
Тот же материал в .md — можно целиком скормить агенту: «прочитай и примени к моему сетапу». Или взять блоками.
Читать дальше
Все гайды рабочие: каждый — то, что реально крутится у меня, а не пересказ документации.