Как не дать проекту деградировать при работе с Claude Code: правила, хуки и автоматизация

Как не дать проекту деградировать при работе с Claude Code: правила, хуки и автоматизация - 1

Введение

Привет, Хабр! Я Максим, ведущий специалист по анализу данных и машинному обучению в логистике. Сегодня хочу поговорить про результаты и боль в работе с Claude Code.

Для примера возьму свой пет-проект awesome-project.com (название изменено) – приложение, в котором пользователи работают с AI-ассистентом в рамках структурированных сессий. Под капотом: React + TypeScript для фронтэнда, Express/Node.js — бекенд, PostgreSQL для работы с данными и DeepSeek в роли LLM. Это соло-проект с реальными пользователями, где Claude Code работает как основной соисполнитель – пишет код, мигрирует БД, деплоит.
За время разработки я наступил на каждую возможную граблю (и чувствую, что их поток не кончается):

  • сессии, которые «забывали» архитектурные решения;

  • агент, который в третий раз предлагал переписать то, что мы уже переписывали;

  • коммиты без деплоя;

  • деплои без перезапуска сервиса;

  • инструкции и документы, которые лежали без смысла, и Claude заново прочёсывал весь код.

Я хотел достичь системного решения, которое позволило бы автономно повышать эффективность разработки. Постепенно выкристаллизовалась система, которая позволяет поддерживать качество и не тратить половину сессии на «напоминание контекста».
В этой статье я расскажу, как устроена эта система, какую роль играет каждое звено, и что ещё предстоит улучшить.

Важная оговорка: всё описанное работает для Claude Code (CLI-агент от Anthropic). Часть идей переносима на других агентов, но конкретная механика – CLAUDE.md, хуки, settings.json – специфична именно для него.


1. Проблема: почему проекты с LLM-агентами деградируют быстрее

В Alibaba недавно выкатили исследование с известным результатом: когда код пишется с ИИ-моделями – он деградирует. Лучше всех из 18 моделей справился Opus 4.6, а с деталями вы можете ознакомиться по ссылке.

В статье явно вырываются вперёд модели от Anthropic. Одна из причин в пользу выбора Claude Code при разработке.

В статье явно вырываются вперёд модели от Anthropic. Одна из причин в пользу выбора Claude Code при разработке.

Причины тоже понятны: если живые люди хоть немного держат в голове предыдущий контекст, то агент смотрит на задачу заново. И в начале работы с Claude было такое чувство, что его только что отвлекли от пролистывания мемов в телефоне, потому что сгенерированный им код можно было смело выкинуть.

Итак, приходится признать и принять, что агент не помнит прошлые сессии – каждый раз начинает с нуля. А значит, нужно менять подход к процессу разработки. Можно выделить три специфических вектора деградации кода, сделанного с ИИ-агентами:

  • Контекстуальная амнезия. Агент не помнит, какие решения уже принимались и почему. Он видит только текущий код – но не историю: что пробовали, от чего отказались, что обсуждали и не стали делать. В какой-то момент он начнёт предлагать «улучшения», которые на самом деле откат к уже отвергнутым вариантам.

  • Отсутствие единого стиля. Без явных ограничений каждая новая сессия может внести чуть другой стиль написания компонентов, другое использование типов, чуть другую структуру маршрутов. Через месяц кодовая база превращается в лоскутное одеяло.

  • Процессные пробелы. Агент может написать отличный код, но «забыть» перевести часть текста с русского на английский, не запустить аудит стиля, не добавить трекинг события. Каждый такой пропуск – потраченный впустую час и ещё одна чашка кофе. Решение – бросить пить кофе и каждый раз прописывать всё в промпте – невозможно. Во-первых, кофе очень вкусный. Во-вторых, промпт получается безумно раздутым, и агент всё равно теряет контекст. Приходится не надеяться на память агента, а кодировать знания и процессы в инфраструктуру.

Как не дать проекту деградировать при работе с Claude Code: правила, хуки и автоматизация - 3

Диаграмма текущего процесса разработки сервиса

2. CLAUDE.md: навигационный слой, а не энциклопедия

CLAUDE.md – это файл, который Claude Code читает автоматически в начале каждой сессии. Главная ошибка – класть туда всё подряд. На Хабре есть немало упоминаний этого файла, но мало кто акцентирует внимание на особенности работы с ним самого агента. По личным наблюдениям (и заверениям Claude Code) примерно с 200-й строки значимость инструкций настолько сильно затухает, что теряется буквально на первом запросе.

Я видел CLAUDE.md на 800+ строк с примерами кода, SQL-миграциями и командами деплоя. Такой файл создаёт следующие проблемы: агент тратит огромное количество контекстного окна на неактуальное, возникают внутренние противоречия между старыми и новыми инструкциями, и файл перестаёт читаться вообще – ни человеком, ни агентом.

CLAUDE.md – это указатель и сборник строгих правил, остальное раскидано в .claude/ по папкам.

Файл лежит в корне проекта или в .claude/ и создается автоматом при вызове /init в консоле Claude Code.

Моя структура выглядит так:

.claude/
  rules/ # контекст для агентов
    reference.md             # полный технический референс проекта
    frontend-style-guide.md  # цвета, типографика, анимации
    profile.md               # мой бэкграунд и как со мной работать
  memory/ # хранилище знаний
    integration-contracts.md   
    architecture-decisions.md  
    tasks-completed.md         
  agents/ # инструкции для агентов
    orchestrator-agent.md  
    backend-agent.md        
    frontend-agent.md       
    shared-agents.md        
  templates/ # шаблоны кода
    new-api-endpoint.md     
    new-page.md             
    new-db-table.md
  scripts/ # скрипты для автоматизации команд
    hook-pre-deploy.sh
    hook-post-commit.sh
    hook-stop-reminder.sh
skills/ # навыки для выполнения задач
  check-contract.md   # проверка работы фронта и бэка
  	project-map.md      # поиск по карте проекта

В самом CLAUDE.md – только короткие указатели и правила поведения. Если описание чего-то занимает больше 3 строк, это не для CLAUDE.md. Он всё равно забудет.

Наверное, самое важное из правил, которые лежат в этом файле, – по итогу выполнения задачи анализировать процесс и предлагать шаги по улучшению, чтобы снизить временны́е затраты и количество потреблённых токенов. От этого правила постепенно произошли все остальные и появились блоки, про которые расскажу ниже.

Ещё важно сказать, что правила в этом файле как будто позволяют управлять фокусом внимания агента. И они заметно эволюционировали с момента старта проекта по текущий день.

Стал ли CLAUDE.md волшебной таблеткой от собственных ошибок? Нет. Но работать стал явно эффективнее. Мне проще напомнить про этот файл, чем перечислять все инструкции, и это действительно работает.


3. Memory-файлы: как имитировать долгосрочную память агента

Claude Code не имеет памяти между сессиями. Это архитектурная особенность, а не баг. Решение – вынести «память» в файловую систему.

Три самых важных файла в memory/:
integration-contracts.md – контракты между фронтендом и бэкендом. Каждый API-эндпоинт: метод, путь, параметры запроса, формат ответа, коды ошибок. Без этого агент не замечает, что путь изменился, и продолжает обращаться к нему по-старому.

Пример записи:

Endpoint

Method

Auth

Request

Response

/api/ai/summarize

POST

Yes

{ text, lang? }

{ summary }

/api/ai/suggest

POST

Yes

{ context, history?, lang? }

SSE stream

/api/ai/feedback

POST

Yes

{ messageId, rating }

{ ok: true }

architecture-decisions.md – Код показывает агенту, что выбрано. Но не показывает, что было отброшено и почему. А именно отброшенные варианты он будет предлагать снова, потому что они выглядят разумно, если не знать предыстории. Записывайте причины отказов: это единственное знание, которое агент не может восстановить из кода самостоятельно. Архив решений помогает избежать возврата к старым решениям.

tasks-completed.md – архив завершённых задач с датами и кратким описанием того, что было сделано. Это помогает агенту не предлагать «улучшения», которые вы уже реализовывали и откатывали. Заодно помогает быстрее искать по коммитам старые решения, если надо откатывать изменения.

Memory-файлы работают только если обновляются автоматически после каждой задачи. В моём CLAUDE.md написано буквально: «После каждой задачи (без исключений, не ждать отдельного запроса): обновить todo.md, записать в соответствующий файл памяти».

Судя по логам, Claude Code и агенты действительно обращаются к этим файлам – особенно на этапе планирования задач или если упёрлись в тупик.


4. Rules: что нужно знать до старта

Есть тонкая когнитивная граница между тем, что должно лежать в Skills и тем, что должно лежать в Rules(rules/). Рекомендуется разделять их следующим образом:

Rules – это контекст, который агент читает пассивно в начале сессии или когда ему нужна справка. Он не «делает» ничего, просто знает. reference.md – как устроен проект, frontend-style-guide.md – какие цвета и отступы, profile.md – как с тобой общаться. Это фоновое знание.

Skills – это процедуры с конкретным input/output, которые агент вызывает активно для выполнения задачи. Это действия к выполнению в определенных ситуациях, а не справка.

На практике граница размывается, и легко ошибиться в любую сторону. Чтобы этого избежать можно использовать легкий тест: если можно сказать «запусти X и скажи, что получилось» – это Skill. Если это просто справочная информация, которая влияет на то, как агент пишет код – это Rules.


5. Skills и Templates: переиспользуемые процедуры

Помним, Skills – это переиспользуемые «процедуры» для типовых операций. Лежит в skills/. Вместо того чтобы каждый раз объяснять агенту, как проверить контракт, у меня есть /check-contract, который делает это автоматически.

Используемые в проекте скиллы:

  • /check-contract – верифицирует соответствие между бэкенд-роутами и фронтенд-вызовами после изменений API

  • /project-map – получает карту проекта, ускоряет поиск нужных файлов.

  • /notebooklm – многоисточниковый ресёрч и синтез документации. Есть про это статья на Хабре, рекомендую. Очень полезно на старте проекта.

Templates решают другую проблему: агент не должен «придумывать» структуру для стандартных операций, он должен её заполнять. Хранятся в templates/ следующие файлы:

new-api-endpoint.md содержит точный шаблон Express-роута для этого проекта: с requireAuth, с правильным форматом ошибок { error: «message» }, с sanitizeInput(), с нужными try/catch блоками и форматом логирования. Агент не изобретает – копирует и подставляет.

new-db-table.md — шаблон миграции с соглашением именования, с .down.sql, с нумерацией NNN_description.sql.

Каждый раз, когда ловишь себя на мысли «агент опять написал это не так» – это сигнал: нужен шаблон. А по большей части просто делаешь автоподтверждение изменений и надеешься, что всех шаблонов уже достаточно.


6. Хуки: кодируй правила в инфраструктуру, не в промпт

Хуки – это скрипты, которые автоматически запускаются до и после операций агента. Лежат в scripts/. Claude Code ненавязчиво и без предупреждения игнорирует некоторые инструкции. Чтобы облегчить жизнь этому работяге и уменьшить у себя уровень кортизола, некоторые команды можно сделать автоматическими. Их вызов настраивается в .claude/settings.json:

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{ "type": "command", "command": "bash .claude/scripts/hook-pre-deploy.sh" }]
    }],
    "PostToolUse": [{
      "matcher": "Bash",
      "hooks": [{ "type": "command", "command": "bash .claude/scripts/hook-post-commit.sh" }]
    }],
    "Stop": [{
      "hooks": [{ "type": "command", "command": "bash .claude/scripts/hook-stop-reminder.sh" }]
    }]
  }
}

hook-pre-deploy.sh – блокирует деплой, если не было git push. Звучит тривиально, но это классическая ошибка: агент сделал git commit, получил подтверждение, и сразу пошёл деплоить. На сервере оказывается код из предыдущего коммита. Наверное, это была самая частая ошибка, когда агент писал, что изменения сделаны, а на сервере их нет и тесты их не видят.

#!/bin/bash
# Если запускается деплой – проверяем, что push был сделан
if echo "$BASH_COMMAND" | grep -q "deploy.sh"; then
  LOCAL=$(git rev-parse HEAD)
  REMOTE=$(git rev-parse origin/main 2>/dev/null)
  if [ "$LOCAL" != "$REMOTE" ]; then
    echo "❌ Deploy blocked: git push required first"
    exit 1
  fi
fi

hook-post-commit.sh – после коммита напоминает обновить memory-файлы и проверить, нужен ли деплой.

hook-stop-reminder.sh – запускается когда агент завершает работу. Выводит чеклист: обновлены ли docs, запущен ли style audit, сделан ли push. Очень полезно – можно отдельно прочитать, чем же закончилось получасовое ожидание.

Ключевое преимущество хуков перед правилами в промпте: их нельзя «забыть». Правило в CLAUDE.md агент может проигнорировать при большом контексте. Хук – нет.


7. Агентная оркестрация: параллелизм как ускоритель

Для крупных задач я использую многоагентную архитектуру. Вместо того, чтобы делать всё в одной сессии последовательно, задача декомпозируется и независимые части выполняются параллельно. Инструкции для агентов записаны в agents/. Порядок работы агентов для типичной задачи:

DB Migration → Backend Route → Frontend Component
                    ↓                   ↓
              Security Audit ←→ Code Review + Tests
                         (параллельно)

Почему это важно: если делать последовательно, то проверка кода блокирует тесты, тесты блокируют проверку безопасности. Параллельный запуск сокращает время выполнения в 2-3 раза и экономит токены! Каждый агент имеет свой файл с инструкциями в .claude/agents/(первый три работают на Opus 4.6, последний на Sonnet 4.6) :

  • orchestrator-agent.md – декомпозирует задачу, координирует других агентов

  • backend-agent.md – Express роуты, DB миграции, LLM интеграция

  • frontend-agent.md – React компоненты, i18n, дизайн.

  • shared-agents.md – ревью кода и аудит безопасности, тесты.

Примеры правил оркестрации:

  1. Сначала миграция БД – нельзя писать путь к таблице, которой ещё нет

  2. Потом API – фронтенд должен знать контракт до того, как начнёт писать компонент

  3. Ревью и тесты – параллельно, они друг от друга не зависят

В итоге, агенты объединяются в виртуальную команду разработки. Каждый подключается на определенном этапе, выполняет свои фиксированные задачи. Все как в обычной жизни, только без дейликов и ретро.


8. Дизайн-инструкция: барьер от деградации UI

Визуальная деградация – один из самых неприятных видов деградации. Примерно за три дня активной работы с фронтом и без этих правил всё оформление превратилось в кашу. Пришлось искать выход.

Решение – автоматический аудит стилей с нулевой толерантностью к ошибкам, который описан в :

// package.json scripts 
"audit:style": "node scripts/style-audit.mjs", 
"lint:style": "eslint src/ --rule 'tailwindcss/no-contradicting-classname: error'",
"fmt:classes": "prettier --write src/ --plugin prettier-plugin-tailwindcss"  

style-audit.mjs – кастомный скрипт, который проходит по всем файлам src/ и ищет:

  • Inline-градиенты (linear-gradient, radial-gradient в style-атрибутах)

  • Хардкодные цвета (#hex, rgb(), rgba() вне CSS-переменных)

  • Запрещённые Tailwind-классы (например, прямые цветовые классы, которые заменены собственными)

Правило жёсткое: 0 ERRORs required before commit. Если скрипт падает, коммит не проходит. Не «желательно исправить», не «посмотрим потом» – все дизайн-ошибки должны быть исправлены до деплоя.

Такое правило ест мало-помалу токены, зато не страшно нажимать F5 и смотреть, что же там наваял фронтенд-агент.


9. Пробелы: что ещё можно улучшить

Буду честен. Файлик с предложениями по улучшениям обновляется каждый день. Часть правил Claude Code продолжает периодически дерзко игнорировать.

Вот что последнее скопилось у меня в списке задач:

Автоматическая синхронизация языков. В проекте два языка – русский и английский. Русский – основной, английский обновляется вслед за ним. Сейчас это ручной шаг, который легко пропустить. Нужна автоматическая проверка: если в русском появился новый текст, а в английском его ещё нет – сборка падает.

После деплоя ничто автоматически не проверяет, что приложение реально работает – только то, что процесс запустился. Тесты в целом отдельная боль. Агент может безуспешно пытаться залогиниться по 10 раз, хотя у него есть правило «остановись на второй попытке» и рабочие(!) email и пароль, которые уже работали в предыдущей сессии. Может стоит перевести агента для тестирования на Opus 4.6 и выделить в отдельную сущность.

Список запрещённых паттернов. В CLAUDE.md есть стандарты написания. кода, но нет явного списка запретов: «не добавлять зависимости без обсуждения», «не менять схему БД без миграции», «не использовать any типы». Агент нарушает именно то, что нигде явно не запрещено.

Архивирование memory-файлов. tasks-completed.md будет расти бесконечно. Нужна политика: задачи старше 30–60 дней переезжают в archive/. Иначе со временем файл станет слишком большим и начнёт «шуметь» в контексте.


10. Примечание: что следует помнить

Отдельно стоит обратить внимание, что для Claude Code есть официальная документация. Её бывает очень полезно читать и перечитывать. Например, пока писал статью отдельно подчёркивал проблему с управлением процесса тестирования. В документации чётко написано, что для каждого агента должна быть своя инструкция. Выделение shared_agents.md в отдельные файлы в моменте решило проблему с тестированием. Теперь агент вовремя подключается и активно участвует в разработке.

Также заметил, что в начале выполнения некоторых задач сходу потребляется порядка 50к токенов, а потом это число доросло до 75 к и больше. Странно, ведь был скилл project-map.md и, казалось, что агент должен опираться на него впервую очередь. Но, оказалось, что Claude оформил его не правильно. Нужно было написать название скилла, а внутри сделать файлик SKILL.md с описанием самого скилла. Теперь на ознакомление с проектом потребляется порядка 2-3х тысяч токенов. Экономия в 25 раз.

Завершая, отмечу, что существует ограниченный набор правил для Claude , как должны называться папки в директории .claude:

  • .claude/agents/ — субагенты (вызов через @name).

  • .claude/skills/ — навыки/слэш-команды.

  • .claude/rules/ — контекстные правила .

Все остальное, что вы положили туда(например, агентскую память), но не упомянули в CLAUDE.md — постепенно окажется похоронено под пеплом сожженых токенов.

Итоговый макет структуры проекта следующий:

.claude/
  rules/ # контекст для агентов
    reference.md             # полный технический референс проекта
    frontend-style-guide.md  # цвета, типографика, анимации
    profile.md               # мой бэкграунд и как со мной работать
  memory/ # хранилище знаний
    integration-contracts.md   
    architecture-decisions.md  
    tasks-completed.md         
  agents/ # инструкции для агентов
    orchestrator-agent.md  
    backend-agent.md        
    frontend-agent.md       
    test-agent.md
    security-auditor.md
     ...
  templates/ # шаблоны кода
    new-api-endpoint.md     
    new-page.md             
    new-db-table.md
  scripts/ # скрипты для автоматизации команд
    hook-pre-deploy.sh
    hook-post-commit.sh
    hook-stop-reminder.sh
skills/ # навыки для выполнения задач
  check-contract/
       SKILL.md   # проверка работы фронта и бэка
  project-map/
       SKILL.md   # поиск по карте проекта

11. Заключение

Claude Code – мощный инструмент, но сам по себе он не гарантирует качество. Кто там говорит, что айтишники уже не нужны – почитайте об успехе разработки в Amazon, и почему полмира в прошлом году дважды сидело без интернета.

Поэтому без системы вокруг Claude Code проект деградирует быстрее, чем с обычной командой, просто потому что агент не помнит вчера, не замечает тренды и не несёт ответственности за долгосрочные последствия. Коллеги по цеху не поругают его на кофебрейке за небрежные коммиты, а значит можно делать всё, что не запрещено.

Система, которую я описал, строится на нескольких принципах:

  • Не полагайся на CLAUDE.md , как на свалку – нет смысла всё туда сваливать. В этом файле нужна жёсткая структура правил и ссылок.

  • Не полагайся на память агента – всё важное должно быть в файлах.

  • Кодируй правила в инфраструктуру – хуки надёжнее инструкций в промпте.

  • Нулевая толерантность к стилевым ошибкам –чтобы не было больно глазам не пропускать ошибки дизайн на фронт .

  • Декомпозируй и параллели – агентная оркестрация окупается на задачах от 10+ минут.

  • Шаблоны вместо изобретения – типовые операции не должны требовать творчества.

Решают ли эти принципы все боли? Нет. Иногда есть вопросы к тому, что агент реально держит «в голове» и как подходит к выполнению задачи. Но эти принципы помогли ощутимо уменьшить потребление токенов, повысить прозрачность процессов и замедлить деградацию системы, если не остановить.

Если у вас есть свои правила работы с Claude Code или другими агентами – буду рад обсудить их в комментариях.

Автор: Maxim_Santalov

Источник

Оставить комментарий