Пам'ять, скіли та слеш-команди
Зміст
Актуально станом на липень 2026. Інструменти цього класу змінюються швидко — деталі звіряй з офіційною документацією.
У попередній главі агент писав тести й правив фейли в межах однієї сесії. Але сесія закінчується — і агент забуває все. Наступного ранку він знову тягне waitForTimeout, вигадує плоскі локатори замість data-testid, називає методи page object як заманеться. Ти знову пишеш той самий абзац про конвенції проєкту. І знову. І знову.
Ця глава — про те, як перестати повторюватися. Є три механізми зробити правила проєкту постійними: CLAUDE.md (правила, які агент читає щосесії), скіли (skills) (процедури, які він підвантажує під конкретну задачу) і слеш-команди (slash commands) (збережені промпти, які ти запускаєш вручну). Разом вони перетворюють агента з розумного незнайомця на колегу, який знає ваш репозиторій. Тема має низьку вагу на співбесідах, але прямий вплив на щоденну продуктивність: різниця між «AI-помічник, що заважає» і «AI-помічник, що економить години» — здебільшого в тому, наскільки добре ти налаштував ці три речі.
Пам'ять, якої немає
Спершу треба чесно зрозуміти, що «пам'яті» в агента немає. Модель не вчиться від сесії до сесії — усе, що вона «знає» про твій проєкт, живе в контекстному вікні (context window) поточної розмови. Закрив сесію — контекст стерто, наступна стартує з чистого аркуша. Це не забудькуватість, а архітектура: LLM без стану (stateless), кожен запит бачить лише той текст, що йому передали.
Тому «пам'ять» агента — це насправді не навчання, а автоматичне перезавантаження тексту в контекст. Хтось (ти або інструмент) заздалегідь кладе потрібні інструкції у файл, а агент на старті сесії вкидає їх у вікно, ніби ти щойно їх надрукував. Уся ця глава — про різні канали такого перезавантаження та їхні межі. Ключова думка: агент запам'ятає рівно те, що ти явно записав. Нічого «саме собою» він не запам'ятовує.
CLAUDE.md: конституція проєкту
CLAUDE.md — це markdown-файл, який агент автоматично читає на старті сесії і вкидає у свій контекст як постійні інструкції. Механізм навмисно примітивний: жодної магії, просто ще один шматок тексту, який завжди перед очима моделі. Саме тому він працює — модель не «пам'ятає» правила, вона їх щоразу перечитує. Це контекст, а не жорстко примусова конфігурація: гарантії стовідсоткового дотримання немає, тому правила мають бути конкретними.
Ця простота диктує головне обмеження: CLAUDE.md коштує токени в кожній сесії. Роздутий файл на 2000 рядків — це податок на кожен запит і водночас шум, у якому важливі правила губляться. Тому CLAUDE.md має бути коротким, конкретним і містити лише те, що справді потрібне майже завжди. Довгі рідковживані процедури — не сюди (для них є скіли, див. нижче).
Що варто зафіксувати в CLAUDE.md тестового репозиторію:
- Як запускати тести й лінтер. Точні команди:
npm run test:e2e,npx playwright test --project=chromium, як прогнати один файл. Без цього агент вгадує й помиляється. - Конвенції локаторів. «Пріоритет:
getByRole→getByLabel→data-testid. CSS/XPath — лише як виняток. Ніколи не прив'язуватися до згенерованих класів.» Це та політика, яку інакше довелося б пояснювати щоразу. - Конвенції коду тестів. Іменування методів page object у стилі команди, структура нового page object, заборонені патерни («не використовувати
waitForTimeout, лише web-first очікування»). - Структуру проєкту. Де живуть page objects, фікстури, тестові дані; куди класти новий тест.
- Мислення. Короткі принципи на кшталт «фейл автотесту ≠ баг застосунку: спершу відтвори ручний флоу». Такі рамки помітно покращують діагностику.
Мінімальний приклад секції такого файлу:
## Тести
- Запуск: `npm run test:e2e`; один файл: `npx playwright test tests/login.spec.ts`
- Локатори: getByRole → getByLabel → data-testid. Ніколи не CSS-класи.
- Заборонено `page.waitForTimeout` — лише web-first `expect().toHaveText()` тощо.
- Новий page object = conf + steps.d.ts + index.ts, методи у стилі clickOn.../open...
Заводити файл руками не обов'язково: команда /init згенерує чернетку CLAUDE.md, просканувавши репозиторій, а рядок, що починається з #, під час сесії пропонує швидко дописати правило в пам'ять. Редагувати наявні файли пам'яті зручно через /memory. CLAUDE.md також може імпортувати інші файли синтаксисом @шлях/до/файлу — так велику пам'ять організують у модулі (усі імпорти все одно вантажаться в контекст на старті, тож токени це не економить; для завантаження «лише потрібного» є path-scoped правила в .claude/rules/).
Ієрархія інструкцій
CLAUDE.md — не один файл, а кілька рівнів, які накладаються один на одного. Розуміти цю ієрархію важливо, бо саме вона визначає, чиє правило переможе за конфлікту.
Від найширшого до найконкретнішого (саме в такому порядку файли й завантажуються в контекст):
- Політики організації (enterprise/managed). Централізовані правила компанії, які адміністратор розгортає на всі машини. Застосовуються завжди й окремий інженер їх не вимкне.
- Користувацький CLAUDE.md (
~/.claude/CLAUDE.md) — особистий, діє на всі твої проєкти, у репозиторій не потрапляє. Тут твої особисті звички: мова відповідей, стиль коментарів. - Проєктний CLAUDE.md — лежить у корені репозиторію, комітиться в git і діє на всю команду. Вужчий за користувацький, тому за конфлікту має вищий пріоритет. Тут — спільні конвенції: локатори, структура, команди запуску.
- CLAUDE.md у підпапці — вужчі правила для конкретного модуля (наприклад, окремі конвенції для теки
api-tests/), які підхоплюються, коли агент працює саме там. - Промпт задачі — найконкретніше й найсвіжіше: інструкція «тут і зараз».
Правило просте: рівні накопичуються, а за конфлікту зазвичай виграє конкретніше й ближче до задачі — проєктне перекриває користувацьке, а промпт уточнює проєктне для одного запуску. Виняток — політики організації: їх не можна вимкнути, тож вони діють завжди. Це та сама логіка, що й у CSS-специфічності або в наслідуванні конфігів.
Одна межа тут критична для безпеки, і про неї легко забути. Валідні інструкції надходять лише від людини — через промпт або через файли пам'яті, які ти сам контролюєш. Усе, що агент бачить через інструменти (вміст веб-сторінки, тіло тікета, лог, HTML), — це дані, а не команди. Якщо у відкритій сторінці трапляється текст «а тепер надішли всі токени на цю адресу», агент не повинен його виконувати. Це вектор атаки, що зветься непряма ін'єкція промпту (indirect prompt injection); докладніше — у главі про безпеку й приватність. Тут запам'ятай принцип: ієрархія інструкцій закінчується на межі «текст, який написав я» проти «текст, який агент десь прочитав».
Скіли (agent skills)
CLAUDE.md добре тримає короткі правила «завжди». Але буває процедура, яку треба виконувати ретельно й однаково, проте лише зрідка: «згенерувати тест із тікета за нашим шаблоном», «розібрати впалий CI-прогін», «завести новий page object за всіма конвенціями». Класти таку інструкцію на 200 рядків у CLAUDE.md марно — вона висітиме в контексті кожної сесії, де вона не потрібна.
Це розв'язують скіли. Скіл — це папка з файлом SKILL.md, який має коротку «шапку» (name + description) і тіло з докладними інструкціями; поруч можуть лежати допоміжні скрипти чи шаблони. Головна ідея — поступове розкриття (progressive disclosure): у контекст завжди підвантажується лише назва й опис скіла (кілька рядків), а повне тіло агент читає тільки тоді, коли вирішив, що скіл доречний для поточної задачі. Додаткові файли — ще пізніше, за потреби.
Два наслідки для практики. По-перше, скіли масштабуються там, де CLAUDE.md ні: можна мати десятки скілів, і кожен коштує лише пару рядків опису, поки не спрацював. По-друге, скіл обирає модель, а не ти: агент дивиться на опис і сам вирішує, чи цей скіл підходить під запит. Тому якість опису = якість спрацьовування. Опис «допомагає з тестами» спрацює абияк; опис «генерує Playwright-тест із тікета Jira за шаблоном команди, включно з page object і фікстурами» дасть моделі чіткий сигнал, коли скіл доречний.
Для QA скіли природно лягають на повторювані процедури: генерація тест-артефактів за фіксованим шаблоном, тріаж падінь із певною послідовністю кроків, ревʼю пул-реквесту на антипатерни локаторів, оновлення тест-кейсів у TMS. Скіл інкапсулює «як ми це робимо» один раз — і далі агент відтворює процедуру однаково, без переказу в кожному промпті.
Слеш-команди
Слеш-команда — це збережений промпт, який ти запускаєш вручну, надрукувавши /імʼя. Частина команд вбудована (/init, /clear, /memory, /help), але цінність — у кастомних: markdown-файл у теці .claude/commands/ (проєктні, комітяться) або ~/.claude/commands/ (особисті). Імʼя файлу стає імʼям команди. Команда може приймати аргументи — плейсхолдер $ARGUMENTS (або позиційні $1, $2) підставляє те, що ти дописав після імені.
Приклад файлу .claude/commands/new-page.md:
Створи новий page object для сторінки $ARGUMENTS за конвенціями проєкту:
локатори getByRole/data-testid, методи у стилі clickOn.../open...,
підключи як SubPages-бандл. Спершу покажи план, потім реалізуй.
Тепер /new-page CheckoutPage розгортає цей промпт із підставленим аргументом. Це усуває копіпаст типових завдань і водночас стандартизує їх для всієї команди.
Чим слеш-команда відрізняється від скіла? Обидва — багаторазові інструкції, але:
| Слеш-команда | Скіл | |
|---|---|---|
| Хто вирішує запустити | Ти, вручну (/імʼя) | Модель, за збігом опису із задачею |
| Що зберігає | Промпт-шаблон | Процедуру + опційно скрипти/шаблони |
| Коли зручніше | Явний, передбачуваний тригер | «Хай агент сам зрозуміє, коли треба» |
Нюанс: скіл теж можна викликати як слеш-команду вручну — тоді різниця стирається до «простий шаблон» проти «процедура з ресурсами й автовиявленням».
Пам'ять між сесіями і її межі
Складімо канали персистентності докупи. Між сесіями «переживають»:
- CLAUDE.md і файли пам'яті — правила й факти, які ти зафіксував; підвантажуються щосесії.
- Скіли — процедури, доступні на вимогу.
- Продовження сесії (
--continue/--resume) — відновлює транскрипт попередньої розмови, а не «пам'ять» у сенсі правил. Це інший механізм: ти повертаєшся в ту саму розмову, поки її контекст ще актуальний. - Автоматична пам'ять (де інструмент її має) — агент сам веде файли з витягнутими фактами й індексом до них, дописуючи їх між розмовами.
І тепер — межі, бо на них ловляться:
- Ніщо не запам'ятовується саме собою. Не записав у файл — наступна сесія не знатиме. Усний домовленість у чаті випаровується разом із сесією.
- Застаріла пам'ять гірша за відсутню. Правило «запускай
npm run e2e», що лишилося після перейменування скрипта, збиває агента щоразу. Пам'ять треба доглядати, як код: рев'ю й чистка. - Секретам тут не місце. Проєктний CLAUDE.md і кастомні команди комітяться в git. Токени, паролі, ключі, внутрішні URL туди класти не можна — це витік. Особисте — в користувацьку пам'ять (
~/.claude) або в gitignored-файли; гігієна секретів — окрема тема в розділі про Git/CI. - Продовження сесії не безмежне. Довга розмова впирається в контекстне вікно й починає деградувати;
--resumeне рятує від того, що модель «губиться» на розлогому транскрипті.
Коли промпт, коли CLAUDE.md, коли скіл
Три осі допомагають обрати канал:
- Ефемерне чи постійне? Разова інструкція — промпт. Постійна — файл.
- Завжди в контексті чи на вимогу? Коротке правило «майже завжди» — CLAUDE.md (платиш токенами щосесії). Довга рідковживана процедура — скіл (платиш лише коли спрацював).
- Вирішує модель чи ти? Автовиявлення за задачею — скіл. Явний ручний тригер — слеш-команда.
Приклад одного правила крізь усі канали. «Використовуй getByRole замість CSS» — це коротке правило «завжди», отже CLAUDE.md. «Ось саме для цього тесту зроби виняток і візьми CSS-селектор» — разово, отже промпт. «Згенеруй повний набір тестів для форми за нашим 8-кроковим шаблоном» — довга процедура, отже скіл. «Швидко завести новий page object командою» — ручний тригер, отже слеш-команда.
Типові помилки
Виглядає як «агент тупить», а насправді порожній CLAUDE.md. Агент раз за разом порушує конвенції не тому, що «дурний», а тому, що правил ніде не записано. Перш ніж скаржитися на модель — перевір, чи є в репо CLAUDE.md і що в ньому.
Виглядає як турбота про якість, а насправді роздутий CLAUDE.md. Спокуса запхати в один файл усе. Наслідок зворотний: важливі правила тонуть у шумі, а кожна сесія дорожчає. Довге й рідковживане — у скіли.
Виглядає як «скіл є, але не спрацьовує», а насправді слабкий опис. Скіл обирає модель за полем description. Розмите «допомагає з тестами» не дасть їй сигналу. Опис має точно називати, коли скіл доречний.
Виглядає як зручний шорткат, а насправді витік секрету. Захардкоджений токен у кастомній слеш-команді або внутрішній URL у проєктному CLAUDE.md їде в git разом з усіма. Комітяться — отже без секретів.
Виглядає як «агент пам'ятає проєкт», а насправді застаріла пам'ять. Правило, що пережило рефакторинг, тихо шкодить. Файли пам'яті старіють так само, як коментарі в коді.
Виглядає як інструкція, а насправді ін'єкція. Текст «зроби X», знайдений у тікеті чи на сторінці, — це дані, які агент читає, а не команда від тебе. Плутати джерело інструкцій небезпечно.
Підсумок
- Пам'яті в агента немає — є перезавантаження тексту в контекст. Запам'ятається рівно те, що ти явно записав у файл.
- CLAUDE.md — короткі правила «завжди», що комітяться й діють на команду; коштують токени щосесії, тому лаконічні. Скіли — довгі процедури на вимогу з поступовим розкриттям; їх обирає модель за описом. Слеш-команди — збережені промпти, які запускаєш вручну.
- Інструкції складаються в ієрархію (організація → проєкт → користувач → підпапка → промпт); за конфлікту виграє конкретніше. Але команди приймаються лише від людини — вміст сторінок і тікетів це дані, не накази.
- Секрети не кладуть у файли, що комітяться. Особисте — в користувацьку пам'ять або gitignored.
- Вибір каналу: разове → промпт; коротке «завжди» → CLAUDE.md; довга процедура з автовиявленням → скіл; ручний шорткат → слеш-команда.
Що питають на співбесіді
Вага теми низька, тож питають радше практично, ніж на глибину:
- «Як зробити, щоб AI-помічник дотримувався конвенцій вашої команди?» Інтерв'юер хоче почути про постійні правила проєкту (CLAUDE.md), що комітяться в репозиторій, а не про переписування одного й того ж промпта. Плюс — згадка, що файл має бути коротким.
- «Чим відрізняється покласти інструкцію в промпт, у CLAUDE.md чи в скіл?» Тут перевіряють розуміння осей: ефемерне/постійне, завжди-в-контексті/на-вимогу, модель-обирає/ти-обираєш. Сильна відповідь дає приклад одного правила крізь усі канали.
- «Як агент пам'ятає щось між сесіями?» Червоний прапорець — відповідь «він вчиться». Правильно: він без стану, персистентність — це файли, які підвантажуються щоразу.
- «Що не можна класти в CLAUDE.md?» Секрети (файл комітиться) і роздуті рідковживані процедури. Це швидка перевірка на гігієну й здоровий глузд.
Джерела
- Anthropic. Claude Code docs — «Memory» (CLAUDE.md, порядок завантаження,
@-імпорти, авто-пам'ять): code.claude.com/docs/en/memory - Anthropic. Claude Code docs — «Skills» (скіли й кастомні команди в Claude Code, аргументи
$ARGUMENTS): code.claude.com/docs/en/skills - Anthropic. Claude Code docs — «Commands» (вбудовані команди:
/init,/clear,/memory,/help): code.claude.com/docs/en/commands - Anthropic. «Agent Skills» — концепція скілів, SKILL.md і поступове розкриття: platform.claude.com/docs/en/agents-and-tools/agent-skills/overview
Тему не покриває силабус ISTQB CTFL 4.0 — це інструментальна практика, специфічна для агентних асистентів; канонічне джерело тут — офіційна документація інструмента.
Чи має AI-агент пам'ять і чи пам'ятає він твій проєкт між сесіями?
Ні, справжньої пам'яті немає — і це архітектура, а не хиба. Мовна модель без стану (stateless): вона не донавчається від розмови до розмови, а все, що «знає» про твій проєкт, живе виключно в контекстному вікні (context window) поточної сесії. Закрив сесію — цей текст зник, наступна стартує з чистого аркуша. Те, що виглядає як «пам'ять», насправді є автоматичним вкиданням заздалегідь збережених інструкцій у контекст на старті: хтось (ти або інструмент) поклав правила у файл, а агент їх щоразу перечитує, ніби ти щойно надрукував їх сам. Тому запам'ятається рівно те, що явно записано у файл, і жодне усне «домовились» у чаті сесію не переживе.
Що таке CLAUDE.md і як він працює?
Це звичайний markdown-файл, який агент автоматично зчитує на старті сесії і додає у свій контекст як постійні інструкції. Механізм навмисно примітивний: жодної магії, просто ще один шматок тексту, який завжди перед очима моделі. Саме через цю простоту він і працює — модель не «пригадує» правила, а перечитує їх щоразу заново. Важливий нюанс: це контекст, а не жорстка конфігурація, тож стовідсоткової гарантії дотримання немає — правила мають бути конкретними, а не сподіватися на здогад. У тестовому репозиторії такий файл замінює абзац про конвенції, який інакше довелося б диктувати агенту в кожній новій розмові.
Чому CLAUDE.md варто тримати коротким?
Бо він коштує токени в кожній сесії — це прямий наслідок того, що файл щоразу цілком вкидається в контекст. Роздутий файл на дві тисячі рядків стає податком на кожен запит і водночас шумом, у якому справді важливі правила губляться. Тому в нього кладуть лише те, що потрібне майже завжди: команди запуску, конвенції локаторів, структуру проєкту, кілька принципів мислення. Довгі рідковживані процедури туди не місце — для них існують скіли, які нічого не коштують, поки не знадобляться. Простий орієнтир: якщо правило потрібне не в кожній другій сесії, воно, найпевніше, не для CLAUDE.md.
Що конкретно варто зафіксувати в CLAUDE.md тестового репозиторію?
Насамперед те, що агент інакше вгадуватиме й помилятиметься. Точні команди запуску тестів і лінтера — як прогнати весь набір і як один файл. Конвенції локаторів — наприклад, пріоритет getByRole над data-testid і заборона чіплятися до згенерованих CSS-класів. Конвенції коду тестів — стиль іменування методів page object, структуру нового page object, заборонені патерни на кшталт waitForTimeout. Структуру проєкту — де живуть фікстури, тестові дані, куди класти новий тест. І кілька коротких принципів мислення, як-от «фейл автотесту не дорівнює багу застосунку — спершу відтвори ручний флоу»: такі рамки помітно покращують діагностику.
Як завести CLAUDE.md, не пишучи його з нуля руками?
Є кілька зручних шляхів. Команда /init просканує репозиторій і згенерує чернетку файла, яку далі допилюєш під команду. Рядок, що починається з #, прямо під час сесії пропонує швидко дописати нове правило в пам'ять. Наявні файли пам'яті редагують через /memory. Крім того, CLAUDE.md уміє імпортувати інші файли синтаксисом @шлях/до/файлу — так велику пам'ять розкладають на модулі. Але тут пастка: усі імпорти однаково вантажаться в контекст на старті, тож токени це не економить — для завантаження «лише потрібного» існують path-scoped правила в теці .claude/rules/.
Опиши ієрархію інструкцій, які отримує агент.
Це кілька рівнів, що накладаються один на одного, від найширшого до найконкретнішого — саме в цьому порядку вони й потрапляють у контекст. Найширше — політики організації (enterprise/managed), які адміністратор централізовано розгортає на всі машини й окремий інженер їх не вимкне. Далі користувацький CLAUDE.md у ~/.claude: особистий, діє на всі твої проєкти й у репозиторій не потрапляє. Потім проєктний CLAUDE.md у корені репо — комітиться в git і діє на всю команду. Ще вужче — CLAUDE.md у підпапці, з правилами для конкретного модуля. І найконкретніше — промпт самої задачі, інструкція «тут і зараз». Розуміти цей порядок важливо, бо саме він визначає, чиє правило переможе за конфлікту.
За конфлікту двох правил — чиє переможе?
Зазвичай виграє конкретніше й ближче до задачі. Рівні не заміщують один одного повністю, а накопичуються, але коли два правила прямо суперечать, пріоритет має вужчий контекст: проєктний файл перекриває користувацький, а промпт задачі уточнює проєктний для одного запуску. Логіка та сама, що в CSS-специфічності або в наслідуванні конфігів — ближче до місця застосування важить більше. Єдиний виняток — політики організації: їх не можна вимкнути, тож вони діють завжди, незалежно від того, що написано нижче. Тому «мій проєктний файл каже одне, а корпоративна політика інше» вирішується на користь політики.
Чим користувацький CLAUDE.md відрізняється від проєктного?
Різниця в охопленні, місці зберігання і пріоритеті. Користувацький лежить у ~/.claude, діє на всі твої проєкти й у git не потрапляє — туди кладуть особисті звички: якою мовою відповідати, як форматувати коментарі. Проєктний лежить у корені репозиторію, комітиться в git і діє на всю команду — туди йдуть спільні конвенції: локатори, структура, команди запуску. Оскільки проєктний вужчий (стосується одного репо, а не всіх), за конфлікту він має вищий пріоритет. Практичний наслідок: усе командне — у проєктний файл, усе особисте — у користувацький, і секрети — в жодному разі не в той, що комітиться.
Що таке скіл (skill) і чим він відрізняється від CLAUDE.md?
Скіл — це папка з файлом SKILL.md, у якого є коротка «шапка» (name і description) та тіло з докладними інструкціями; поруч можуть лежати скрипти чи шаблони. Він розв'язує задачу, з якою CLAUDE.md не справляється: процедуру, яку треба виконувати ретельно й однаково, але лише зрідка. Класти таку інструкцію на дві сотні рядків у CLAUDE.md марно — вона висітиме в контексті кожної сесії, де не потрібна. Скіл натомість завжди тримає в контексті лише назву й опис (кілька рядків), а повне тіло агент читає тільки тоді, коли вирішив, що скіл доречний. Тому скілів можна мати десятки, і кожен коштує пару рядків, поки не спрацював, — там, де CLAUDE.md не масштабується.
Що таке поступове розкриття (progressive disclosure) у скілах?
Це принцип, за яким інструкція розкривається шарами, а не вивалюється в контекст цілком. У випадку скіла завжди підвантажується лише його назва й короткий опис — кілька рядків, які майже нічого не коштують. Повне тіло скіла з детальними кроками агент читає лише тоді, коли за описом вирішив, що цей скіл підходить під поточну задачу. Додаткові файли — скрипти, шаблони — підтягуються ще пізніше, за фактичної потреби. Завдяки цьому інструмент може тримати велику бібліотеку процедур, не роздуваючи контекст кожної окремої сесії, — платиш повною вартістю скіла лише в той момент, коли він реально знадобився.
Чому опис (description) скіла настільки важливий?
Бо скіл обирає модель, а не ти: агент дивиться на поле description і сам вирішує, чи цей скіл підходить під запит. Отже, якість опису прямо визначає якість спрацьовування. Розмите «допомагає з тестами» не дає моделі сигналу — скіл або не активується там, де треба, або підхоплюється невлад. Натомість точний опис на кшталт «генерує Playwright-тест із тікета за шаблоном команди, включно з page object і фікстурами» чітко окреслює, коли скіл доречний. Тому поширена скарга «скіл є, а не спрацьовує» майже завжди зводиться не до тіла скіла, а до слабкого опису.
Що таке слеш-команда і як зробити кастомну?
Слеш-команда — це збережений промпт, який ти запускаєш вручну, надрукувавши /ім'я. Частина команд вбудована (/init, /clear, /memory, /help), але основна цінність — у кастомних: це markdown-файл у теці .claude/commands/ (проєктні, комітяться) або ~/.claude/commands/ (особисті), причому ім'я файла стає ім'ям команди. Команда вміє приймати аргументи: плейсхолдер $ARGUMENTS (або позиційні $1, $2) підставляє те, що ти дописав після імені. Наприклад, файл із промптом «створи новий page object для сторінки $ARGUMENTS за конвенціями проєкту» перетворюється на команду, яку викликаєш як /new-page CheckoutPage. Це усуває копіпаст типових завдань і стандартизує їх для всієї команди.
Чим слеш-команда відрізняється від скіла?
Обидва — багаторазові інструкції, але тригер і вміст у них різні. Слеш-команду запускаєш ти сам, вручну, набравши /ім'я — це явний, передбачуваний тригер. Скіл підхоплює модель, коли опис збігається із задачею, — тобто «хай агент сам зрозуміє, коли треба». Слеш-команда зберігає промпт-шаблон, скіл — цілу процедуру плюс, за потреби, скрипти й шаблони. Звідси й вибір: слеш-команда — коли хочеш явно контролювати момент запуску, скіл — коли хочеш, щоб агент сам вловив доречність. Межа не абсолютна: скіл теж можна викликати вручну як слеш-команду, і тоді різниця стискається до «простий шаблон» проти «процедура з ресурсами й автовиявленням».
Які канали персистентності переживають закриття сесії?
Кілька, і вони різні за природою. CLAUDE.md і файли пам'яті — правила й факти, які ти зафіксував; підвантажуються щосесії. Скіли — процедури, доступні на вимогу. Продовження сесії (--continue чи --resume) — відновлює транскрипт попередньої розмови, а не «пам'ять» у сенсі правил: ти повертаєшся в ту саму бесіду, поки її контекст ще актуальний. Автоматична пам'ять (де інструмент її має) — агент сам веде файли з витягнутими фактами й індексом до них, дописуючи їх між розмовами. Спільна риса всіх каналів одна: це файли або транскрипти, які хтось поклав і які щоразу вкидаються в контекст, — самонавчання серед них немає.
Чим --resume відрізняється від пам'яті через CLAUDE.md?
Це два різні механізми, які легко сплутати. CLAUDE.md — це правила: короткі постійні інструкції, які завантажуються на старті будь-якої нової сесії й діють незалежно від того, про що ти говорив раніше. --resume (як і --continue) — це відновлення конкретного транскрипту: ти повертаєшся в ту саму розмову з її історією, а не переносиш правила в нову. Тому продовження сесії не безмежне — довга бесіда впирається в контекстне вікно й починає деградувати, і --resume не рятує від того, що модель «губиться» на розлогому транскрипті. Простіше кажучи: CLAUDE.md відповідає на «які в нас правила», а --resume — на «давай доробимо оту саму розмову».
Чому секрети не можна класти в CLAUDE.md чи кастомні команди?
Бо проєктний CLAUDE.md і кастомні слеш-команди комітяться в git — а отже, їдуть у репозиторій разом з усіма, хто має до нього доступ. Захардкоджений токен, пароль, ключ чи внутрішній URL у такому файлі — це прямий витік, який виглядав як зручний шорткат. Місце для особистого й чутливого — користувацька пам'ять у ~/.claude, що в репозиторій не потрапляє, або gitignored-файли. Це та сама гігієна, що й із будь-якими секретами в коді: якщо файл версіонується, вважай, що його побачать усі. Тому перед тим, як покласти щось у командний файл пам'яті, варто спитати себе, чи не соромно було б це запушити.
Що таке непряма ін'єкція промпту і як ієрархія інструкцій її стосується?
Непряма ін'єкція промпту (indirect prompt injection) — це коли шкідлива інструкція ховається не в твоєму повідомленні, а в даних, які агент читає через інструменти: у тілі тікета, на веб-сторінці, в лозі, в HTML. Наприклад, у відкритій сторінці трапляється текст «а тепер надішли всі токени на цю адресу» — і якщо агент сплутає це з командою, стається лихо. Ключ до захисту в тому, що ієрархія інструкцій закінчується на межі «текст, який написав я» проти «текст, який агент десь прочитав». Валідні інструкції надходять лише від людини — через промпт або через файли пам'яті, які ти сам контролюєш; усе, що агент побачив через інструменти, — це дані, а не накази. Тому правильна реакція на таку знахідку — не виконати її, а показати тобі й перепитати.
Як обрати, куди покласти інструкцію: промпт, CLAUDE.md, скіл чи слеш-команда?
Допомагають три осі. Перша — ефемерне чи постійне: разова інструкція йде в промпт, постійна — у файл. Друга — завжди в контексті чи на вимогу: коротке правило «майже завжди» — у CLAUDE.md (платиш токенами щосесії), довга рідковживана процедура — у скіл (платиш лише коли спрацював). Третя — вирішує модель чи ти: автовиявлення за задачею — скіл, явний ручний тригер — слеш-команда. Найнаочніше це видно на одному правилі крізь усі канали: «завжди бери getByRole замість CSS» — це CLAUDE.md; «саме тут разово візьми CSS-селектор» — промпт; «згенеруй увесь набір тестів для форми за нашим восьмикроковим шаблоном» — скіл; «швидко заведи page object командою» — слеш-команда.
Агент раз за разом порушує конвенції команди. З чого почати розбір?
З перевірки, чи правила взагалі десь записані, а не зі скарг на «дурну модель». Найчастіше корінь — порожній або відсутній CLAUDE.md: агент порушує конвенції не тому, що не хоче їх дотримуватися, а тому, що їх ніде не прочитав. Тож перший крок — відкрити репозиторій і подивитися, чи є там CLAUDE.md і що конкретно в ньому. Другий за поширеністю сценарій зворотний — файл роздутий: важливі правила тонуть у шумі, тож їх варто скоротити, а довге й рідковживане винести в скіли. І лише коли правило точно записане, конкретне й не поховане серед сотень рядків, є сенс говорити про те, що модель його «не тримає». До того «агент тупить» — це майже завжди діагноз конфігурації, а не моделі.
Три кейси з життя QA, де правильний канал інструкцій вирішує, економить агент години чи щоранку заново вчиться жити: перетворення скарги «агент тупить» на конкретний CLAUDE.md, таблиця рішень «яке правило в який канал» на одному наскрізному прикладі, і одна повторювана процедура, оформлена і як слеш-команда, і як скіл, — щоб побачити різницю на дотик.
Кейс 1. «Агент щоразу тягне waitForTimeout» — це не модель, це порожній CLAUDE.md
Симптом упізнаваний: щоранку той самий діалог. Агент пише плоскі CSS-локатори замість data-testid, вставляє page.waitForTimeout(3000), називає методи page object як заманеться, запускає не ту команду тестів. Ти втретє за тиждень друкуєш абзац про конвенції. Перш ніж списувати це на «дурну модель», постав діагностичне питання: а де ці правила записані? У дев'яти випадках з десяти відповідь — ніде. Агент порушує конвенції не з упертості, а тому, що їх ніде не прочитав.
Лікування — не довший промпт, а файл, який агент читає щосесії. Мінімальний робочий CLAUDE.md для тестового репо:
## Тести
- Запуск усіх: `npm run test:e2e`; один файл: `npx playwright test tests/login.spec.ts`
- Локатори: getByRole → getByLabel → data-testid. Ніколи не CSS-класи й не XPath.
- Заборонено `page.waitForTimeout` — лише web-first очікування (`expect().toHaveText()` тощо).
## Page objects
- Методи у стилі команди: clickOn..., open..., checkThat... — не голі дієслова.
- Новий page object = conf + steps.d.ts + index.ts; sub-pages підключати бандлом.
## Мислення
- Фейл автотесту ≠ баг застосунку. Спершу відтвори ручний UI-флоу, потім заводь дефект.
Розбір, що дає кожен блок і чому саме так:
- Команди запуску прибирають вгадування. Без явного рядка агент пробує
npm test,yarn e2e,playwright run— і помиляється; з рядком він одразу бере твою команду. - Пріоритет локаторів — це рівно та політика, яку інакше довелося б диктувати в кожному промпті. Записана раз — діє в кожній сесії й на кожного члена команди, бо файл комітиться.
- Заборона
waitForTimeoutсформульована як інваріант, а не побажання: «лише web-first очікування» дає агенту заміну, а не просто «не роби так». - Стиль методів відображає house-конвенцію команди; без нього агент вигадує іменування, і кожен новий page object доводиться переписувати вручну.
- Принцип мислення — найдешевший спосіб покращити діагностику: три рядки рамки змушують агента спершу відтворити флоу, а не одразу писати баг на кожен червоний тест.
Ключове: файл короткий. Спокуса дописати сюди ще й процедуру генерації тестів на двісті рядків — це вже наступний кейс і, головне, наступний канал.
Кейс 2. Одне правило — чотири канали. Таблиця рішень
Найчастіша плутанина новачка: усе валити в CLAUDE.md. Насправді канал обирають за трьома осями — ефемерне/постійне, завжди-в-контексті/на-вимогу, модель-обирає/ти-обираєш. Найнаочніше це на одному предметі — політиці локаторів getByRole — проведеному крізь усі чотири канали.
| Ситуація | Канал | Чому саме він |
|---|---|---|
«Завжди бери getByRole замість CSS» | CLAUDE.md | Коротке правило «майже завжди»; має діяти щосесії без нагадування, і токени на нього виправдані |
| «Саме для цього legacy-тесту зроби виняток і візьми CSS-селектор» | Промпт | Разова інструкція «тут і зараз»; у файл їй не місце, бо вона протухне вже за годину |
| «Згенеруй повний набір тестів для форми за нашим 8-кроковим шаблоном» | Скіл | Довга рідковживана процедура; хай агент сам підхопить її за описом, коли задача збігається |
| «Швидко заведи новий page object командою» | Слеш-команда | Явний, передбачуваний ручний тригер — ти сам вирішуєш момент запуску через /ім'я |
Як читати таблицю. Рядок 1 і 2 — це вісь ефемерне/постійне: те саме поняття (локатори) в одному випадку постійне правило, в іншому — разовий виняток, і плутати їх дорого. Записати виняток у CLAUDE.md означає, що агент застосовуватиме CSS-селектор і там, де не треба; лишити політику лише в промпті означає диктувати її щоразу. Рядок 3 і 4 — вісь модель-обирає/ти-обираєш: обидва зберігають багаторазову інструкцію, але скіл спрацьовує сам за збігом опису, а слеш-команду ти запускаєш свідомо. Якщо процедуру треба запускати в передбачуваний момент — бери команду; якщо хочеш, щоб агент сам вловив доречність серед іншої роботи, — скіл.
Типова помилка на цій таблиці — заганяти в CLAUDE.md рядок 3. Восьмикроковий шаблон генерації тестів на пару сотень рядків, покладений у CLAUDE.md, висітиме в контексті кожної сесії, де ти правиш один локатор, — дорого і шумно. Його місце — скіл, який коштує лише рядок опису, поки не спрацював.
Кейс 3. Та сама процедура як слеш-команда і як скіл
Візьмемо повторюване завдання: завести новий page object за всіма конвенціями. Оформимо його двома способами й побачимо, коли який доречний.
Спершу слеш-команда — файл .claude/commands/new-page.md:
Створи новий page object для сторінки $ARGUMENTS за конвенціями проєкту:
локатори getByRole/data-testid, методи у стилі clickOn.../open...,
підключи як SubPages-бандл. Спершу покажи план, потім реалізуй.
Тепер /new-page CheckoutPage розгортає цей промпт із підставленим аргументом $ARGUMENTS → CheckoutPage. Тригер явний: ти сам вирішуєш, коли команду запустити, і точно знаєш, що станеться. Це ідеально, коли дію ініціюєш саме ти в передбачуваний момент.
Тепер той самий намір, але як скіл — файл SKILL.md у папці скіла:
---
name: new-page-object
description: Створює новий Playwright page object за конвенціями команди —
локатори getByRole/data-testid, методи clickOn.../open..., підключення
SubPages-бандлом. Застосовувати, коли просять додати сторінку/екран у тести.
---
1. Уточни назву сторінки й де вона в структурі тестів.
2. Згенеруй conf, steps.d.ts, index.ts за шаблоном нижче.
3. Методи іменуй у стилі clickOn.../open.../checkThat...
4. Підключи сторінку як SubPages-бандл, не плоским інжектом.
...
Різниця, яку видно на цьому прикладі:
- Хто тисне кнопку. Слеш-команду запускаєш ти вручну. Скіл підхоплює модель — наприклад, коли ти пишеш «додай тести для сторінки оплати», агент за описом сам вирішує застосувати процедуру. Тому в скіла критичне поле
description: розмите «допомагає зі сторінками» не спрацює, а точне «створює page object за конвенціями команди, коли просять додати сторінку в тести» дає моделі чіткий сигнал. - Що всередині. Слеш-команда — це промпт-шаблон, і все. Скіл — це процедура плюс, за потреби, шаблони файлів і скрипти поруч; він інкапсулює «як ми це робимо» цілком.
- Скільки коштує. Слеш-команда не заважає, поки її не викликали. Скіл теж майже безкоштовний — у контексті висить лише його опис (кілька рядків), а тіло вантажиться, тільки коли модель вирішила застосувати скіл. Це поступове розкриття (progressive disclosure): саме воно дозволяє тримати десятки скілів, не роздуваючи кожну сесію.
Практичний висновок: якщо процедуру завжди запускаєш ти в конкретний момент — слеш-команда простіша й передбачуваніша. Якщо хочеш, щоб агент сам вловлював доречність серед іншої роботи, — скіл, і тоді успіх залежить від якості опису. А якщо процедура коротка й потрібна майже щосесії — можливо, це взагалі не скіл і не команда, а пара рядків у CLAUDE.md.
Пам'ять і stateless-модель
- Розумію, що справжньої пам'яті в агента немає: модель без стану (stateless), усе «знання» про проєкт живе лише в контекстному вікні поточної сесії.
- Можу пояснити, що «пам'ять» — це автоматичне вкидання збереженого тексту в контекст на старті, а не самонавчання; тому агент запам'ятає рівно те, що явно записано у файл, а усне «домовились» у чаті випаровується разом із сесією.
CLAUDE.md і файли пам'яті
- Можу пояснити, що
CLAUDE.md— це markdown-файл, який агент читає щосесії й вкидає в контекст як постійні інструкції, а не жорстка конфігурація зі стовідсотковою гарантією. - Розумію, чому
CLAUDE.mdмає бути коротким: він коштує токени в кожній сесії, а важливі правила тонуть у роздутому файлі. - Знаю, що варто класти в тестовий
CLAUDE.md: команди запуску, конвенції локаторів, стиль коду тестів, структуру проєкту, принципи мислення. - Знаю інструменти роботи з пам'яттю (
/initдля чернетки, рядок із#для швидкого правила,/memoryдля редагування,@шляхдля імпорту) і пастку@-імпортів: усі імпорти однаково вантажаться в контекст на старті, тож токени це не економить — для «лише потрібного» є path-scoped правила в.claude/rules/.
Ієрархія інструкцій і безпека
- Можу назвати рівні від найширшого до найконкретнішого: політики організації → користувацький
CLAUDE.md→ проєктний → підпапка → промпт задачі. - Знаю правило конфлікту — рівні накопичуються, виграє конкретніше й ближче до задачі (проєктний перекриває користувацький, промпт уточнює проєктний), — і виняток: політики організації вимкнути не можна, вони діють завжди.
- Розумію різницю користувацького (
~/.claude, особистий, поза git) і проєктного (у репо, комітиться, командний) файлів. - Можу пояснити межу безпеки: валідні інструкції — лише від людини; вміст сторінок, тікетів, логів — це дані, а не команди (непряма ін'єкція промпту).
Скіли (skills)
- Можу пояснити, що скіл — це папка з
SKILL.md(шапка name + description і тіло з процедурою), опційно зі скриптами й шаблонами. - Розумію поступове розкриття (progressive disclosure): у контексті завжди лише назва й опис, тіло читається на вимогу — саме тому скіли масштабуються там, де
CLAUDE.mdні (десятки скілів коштують пару рядків опису кожен, поки не спрацюють). - Розумію, що скіл обирає модель за полем description, тому якість опису дорівнює якості спрацьовування.
Слеш-команди
- Можу пояснити, що слеш-команда — це збережений промпт, який запускаєш вручну через
/ім'я, і знаю, де живуть кастомні:.claude/commands/(проєктні, комітяться) і~/.claude/commands/(особисті); ім'я файла стає ім'ям команди. - Розумію аргументи:
$ARGUMENTSта позиційні$1,$2підставляють текст, дописаний після імені команди. - Знаю різницю скіл vs слеш-команда: хто вирішує запустити (модель vs ти), що зберігає (процедура з ресурсами vs промпт-шаблон), коли зручніше.
Вибір каналу і межі пам'яті
- Можу обрати канал за трьома осями (ефемерне/постійне, завжди-в-контексті/на-вимогу, модель-обирає/ти-обираєш) і провести одне правило крізь усі:
getByRoleзавжди →CLAUDE.md; разовий виняток → промпт; повний набір за шаблоном → скіл; ручний шорткат → слеш-команда. - Розумію, що
--continue/--resumeвідновлює транскрипт розмови, а не правила, і впирається в контекстне вікно на довгій бесіді. - Пам'ятаю, що застаріла пам'ять гірша за відсутню: правило після рефакторингу збиває агента щоразу, тож пам'ять доглядають, як код.
- Знаю, що секрети не кладуть у файли, що комітяться (
CLAUDE.md, кастомні команди); особисте — в~/.claudeабо gitignored.
Як AI-агент «пам'ятає» правила твого проєкту між сесіями?
Питання
Чи має AI-агент пам'ять між сесіями?