JavaRush /Курси /Claude code /Context pollution і дії відновлення

Context pollution і дії відновлення

Claude code
Рівень 5 , Лекція 3
Відкрита

1. Проблема часто не в моделі, а в стані сесії

Сесія дивно себе поводить — перша думка: «Claude сьогодні гальмує». Даремно. Дивіться не на модель, а на робоче вікно, у якому вона міркує.

Context pollution — забруднення контексту: у вікні накопичилися сигнали, що заважають поточному завданню. Не «зламалося всередині Claude».

Іноді Claude помиляється, бо інформації мало. Іноді — бо її занадто багато: частина застаріла, суперечить завданню або тягне в перевірений глухий кут. Проблема не у відсутності контексту, а в його якості.

Помітно в довгих сесіях. Ви лагодите в Commerce OS баг авторизації: після неправильного пароля — порожній екран. Гіпотеза про SessionService, потім новий лог, потім LoginController, потім питання про SSO callback, потім «глянь, чому тести повільні». Через сорок хвилин Claude працює не із завданням, а з клубком напіврозібраних думок.

Не «Claude став гіршим», а «сесія втратила дисципліну». Назвали так — зʼявилося лікування.

2. Ознаки забрудненої сесії

Ухопити context pollution на початку дешевше, ніж рятувати сесію за годину.

Найчастіша ознака: Claude повертається до відкинутої гіпотези, ніби вона жива. Ви перевірили, що справа не в SessionService, — а він знову пропонує «про всяк випадок» поправити там обробку помилки. Друга: впевнений тон за поганої привʼязки до фактів — висновки розходяться з файлами, які він уже читав. Третя: ігнорує свіжі обмеження. Ви написали «не чіпай SSO і public API» — а diff змінює обробник авторизації поза scope.

Побутові маркери: діалог в’язкий; багато «вибач, ти маєш рацію, зараз виправлю» без поліпшення; diff зростає, хоча завдання не розширювалося; просочується «раз ми вже тут, давай ще…».

Видно на фрагменті робочого логу:

10:05 — гіпотеза: проблема в SessionService
10:14 — перевірили AuthFlowTest.failed_login → гіпотеза не підтверджена
10:22 — новий фокус: LoginController
10:29 — користувач додав: «до речі, ще перевір SSO callback»
10:36 — у сесію вставлено великий application.log цілком
10:44 — Claude знову пропонує правити SessionService
10:49 — Claude змінює LoginController, SessionService і SsoCallbackHandler одночасно

Формально все «логічно». Але після 10:29 сесія попливла: побічна тема залізла в головний потік, великий лог забив контекст, стара гіпотеза спливла. Pollution — серія дрібних зсувів, а не одна драматична помилка.

3. Забруднення проти нестачі контексту

Дії протилежні. Контексту мало — додати. Забруднений — скорочувати, чистити, перескладати. Переплутати — гасити пожежу бензином.

Коли даних мало, Claude чесний: ставить уточнювальне запитання, просить файл, stack trace або reproduction steps, позначає висновок як гіпотезу. Відповідь — додати файл, шматок логу, test output.

За забруднення навпаки: даних достатньо або навіть забагато, але частина з них погана. Claude не просить фактів — упевнено міркує на старому смітті. Не «я не знаю, покажи файл», а «знову правити те, що двадцять хвилин тому виключили».

Тримайте цю таблицю під рукою:

Ситуація Що ви бачите Що робити
Нестача контексту Claude ставить уточнювальні запитання, просить файл, лог або stack trace Додати точкове джерело: файл, фрагмент логу, тест, відтворення
Забруднення контексту Claude ігнорує свіжі обмеження, повертається до старих гіпотез, diff розповзається Чистити сесію: /compact, /clear, /rewind або fresh session
Зміна завдання У діалозі вже обговорюються два-три різні питання Не рятувати розмову, а розділити робочі потоки
Ризикований хаос У файлах уже є дивні зміни Спочатку зупинитися і прочитати diff, а не просити «виправ ще»

Робоче запитання: «Claude чогось не знає — чи знає занадто багато зайвого?» Чесна відповідь робить recovery action очевидною.

4. Карта відновлення: команди та fresh session

Чарівної кнопки немає. Є набір дій, кожна під свій тип проблеми. Назви слеш-команд і їхня поведінка змінюються від версії до версії: перевіряйте /help, але мисліть завданням, а не назвою.

Уся карта:

Recovery action Коли обирати Що це робить Головний ризик
/compact
Завдання те саме, але історія стала довгою Стискає розмову у зведення Втрачаються нюанси й деталі формулювань
/clear
У сесію заїхало інше завдання або розмова стала надто змішаною Починає нову розмову в тому самому середовищі Потрібно заново внести task spec і evidence
/rewind
Остання гілка міркувань явно повела не туди Відкочує сесію до більш ранньої точки Не всі побічні ефекти можна «магічно скасувати»
Fresh session Кілька failed attempts поспіль, суперечності, хаос Повний рестарт із чистим контекстом Якщо погано перескласти task spec, втратите важливі обмеження
Стоп і перевірка diff Уже є зміни у файлах, а логіка сесії викликає сумніви Ви нічого не продовжуєте, доки не прочитаєте зміни Здається повільним, але рятує від нашарування помилок

Таблиця каже, коли що обирати. Далі — нюанси, яких у ній немає.

/compact: не викидати розмову, а прибрати зайву вагу. Корисна інструкція до compaction — заздалегідь кажіть, що зберегти.

/compact Збережи: goal, scope, non-goals, поточну гіпотезу,
stack trace excerpt і список уже відкинутих причин.
Опусти: довгі проміжні міркування та старі чорновики.

/clear: не поразка, а «відрізав непотрібний хвіст». Дешевше відкрити чисту бесіду, ніж тягнути сміття.

/rewind працює на рівні сесії та гілки міркування. Якщо зміни зачепили файли — спочатку читайте diff і спирайтеся на Git. Історія проєкту живе не у слеш-команді.

Fresh session лякає: здається, «втратите все». Насправді ви втрачаєте сміття, якщо перед стартом збираєте короткий жорсткий пакет: мета, scope, non-goals, constraints, evidence.

І головна дія, про яку забувають: нічого не робити, доки не прочитаєте diff. Додавати промпти поверх хаосу погано — спочатку дивіться, що змінилося.

5. Сценарій із Commerce OS: рятуємо багфікс в auth

Давайте пройдемо типовий сценарій. Завдання знайоме: після неправильного пароля — порожній екран замість повідомлення.

Був хороший task spec: виправити порожній екран, працювати лише в src/auth/*, public API не змінювати, SSO не чіпати, перевірити AuthFlowTest. Claude висунув гіпотезу про SessionService. Кілька ходів, звірка з тестом — не підтверджується. Далі класика: побічне питання про SSO callback, занадто великий лог, і Claude знову лізе правити SessionService.

Доросла дія — не «ну гаразд, виправляй далі», а зупинитися, назвати діагноз і записати recovery-рішення.

# SESSION_LOG.md

Завдання: порожній екран після неправильного пароля в Commerce OS
Область змін: src/auth/*, AuthFlowTest
Ознаки pollution:
- 3 невдалі корекції поспіль
- повернення до відкинутої гіпотези про SessionService
- у розмову заїхав SSO callback поза scope
- diff зачепив зайві файли

Рішення: fresh session
Переносимо в новий контекст:
- мета
- поточна поведінка / очікувана поведінка
- фрагмент stack trace
- LoginController.java
- AuthFlowTest
- жорсткі обмеження

Відкриваєте fresh session і переносите не всю розмову, а лише суть.

Мета: виправити порожній екран після неправильного пароля.
Поточна поведінка: за неправильних credentials сторінка рендериться порожньою.
Очікувана поведінка: користувач бачить повідомлення про помилку, redirect не ламається.
Область змін: src/auth/LoginController.java і AuthFlowTest.
Нецілі: не чіпати SSO, не змінювати public API, не додавати залежності.
Докази: фрагмент stack trace + failing UI behavior.
Спочатку знайди root cause і запропонуй мінімальний fix без правок.

Старі гіпотези, особливо відкинуті, не тягнемо, якщо вони не потрібні як контрприклад. І раз міркування вже попливло, почніть нову сесію в обережному режимі дозволів: не давайте одразу правити код — нехай пояснить root cause і мінімальний шлях виправлення. Це рятує від другого кола хаосу.

Менш романтично, ніж «витягти сесію з болота». Зате працює.

6. Task spec як аварійний комплект

Чим краще оформлено task spec, тим простіше переживати pollution. Відновлювати завдання по памʼяті не можна: здається, що памʼятаєте все, але забудете один non-goal або розмиєте scope — і розмова знову поїде не туди. Task spec — аварійний комплект: переносите goal, current behavior, desired behavior, scope, constraints, критерії приймання і стартуєте знову.

Особливо після /compact (зведення згладжує нюанси — повторюєте критичні обмеження) і fresh session (task spec — основа першого повідомлення). Тут видно, чому формулювання з модулів 3 і 4 були важливими. Goal не дає розмові розповзтися. Scope відрізає зайві файли. Non-goals захищають від «раз ми вже тут, давай ще». Критерії приймання — від красивого, але неправильного виправлення.

Polluted session лікується не розумним промптом, а дисципліною. Task spec — зафіксована дисципліна, яку переносите із сесії в сесію.

7. Звичка зрілого процесу

Найкорисніше тут — не команда і не таблиця, а нова робоча реакція. Сесія тягне назад, розмиває scope, розмовляє сама з собою через старі гіпотези — ви не «переконуєте Claude зрозуміти вас краще», а спочатку діагностуєте її стан, потім обираєте дію.

Замість «ні, не це, давай ще раз» — спокійний цикл: помітили ознаки pollution, зупинилися, за потреби прочитали diff, обрали /compact, /clear, /rewind або fresh session, пересклали task spec, пішли далі.

З часом це стає автоматизмом — як звичка дивитися git status перед роботою. І тоді Claude Code відчувається не вередливою співбесідою, а передбачуваним інструментом.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ