1. Миф «Claude всё помнит» мешает работать
Самая дорогая ошибка — говорить с Claude как с коллегой, который вчера смотрел тот же файл и за ночь перечитал репозиторий. Claude не сидит ночью над вашим Commerce OS и не перечитывает src/auth/*. Он работает только с тем, что попало в окно текущей сессии.
Вы: Ты же уже смотрел LoginController.java, почему снова спрашиваешь?
Claude: В этой сессии файл ещё не открыт. Могу прочитать его сейчас.
Кажется, что он «тормозит». На деле он честно сообщает: файла в контексте нет.
Claude не «помнит проект». Claude работает с тем, что реально оказалось в текущем окне контекста.
Приняв это, вы перестаёте ждать человеческой памяти и даёте рабочие сигналы: какой баг, где проявляется, какие файлы важны, что уже проверено. Магия становится инженерией.
2. Контекст — это рабочее окно, а не память
Контекст — рабочее окно с ограниченным набором сигналов: не весь проект, не всё прошлое общение, только то, что сейчас лежит перед моделью. Не библиотека, а письменный стол: проект, логи, заметки, правила существуют, но помещается лишь часть. Остальное в задаче не участвует.
flowchart LR
A[Ваш текущий prompt] --> E[Текущее окно контекста]
B[Прочитанные файлы] --> E
C[Вывод команд и логи] --> E
D[CLAUDE.md, rules, memory] --> E
E --> F[Следующий ответ Claude]
Два следствия. Окно конечно — точные лимиты знать не нужно, важен принцип. И сигнал попадает в него не телепатией: прочитали файл — он в контексте; команда вывела ошибку — её вывод тоже сигнал; правило в CLAUDE.md подгружается как инструкция. Подразумеваете «это же понятно» — для модели это пустота.
Поэтому «Claude должен был догадаться» значит «я думал, сигнал в окне, а его там нет».
3. Под капотом: окно — это лента сообщений
Технически окно контекста — это лента сообщений. Каждый prompt, каждый ответ Claude, каждое чтение файла, каждый вывод команды, каждый результат инструмента — отдельное сообщение. Отвечая, Claude не «обновляет мнение о проекте» — он смотрит на всю ленту и дописывает в конец ровно одно сообщение. Прочитал LoginController.java — добавилось сообщение с файлом. Вернулся stack trace — ещё одно.
Отсюда конечность окна: лента растёт, каждое сообщение остаётся до конца сессии. Когда она упирается в потолок, что-то выбрасывается или пересобирается — об этом отдельный разговор про /context и compaction.
Формула: Claude не «помнит проект» — он смотрит на ленту и дописывает следующее сообщение. Слои, которые разберём дальше, — это разные виды её сообщений.
4. Слои, из которых складывается контекст
Когда Claude отвечает плохо, спрашивайте не «умный он сегодня», а «из каких источников собрался контекст»:
| Источник | Что это на практике | Что важно помнить |
|---|---|---|
| Текущий диалог | Ваши последние сообщения и ответы Claude | Самый заметный слой, но он не переносится в новую сессию автоматически |
| Прочитанные файлы | Код, конфиги, README, тесты, документы проекта | Файл не становится известным «сам по себе»: его нужно действительно прочитать |
| Вывод команд и логи | test, build, stack trace, console output, runtime logs | Очень полезный слой, но он легко засоряет контекст и может затащить туда секреты |
| CLAUDE.md, rules, memory | Стабильные проектные инструкции и заметки | Часто создают иллюзию, будто Claude «помнит проект» между сессиями |
| Выделение из IDE, скриншоты, фрагменты UI | Конкретный кусок кода или интерфейса, который вы показали | Это становится контекстом только если действительно передано в сессию |
| Служебные инструкции и слой инструментов | Product/system instructions, names of tools, иногда skill descriptions | Это фоновый слой, но он не заменяет ваши факты о проекте |
Слои грузятся по-разному. Диалог возникает сам, файлы — только если вы дали доступ, а CLAUDE.md и часть постоянных слоёв подгружаются заново сами. Отсюда иллюзия: «он и в новой сессии знает, что нельзя трогать migrations, значит, всё помнит». Нет — он снова получил стабильные инструкции, например такой фрагмент CLAUDE.md в Commerce OS:
# CLAUDE.md
Команда тестов: ./gradlew test
Не менять public API в src/auth/*
Не трогать migrations
Перед правками — перечисли затронутые файлы
Карточка скажет, как вести себя в проекте, но не какую гипотезу вы проверяли два часа назад и почему она оказалась ложной.
5. Новая сессия — не полная амнезия
Обратный миф: раз старая беседа не переносится, новая сессия — абсолютный ноль. Тоже нет. Это новый рабочий стол: постоянные бумаги положили заново, черновики убрали. Как новая смена в поддержке: сотрудник получил папку с постоянными правилами — какие команды запускать, какие директории не трогать, какие ограничения в проекте. Но вчерашний спор, виноват ли SessionService, в папку не попал — его нужно зафиксировать отдельно или заново принести в сессию.
Сессия — гибрид. Стабильные инструкции возвращаются; детали рассуждений, прочитанные файлы, отклонённые гипотезы, логи и ход вчерашнего расследования — нет. Не бойтесь новой сессии, но и не переоценивайте: полезное она не уничтожает, вчерашнюю мысль сама не продолжит.
На практике: вчера вы нашли подозрительное место в LoginController.java, отклонили идею про SessionService, увидели stack trace, решили писать минимальный фикс. Откроете сегодня сессию с «реализуй вчерашнее решение» — Claude знает правила проекта, но не само решение.
Поэтому task spec — не бюрократия, а способ восстановить детали. Записанные goal, scope, non-goals, constraints и фиксация принятых решений превращают сессию из «всё заново» в продолжение работы.
6. Откуда ощущение, что Claude «не знает очевидного»
Разложите его на типовые причины — почти всегда дело в одной из них.
Первая: сигнал вообще не попал в окно. Вы знаете, что баг вылезает после неверного пароля, но не дали ни reproduction steps, ни лог, ни файл.
Вторая: сигнал был, но перестал быть центром внимания. В длинной сессии деталь не исчезает — тонет среди старых сообщений и побочных обсуждений.
Третья: конфликт сигналов. В CLAUDE.md — «не менять public API», а в prompt вы расплывчато просите «переделай auth flow нормально». Старые сигналы не сняты, новые нечётки — Claude тянет ответ в несовместимые стороны.
Четвёртая, самая коварная: информация подана как настроение, а не как факт. «Кажется, дело где-то в backend, но я не уверен» — предчувствие. «Гипотеза: проблема может быть в backend; сначала проверь по коду и логам, не правь вслепую» — проверяемая задача.
Вопрос теперь не «почему он не догадался», а «какого сигнала нет или какой конфликтует».
7. Один баг в Commerce OS, две постановки задачи
Баг: после неверного пароля пользователь видит пустую страницу вместо сообщения об ошибке. Вчера вы покопали src/auth/*, сегодня продолжаете. Слабая постановка:
Почини баг с логином.
Ты же уже смотрел auth вчера.
Сделай нормально и без лишнего.
Для Claude почти бесполезно: нет наблюдаемого поведения, эффекта, области изменений, ограничений. «Ты же смотрел auth вчера» опирается на веру в память модели.
Вариант, использующий то, что вы умеете после модулей 3 и 4:
Цель: убрать пустую страницу после неверного пароля.
Наблюдаемое поведение: после неверных credentials UI рендерит пустой экран.
Область изменений: src/auth/LoginController.java, src/auth/SessionService.java, AuthFlowTest.
Не-цели: не менять public API, не трогать migrations, не добавлять зависимости.
Ограничение: сначала проверить, действительно ли проблема в backend, а не в рендеринге UI.
Вы заново кладёте на стол то, без чего модель не мыслит инженерно: наблюдаемое поведение, область поиска, жёсткие границы. Даже если вчера читали эти файлы, сегодня их стоит назвать снова — это не деградация, а цена за управляемость.
8. От спора с памятью — к управлению средой
Главный сдвиг — новый язык мышления. Странный ответ не объясняйте мистикой, задайте инженерные вопросы: видел ли он в этой сессии нужный файл; есть ли в окне stack trace; не конфликтует ли prompt с инструкциями проекта; не опираюсь ли я на вчерашний разговор, которого нет; подал ли я гипотезу как гипотезу, а не как ощущение?
Переведите эмоции на рабочий язык:
| Эмоциональная фраза | Инженерная формулировка |
|---|---|
| «Claude всё забыл» | «В новой сессии нет деталей предыдущего расследования» |
| «Он же это уже знал» | «Этот файл или лог не загружен в текущий контекст» |
| «Он упорно чинит не то» | «В окне осталась старая гипотеза или конфликтующие сигналы» |
| «Ну это же очевидно» | «Для меня это очевидно, но как сигнал в сессию это не попало» |
Приняв рабочую модель контекста, вы делаете сессию контейнером, которым управляете: не надеетесь, что Claude «сам всё удержит», а решаете, какие сигналы лежат перед ним сейчас. Тогда Claude Code становится не капризным собеседником, а предсказуемым инженерным инструментом.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ