После выхода Claude Opus 4.7 стало очевидно, что агент технически быстрее меня. А 28 мая Anthropic выпустила Opus 4.8 с теми же ценами, заметно лучшим coding/agentic-скором и новой возможностью держать в голове миграции на сотни тысяч строк

И всё же расслабиться не выйдет, потому что есть нюанс: эрудиция у него принципала, а суждения джуна. Он знает двадцать способов решить задачу и ни одной причины предпочесть один другому - потому что не ему потом это поддерживать

Если разобрать, чего именно ему не хватает, набирается ровно три вещи:

Памяти. Каждая новая сессия начинается с чистого листа. Он не помнит, что вчера мы договорились не плодить feature-flags, что в прошлую субботу выпилили шесть классов-фабрик, что в этом сервисе моки в тестах под запретом. Без напоминания он повторит каждую ошибку, которую уже исправлял

Вкуса. Он учился на усреднённом GitHub, а усреднённый GitHub это корпоративная Java с трёхэтажными try-catch и javadoc на сеттеры. Он искренне считает, что так и надо. Своего мнения «нравится / не нравится» у него нет, потому что он не писал код десять лет и не разгребал чужое наследие

Тормозов. По дефолту он хочет писать больше, а не меньше. Спросишь endpoint, получишь endpoint плюс DTO плюс feature flag плюс абстрактный базовый класс «на будущее» плюс параметризованный тест на пять кейсов. Сам он не остановится никогда

Знания принципала, поведение задорного стажёра. Чтобы из этого вышел толк, кто-то должен играть тимлида - держать память, навязывать вкус, ставить тормоза. Этим я и занимаюсь. Причём сразу на трёх проектах

Три проекта

Я веду параллельно три проекта.

PulseLens. SaaS-аналитика для тимлидов. Java 21, Spring Boot, Postgres, мультитенантность, интеграции с GitLab, GitHub и Jira. Готовлюсь к US-launch

Luna Tarot. Telegram-бот с мистическим тарологом. Spring Boot + React Mini App, Claude Haiku 4.5 как голос Луны. Расклады, карта дня, эзотерический дневник

Третий проект. Python-пайплайн, скрапер плюс Gemini Flash для batch-разбора плюс Opus для финального аудита и генерации. Что именно делает, пока оставлю за кадром

Три разных стека, три аудитории, три домена. Один процесс работы с Claude и одна общая боль: без правил его код за неделю превращается в кашу

Что не так с кодом по умолчанию

Чтобы было предметно - один простой запрос. Просишь «добавь endpoint для удаления пользователя» и Claude за минуту пишет рабочий endpoint. С правами доступа, транзакцией. И с горой лишнего...

  • Javadoc на четыре строки, где написано, что метод удаляет пользователя по ID.

  • Try-catch на EntityNotFoundException, хотя в проекте уже есть GlobalExceptionHandler.

  • DTO DeleteUserRequest с одним полем userId, хотя ID уже в path-параметре.

  • Feature flag app.users.delete-enabled, на всякий случай.

  • Где-нибудь if (user == null) throw... рядом с .orElseThrow().

Это не плохой код. Это код, усреднённый по GitHub

С тестами хуже. По умолчанию агент не пишет интеграционные тесты, он пишет «модульные» поверх моков. Мокирует репозиторий, сервис, базу. Тест зелёный, проверяет, что вызвался repo.save(). О том, что реальная JPA-связь сломалась, узнаёшь в проде. Стиль и уровень тестов нужно проговаривать явно

И отдельная боль, типовая для любого агента, это попытки обойти твою собственную систему проверок:

  • Возникает warning от PMD или SpotBugs, агент вместо рефакторинга ставит @SuppressWarnings("PMD.GodClass").

  • Тест мешает мержу, агент добавляет @Disabled с комментарием «фикс в следующем PR».

  • Покрытие упало ниже порога, агент понижает порог в build.gradle.kts с 85% до 80%.

  • Checkstyle ругается на длину метода, агент сверху лепит // CHECKSTYLE:OFF.

Агент оптимизирует на «билд зелёный», а не на «качество не упало»

Любопытно, что Anthropic это сама признала. В анонсе 4.8 написано прямо: новая модель «вчетверо реже оставляет недочёты в собственном коде без упоминания, чем предыдущая». То есть на этой проблеме инженерили специально. Значит, она остаётся и в 4.8, просто стала реже. Кнут всё равно нужен

Три уровня правил

Лечится это тремя уровнями - по одному на каждую дыру. Память лечит CLAUDE.md, вкус - .claude/rules/, тормоза - линтеры. Без всех трёх не работает: убери любой, и агент продавит брешь именно в нём

Три уровня правил
Три уровня правил

Уровень 1, против амнезии. CLAUDE.md в корне. Не про код, а про продукт. Что делаем, для кого, в какой фазе, что в приоритете, какие архитектурные решения уже приняты. Claude читает этот файл в начале каждой сессии и сразу попадает в контекст, который иначе пришлось бы пересказывать каждый раз

В PulseLens 200 строк, в Luna Tarot 80, в третьем 50. Без этого файла любой запрос «добавь страницу X» превращается в «придумай продукт с нуля и добавь страницу X»

Уровень 2, против безвкусицы. Папка .claude/rules/ с императивными правилами. Это маленькие законы стиля, тестирования и архитектуры, которых у агента нет своих

.claude/rules
.claude/rules

Разнесены по файлам:

  • code-style.md: функциональный стиль вместо циклов, Optional вместо null, никаких Object[] как контейнера, никаких хардкоженных строк вместо enum

  • testing.md: только интеграционные тесты на реальном Postgres через Testcontainers. Моки только для внешних клиентов, всё остальное настоящее. AssertJ вместо JUnit-ассертов, новая фича плюс новый E2E в том же PR

  • architecture.md: Controller только дёргает Service, репозиторий из контроллера запрещён, никаких God-классов

  • workflow.md: каждая задача в отдельном git worktree, чтобы вести три фичи параллельно

  • definition-of-done.md: что должно быть зелёным перед мержем

Эти файлы Claude видит в каждой сессии. Поведение под их давлением выправляется не потому, что он «понял», а потому что правило всегда сверху

Уровень 3, главный. Против отсутствия тормозов. Линтеры и тесты.

Это единственный уровень, который агент не может обойти словами. Без него остальные два это пожелания, а не правила. Если у тебя нет третьего, не стоит начинать

Почему именно он главный разберем на примере: билд краснеет, агент предлагает: «добавлю @Disabled, фикс в следующем PR». Я не даю - и через две-три итерации он чинит по-настоящему. Уровни 1 и 2 он может уговорить словами. Линтер уговорить нельзя

Правило простое. Билд зелёный тогда PR мержится. Билд красный - никаких отговорок. Никаких @SuppressWarnings, никаких @Disabled, никаких пониженных порогов. Это прописано отдельным пунктом в definition-of-done.md, и я сверяю это в каждом ревью. Стандартный набор у меня и в PulseLens, и в рабочих сервисах:

  • Checkstyle: стиль, форматирование, импорты, длина методов, фигурные скобки

  • PMD: цикломатическая сложность, длина класса, дубли, антипаттерны, lambda-to-method-reference

  • SpotBugs: потенциальные баги, NPE, equals/hashCode

  • JaCoCo: покрытие по строкам/веткам/методам с порогами 85/70/87%

  • pg-index-health: здоровье схемы Postgres, ненужные индексы, отсутствующие FK, дубли, неоптимальные таблицы

  • Playwright: 20+ E2E-сценариев, прокликивают каждую страницу

Отдельно про JaCoCo. Пороги 85/70/87 это не потолок, а пол. Поднял новый код покрытие - порог в build.gradle.kts поднимается следом. Откатить назад уже нельзя: код, который завтра уронит покрытие, не пройдёт билд

В Luna Tarot набор тот же, без pg-index-health. В Python-проекте ruff, black, mypy.

CLAUDE.md и .claude/rules/ это пряник. Линтеры и тесты это кнут. Без кнута пряник не работает

Конкретные примеры

PulseLens. Поймал Claude на хардкоде статусов:

List<String> stuckStatusNames = List.of("In Progress", "Code Review", "Testing");

Открыл code-style.md, добавил:

Запрещено хардкодить категории/типы как строковые литералы. Использовать enum в domain/model/enums/. Default-значения брать из enum.

Пять PR подряд, ни одного хардкода

Luna Tarot. Тянул фичи про запас: feature flag для тестового режима, интерфейс TarotEngine под одну реализацию, кеш с TTL. В CLAUDE.md появилось:

Не добавляй интерфейсы там, где одна реализация. Не добавляй feature flags для функций, которые ещё не нужны. Три похожих строки лучше преждевременной абстракции. YAGNI.

Сработало на 70%. Остальное ловлю в ревью

Что осталось мне

Руками я почти не пишу. Что делаю:

  1. Формулирую задачу через код и контекст. Не «добавь страницу», а постановка с привязкой к конкретным репозиториям, моделям БД, компонентам. Половина промпта — про то, чего делать НЕ нужно: «не трогай топбар, не меняй URL других страниц». Чем точнее границы, тем меньше потом работы на ревью. Саму постановку всё чаще делает Claude: обсуждаю задачу с агентом в чате, он через MCP заводит тикет в трекер Jira и RFC/ADR на Confluence. Репозитории и схема БД у него уже на входе - поэтому формулировка выходит конкретной, а не «нужно, чтоб работало»

  2. Согласовываю план до кода. Для всего нетривиального сначала «опиши, какие файлы создашь, какие тронешь, какие модели изменишь». Читаю, спорю. Потом - «делай»

  3. Делаю code review каждого PR двумя слоями. Первый отдельной сессией Claude в режиме «найди проблемы, не пиши код» по чеклисту правил. Второй - сам, глазами, по диффу. Системную проблему, пойманную дважды, закрепляю правилом - как с хардкодом выше. Оно встраивается в pipeline и работает на следующих PR автоматически

  4. Запускаю продукт сам. Резонный вопрос: зачем, если есть тесты? Затем, что тесты проверяют «правильно», а не «хорошо». Зелёный билд гарантирует, что ничего не сломалось и регрессий нет, и это снимает с меня девяносто процентов. Но оставшиеся десять не ловит ни один тест: 300 мс лага на кнопке, рваную анимацию, модалку, которая открывается на полкадра позже, текст, который технически верный, но звучит не как наш бренд. Это видно только глазами и пальцами. Поэтому каждую фичу я прокликиваю руками - не вместо тестов, а после них

Аналогия

Когда люди пересели с пеших переходов на лошадей, скорость выросла в десять раз. Но лошадь это не бесплатный мотор. Её надо кормить, поить, чистить, подковывать, лечить, выгуливать, объезжать. Без этого лошадь либо встанет, либо понесёт

С агентом то же самое. Claude это не бесплатный код. Его надо кормить контекстом (CLAUDE.md) и деньгами (подписка), учить правилам (.claude/rules/), держать в стойле линтеров (билд-проверки), регулярно объезжать (code review)

Помогать агенту это не про вежливость. Это про то, чтобы он работал на тебя, а не против тебя

Сейчас я думаю так. Claude начинает заменять руки. Голова нужна как раньше, а вкус даже сильнее

Комментарии (10)


  1. AnatolyEmelin
    02.06.2026 09:27

    Сколько md файлы едят токенов ...


    1. igoresha_s Автор
      02.06.2026 09:27

      На своём проекте: CLAUDE.md (~28k символов) + правила (~20k) + индекс памяти (~10k) = ~58k символов, порядка 20k токенов на старте сессии

      Но это не так много: грузится один раз за сессию, а память целиком не читается, в контекст идёт только индекс, сами файлы подтягиваются по запросу. На фоне окна в 200k это ~10%. Реально контекст едят длинные выводы команд и история диалога, а не инструкции


      1. AnatolyEmelin
        02.06.2026 09:27

        Видимо Cursor ест по другому.


        1. igoresha_s Автор
          02.06.2026 09:27

          Cursor устроен немного иначе, на сколько знаю. CLAUDE.md в Claude Code висит в контексте всю сессию целиком. Cursor же индексирует кодовую базу (эмбеддинги + поиск) и подтягивает только релевантные куски под запрос, а правила .cursor/rules могут цепляться условно, а не всегда

          Плюс он прячет токены за моделью “по запросам”, поэтому расход не виден. Принцип тот же - persistent-инструкции маленькие, едят контекст retrieved-код и история. Но Cursor в среднем держит меньше постоянного текста, чем всегда-загруженный CLAUDE.md

          Вообще мало работал с курсором, может у вас проблема где-то в другом месте?


          1. exelens
            02.06.2026 09:27

            Курсор любит агентс и держит его в памяти как в прочим и пи и кранч.


      1. vorozhbit
        02.06.2026 09:27

        28к символов? при бутстрапе? как часто, простите, обновляется? почему не делите на docs/subj1.md и через «@docs/subj1.md» не ссылаетесь? obsidian не пробовали прикрутить? я просто везде в своих проектах имею малюсенький claude.md, разбитый на секции, и также obsidian. плюс подпапки, те же домены можно обогатить своими внутренними claude.md


        1. igoresha_s Автор
          02.06.2026 09:27

          28к потому что у меня пока всё в одном файле. Обновляю по мере новых фичей, раз в пару недель. На старте ~20к токенов, ~10% окна вроде терпимо, но для крупных проектов мб стоит дробить, есть рефы где посмотреть, как у вас, например?

          Вложенные claude.md в подпапках доменов заберу посмотреть, спс, вроде подтягиваются когда модель работает в этом куске

          Obsidian показался переусложнённым, и он про навигацию для меня, а не про то, что грузит модель. Если у вас взлетело - расскажите


  1. RomeoGolf
    02.06.2026 09:27

    Аналогия

    Когда люди пересели с пеших переходов на лошадей, скорость выросла в десять раз. Но лошадь это не бесплатный мотор. Её надо кормить, ...

    Очень хорошая аналогия. Потому что нифига не в 10 раз. Вы пробовали ходить в конный поход? Разиков в 5 у вас вырастет скорость, если есть почтовые станции и перекладные, которых вы можете менять немедленно по запросу. Например, если вы фельдегерь. Если у вас конь с телегой и вам надо не свадьбу на тройке с бубенцами 300 метров по деревне промчать, то скорость у вас вырастет раза в полтора, а в некоторых случаях (конь один, а телега хорошо груженая) средняя за маршрут может и упасть.

    Но глядя со стороны, да пока сам не пробовал, думаешь - ага, щас как в 10 раз ускорюсь... А вот все остальное, которое после "надо", никуда не девается, да.


    1. igoresha_s Автор
      02.06.2026 09:27

      В 10 раз - это, конечно, фигура речи, а не замер с секундомером) Будь то конь, будь то 1.5–5 раз в реальном походе - точный множитель тут не главное. Главное, что вы сами же и подтвердили: скачок есть

      А вот мысль, ради которой аналогия и приводилась: конь это не бесплатный мотор. Выигрыш в скорости реальный, но "всё остальное, которое после надо" никуда не девается. Кормить, поить, чистить -и коня, и модель (контекстом, ревью, перепроверкой)

      тут вылезает вторая хитрость. Я начинаю кодить вдвое быстрее я сразу хочу, чтобы и код-ревью успевало, и тесты qa шустрее, потому что pull request’ов стало больше. Конь-то разогнался, а дорога, мосты и станции остались прежними и пробка просто переехала на новое место))

      Так что мы с вами об одном. Я про то, что сел в седло - и часть сил уходит уже не на дорогу, а на саму лошадь


  1. yursdan
    02.06.2026 09:27

    Не хватает опции 80-90% руками, AI только для рутины, которую можно "читать по диагонали" - вроде "рыбы" для тестов и в качестве источника условно-"альтернативного" взгляда на код.

    Ведь всё это "fine and dandy" ровно до тех пор, пока вам не надо подписываться чем-то серьёзным под результатом. А значит вдумчиво разбирать, что же там "ИИ"-агент нафантазировал, нет ли там затейливых "student-style приколов" в реализации, элементарных ошибок на уровне "детский сад" или же gross-overengineering-трэша в ущерб базе, о котором никто "ИИ"-агента не просил.