Бесплатный интерактивный курс · aicoding.space
skills-ecc: двадцать навыков для агента, которого надо чинить, мерить и выкатывать
Практический курс по пакету @dzhechkov/skills-ecc — двадцати навыкам, привезённым из ECC. Вместе с Кириллом ты разберёшь, почему агент «стал хуже после обновления», научишься искать поломку по двенадцати слоям, сравнивать агентов измерением, а не на глаз, выбирать форму автономной петли, ловить слепое пятно самопроверки, собирать серверный код по шаблонам, упаковывать его в образ, оставлять след решений и следить за выкаткой.
Содержание курса
1. Что это за пакет и почему навыки включаются сами
Двадцать навыков из ECC, одна команда установки — и ни одну команду не надо заучивать.
Ключевая мысль: автоактивация навыка по триггерным фразам
Кирилл открыл README пакета и первым делом спросил то же, что спросил бы ты: «двадцать навыков — это что, двадцать команд, которые мне придётся выучить?»
Нет. Навык — это файл SKILL.md с методикой, который твой агент подгружает сам, когда твоя задача совпадает с его триггерными фразами. Это и есть автоактивация: ты пишешь ассистенту «проверь архитектуру моего агента» — и он включает agent-architecture-audit, потому что в шапке этого файла записано, на какие формулировки он откликается. Кирилл не набирал ни одной команды: он описал задачу словами, и навык пришёл сам.
Что лежит в пакете @dzhechkov/skills-ecc (исходники — в репозитории dz-harness):
- 20 навыков, привезённых из проекта ECC (лицензия MIT) командой
dz import-ecc; - у каждого в шапке стоит
trust_tier: 0— «Community (imported from ECC)»: пакет честно помечает, что это привозной материал, а не написанный автором харнеса; - темы — агентные приложения, автономные петли, тестирование и DevOps: от аудита агента до Docker и git.
Ставится одной командой: dz install @dzhechkov/skills-ecc. Нужны только два навыка — dz init --target claude-code --select docker-patterns,autonomous-loops. Хочешь увидеть точные триггеры навыка — dz info <skill-id>; найти навык по слову — dz registry search <term>.
Компромисс: автоактивация избавляет от заучивания, но триггеры — это текст в шапке файла: если твоя формулировка не совпала с фразами автора навыка, навык промолчит. Тогда Кирилл просто называет навык по имени — и это нормальный, а не аварийный путь.
💬 Просто попроси. Весь курс построен так: ты будешь видеть, ЧТО делает каждый навык, чтобы понимать, что происходит под капотом. Но включать их можно словами — «сравни двух агентов на моей задаче», «посмотри, почему тест плавает».
2. Агент стал хуже: аудит двенадцати слоёв
Прежде чем винить модель — пройди по двенадцати слоям обёртки, где на самом деле портится ответ.
Ключевая мысль: двенадцатислойный стек агента
«Модель стала тупее», — сказал Кирилл в понедельник. К среде выяснилось, что модель ни при чём.
Навык agent-architecture-audit начинается с неудобной мысли: в приложении на LLM ответ проходит через двенадцатислойный стек, и испортить его может любой слой — а винить принято только модель. Один из явных сигналов для аудита прямо в навыке: ты отлаживаешь поведение агента больше 15 минут и не нашёл причину. Кирилл отлаживал три дня.
Вот эти двенадцать слоёв — от входа к выходу:
- системный промпт — противоречивые инструкции, раздувание;
- история сессии — устаревший контекст из прошлых ходов;
- долговременная память — загрязнение между сессиями;
- дистилляция — сжатые пересказы возвращаются как «факты»;
- активный пересказ — лишние слои повторного суммирования;
- выбор инструмента — не тот маршрут, пропущен обязательный вызов;
- выполнение инструмента — «сказал, что вызвал», а не вызвал;
- чтение результата инструмента — вывод прочитан не так или проигнорирован;
- форма ответа — сломанный формат на выходе;
- отрисовка платформой — UI, API или CLI сами меняют верный ответ;
- скрытые петли починки — молчаливый второй проход LLM;
- персистентность — просроченное состояние считается живым.
Навык сводит это к пяти повторяющимся картинам отказа: регрессия обёртки (в песочнице модель отвечает верно, в твоём приложении — нет), загрязнение памяти, провал дисциплины инструментов («обязан вызвать X» написано в промпте, но кодом не проверяется), порча при отрисовке и скрытые слои агентов. У Кирилла оказалась третья: правило «сначала запроси базу знаний» жило только в тексте промпта, и после обновления модель стала его пропускать.
Аудит идёт четырьмя фазами — рамка, сбор улик (код, логи, конфиги, файлы памяти), карта отказов (симптом → механизм → слой → корень → улика file:line → уверенность), стратегия починки. И порядок починки задан жёстко: сначала код, потом промпт — обязательность инструмента закрепляют в коде, скрытые починочные агенты убирают или делают явными, дубли контекста режут.
Компромисс: аудит по двенадцати слоям дорог — надо читать код, логи и память, а не переписать промпт за пять минут. Зато он запрещает самую частую ошибку: винить модель, не опровергнув регрессию обёртки.
3. Измерь, прежде чем верить: agent-eval и петля бенчмарка
«Какой агент лучше?» — вопрос не для спора, а для трёх прогонов на закреплённом коммите.
Ключевая мысль: воспроизводимое сравнение агентов
Починив обёртку, Кирилл захотел проверить, не пора ли сменить сам агент для кодинга. В чате команды за минуту появились три мнения. Навык agent-eval называет это честно: каждое сравнение «какой агент лучше» обычно идёт на ощущениях — а должно идти на измерении.
Что делает сравнение воспроизводимым, а не спором:
- Задача описана в YAML — имя, репозиторий, файлы, промпт, судья и
commit, закреплённый на конкретном коммите, чтобы результаты сходились через дни и недели. - Каждый прогон живёт в своём git worktree — без Docker; агенты не мешают друг другу и не портят базовый репозиторий.
- Метрики фиксированы: доля прохождения, стоимость, время и постоянство — доля прохождения при повторах (3/3 = 100%).
- Судьи трёх типов: детерминированные (
pytest, команда сборки), по шаблону (grep), и модельные (LLM-судья). Навык требует хотя бы одного детерминированного на задачу — модельный судья добавляет шум.
Кирилл собрал команду agent-eval run --task tasks/add-retry-logic.yaml --agent claude-code --agent aider --runs 3, а потом agent-eval report --format table — и получил таблицу: у одного агента 3/3, у другого 2/3 и дешевле. Спор кончился.
Рядом лежит навык-близнец — benchmark-optimization-loop. Он про то же измерение, но для «сделай в 20 раз быстрее»: до оптимизации должны существовать операция, гейт корректности, метрика, базовый уровень и бюджет поиска. Дальше петля: замерить базу → найти узкое место по уликам → варианты по одной гипотезе каждый → одинаковые входы → отбросить неверные → продвинуть лучший безопасный вариант → закрепить в скрипте или тесте → перепрогнать базу и победителя, чтобы подтвердить разницу. И слова тоже измеряются: «лучший измеренный безопасный вариант», а не «глобальный оптимум», если пространство не перебрано целиком.
Компромисс: воспроизводимое сравнение стоит времени — три прогона на 3–5 задач против одного «попробовал, вроде норм». Зато решение переживает смену модели у поставщика: перепрогнал — увидел регрессию.
4. Сначала eval: как agentic-engineering режет работу
Критерий готовности до начала, единицы по пятнадцать минут и маршрутизация моделей по сложности.
Ключевая мысль: петля eval-first
Кирилл готов отдать агентам большую часть кода. Навык agentic-engineering описывает, как при этом не потерять контроль: агент делает основную реализацию, а человек держит качество и риск — через четыре принципа.
Общая картина — четыре принципа:
- определить критерий завершения ДО выполнения;
- разбить работу на единицы «под агента»;
- маршрутизировать уровень модели по сложности задачи;
- мерить evals и регрессионными проверками.
Пошагово — петля eval-first. Eval здесь — проверка способности: набор задач, на которых видно, умеет агент это или нет. Порядок жёсткий:
- определить capability-eval (что должно появиться) и regression-eval (что не должно сломаться);
- прогнать базовый уровень и записать сигнатуры отказов;
- выполнить реализацию;
- перепрогнать evals и сравнить дельты.
Конкретный артефакт — правило пятнадцатиминутной единицы: каждая единица работы проверяется независимо, несёт один доминирующий риск и имеет явное условие «готово». Кирилл сначала нарезал «переписать модуль авторизации» одной задачей — и агент вернул полотно на восемь файлов, которое некому было проверить. Нарезал по пятнадцать минут — каждая единица закрывалась своим evals.
Маршрутизация моделей в навыке простая: Haiku — классификация, шаблонные преобразования, узкие правки; Sonnet — реализация и рефакторинг; Opus — архитектура, поиск корня, инварианты на много файлов. Поднимать уровень — только когда нижний провалился с явным разрывом в рассуждении. И учёт на каждую задачу: модель, оценка токенов, повторы, время, исход.
Компромисс: петля eval-first требует написать проверки раньше кода — это медленный старт. Зато «готово» перестаёт быть мнением: дельта между базой и результатом либо есть, либо нет.
5. Спектр петель автономии: от claude -p до DAG
Шесть форм автономной петли, одна матрица выбора и три анти-паттерна, которые съедают бюджет.
Ключевая мысль: спектр петель автономии
Кирилл хочет, чтобы агент работал ночью без него. Первая мысль — «запущу в цикле, пусть крутится». Навык autonomous-loops отвечает: сначала выбери ФОРМУ петли, потому что петли автономии образуют спектр от простого к сложному, и форма выбирается под задачу, а не под амбицию.
Шесть форм, от простой к сложной:
- Последовательный конвейер (
claude -p) — цепочка неинтерактивных вызовов: реализовать → очистить → проверить → закоммитить; у каждого шага свежий контекст;set -eостанавливает цепочку при отказе. - NanoClaw REPL — сессия с историей в markdown-файле, для интерактивной работы.
- Бесконечная агентная петля — много вариаций одного по спецификации.
- Continuous Claude PR-петля — многодневная итеративная работа с гейтами CI; ограничивается
--max-runs,--max-cost,--max-durationили сигналом завершения. - De-Sloppify — надстройка: проход очистки после каждого шага реализации (о нём вся следующая секция).
- Ralphinho / DAG по RFC — большие фичи, параллельные единицы, очередь слияния с выселением при конфликте.
Матрица выбора из навыка умещается в три вопроса: задача — одно сфокусированное изменение? → конвейер или REPL. Есть письменная спецификация и нужна параллельность? → Ralphinho; спецификация есть, параллельность не нужна → Continuous Claude. Нужно много вариаций одного? → бесконечная петля; иначе — конвейер с очисткой.
Навык continuous-agent-loop — парадная дверь к тому же: он выбирает форму (последовательная / параллельный веер / с гейтом на PR) и составляет её из навыков харнеса, не переизобретая гейты. В шапке autonomous-loops честно записано: каноническое имя теперь continuous-agent-loop, старое оставлено на один выпуск ради совместимости.
Три ошибки, которые навык называет прямо: бесконечная петля без условия выхода (всегда --max-runs, --max-cost, --max-duration или сигнал); нет моста контекста между итерациями (каждый claude -p начинает с нуля — нужен SHARED_TASK_NOTES.md или состояние на диске); повтор той же ошибки — при отказе не перезапускать вслепую, а захватить контекст ошибки и отдать следующей попытке.
Компромисс: чем выше по спектру, тем больше можно сделать без человека — и тем дороже отказ: очередь слияния и параллельные worktree требуют стратегии конфликтов. Простая форма с явным лимитом часто выигрывает у сложной без него.
6. Почему «не делай X» вредит: отдельный проход очистки
Запрет в промпте портит всё тестирование сразу; отдельный агент-уборщик — нет.
Ключевая мысль: отдельный проход очистки
Кирилл попросил агента «реализуй с TDD» — и получил тесты на то, что typeof x === 'string' работает, защитные проверки того, что уже гарантирует система типов, и обработку ошибок для невозможных состояний. Естественная реакция — дописать в промпт: «не тестируй систему типов». Кирилл так и сделал. Стало хуже.
Вот неожиданность, ради которой существует паттерн De-Sloppify: отрицательная инструкция в промпте реализатора бьёт не по слоппу, а по всему тестированию. Навык перечисляет последствия: модель начинает осторожничать со ВСЕМИ тестами, пропускает законные краевые случаи, качество проседает непредсказуемо.
Решение — не сдерживать реализатора, а добавить отдельный проход очистки в свежем контексте:
- реализовать — «будь тщательным с тестами», без запретов;
- отдельным вызовом
claude -p— «просмотри изменения, убери тесты на поведение языка и фреймворка, избыточные проверки типов, защиту от невозможных состояний, console.log, закомментированный код; бизнес-тесты оставь; прогони набор тестов».
Ключевая мысль навыка: два сфокусированных агента работают лучше одного ограниченного. Отсюда же общий анти-паттерн из списка: «не говори „не делай X“ — добавь отдельный проход, который убирает X». В цикле это выглядит так: реализовать → очистить → проверить (сборка, линт, тесты) → закоммитить — и так для каждой фичи.
Компромисс: отдельный проход — это ещё один вызов модели на каждую фичу, то есть время и токены. Зато реализатор остаётся тщательным, а уборка предсказуема, потому что у неё один узкий мандат.
7. Слепое пятно: когда одна модель и пишет, и проверяет
Четыре починки одной ошибки — и один тест, который поймал её с первого прогона.
Ключевая мысль: слепое пятно самопроверки
Остановись на секунду и вспомни, когда ты последний раз просил ту же модель проверить код, который она только что написала. Кирилл делал так каждый день — пока не увидел историю из навыка ai-regression-testing.
Когда одна модель пишет код и сама его проверяет, она несёт одни и те же допущения в оба шага — это слепое пятно самопроверки. Схема отказа предсказуема: модель пишет починку → модель проверяет починку → «выглядит верно» → ошибка на месте.
Навык приводит наблюдавшийся в продакшене случай с одной и той же ошибкой:
- добавили поле
notification_settingsв ответ API — забыли добавить вSELECT; модель проверила и не заметила; - добавили в
SELECT— упала сборка TypeScript: колонки нет в сгенерированных типах; - заменили на
SELECT *— починили продакшен-путь, забыли песочницу; модель снова пропустила — четвёртый раз одна и та же ошибка; - тест поймал её с первого прогона.
Отсюда правило навыка: пиши тесты для найденных ошибок, а не для кода, который работает. И вторая находка: главная регрессия, которую вносит ИИ, — расхождение путей «песочница / продакшен»: починили один путь, забыли другой.
Чтобы тесты были быстрыми, навык использует режим песочницы без базы данных: в setup.ts выставляется SANDBOX_MODE = "true", ключи базы пустые, а помощник createTestRequest собирает запрос к API-маршруту Next.js напрямую. Регрессионный тест тогда проверяет контракт — список обязательных полей ответа, включая то самое notification_settings, — и отдельно паритет песочницы и продакшена.
Кирилл теперь спрашивает себя после каждой правки: «кто проверил — та же модель или тест?» Если та же модель — проверки не было.
Компромисс: тест на каждую найденную ошибку — это медленнее, чем «модель посмотрела, всё ок». Зато он ловит четвёртое повторение с первого прогона, а модель не поймала ни одного.
8. Серверные шаблоны: тонкий маршрут, сервис, репозиторий
backend-patterns и fastapi-patterns говорят одно и то же на двух языках: маршрут тонкий, логика в сервисе, данные за репозиторием.
Ключевая мысль: слой сервиса отдельно от маршрута
Агент Кирилла обращается к внутреннему API, и это API написан в спешке: вся логика внутри обработчиков маршрутов. Два навыка пакета — backend-patterns (Node.js, Express, Next.js) и fastapi-patterns (Python) — описывают одну и ту же структуру на разных языках.
Главная идея: слой сервиса живёт отдельно от маршрута, а доступ к данным — за репозиторием. Маршрут тонкий: принять запрос, проверить схему, вызвать сервис, отдать ответ. Сервис — бизнес-логика и транзакции. Репозиторий — абстракция над хранилищем с методами findAll, findById, create, update, delete.
Что ещё оба навыка называют:
- ресурсные URL —
GET /api/markets,GET /api/markets/:id, фильтры и пагинация через параметры запроса; - промежуточный слой (middleware) — авторизация, логирование, ограничение частоты как цепочка обработки запроса до маршрута;
- предотвращение N+1 — не запрашивать создателя для каждой записи в цикле, а собрать id и сделать один пакетный запрос;
- транзакция — несколько вставок в одной функции базы, откат при ошибке;
- выбирать только нужные колонки, а не
SELECT *.
FastAPI-навык добавляет свои конкретные артефакты: фабрика приложения с lifespan, настройки через pydantic-settings из .env, схемы Pydantic v2 с валидатором совпадения паролей, внедрение зависимостей (get_db, get_current_user), и жёсткий анти-паттерн: синхронный вызов базы в асинхронном маршруте блокирует цикл событий — используй асинхронное выполнение SQLAlchemy.
Кирилл переложил логику из обработчиков в сервис — и впервые смог протестировать её без HTTP вообще.
Компромисс: три слоя вместо одного — это больше файлов и косвенности для маленького сервиса. Зато логика тестируется без сети, а хранилище меняется без правки маршрутов.
9. django-tdd: красный, зелёный, фабрика
Цикл красный-зелёный-рефакторинг, быстрые настройки pytest и фабрики вместо ручных фикстур.
Ключевая мысль: цикл красный-зелёный-рефакторинг
У команды поддержки есть старый Django-сервис, и Кирилл хочет дать агенту его дорабатывать. Навык django-tdd задаёт ритм, в котором агент не убежит вперёд тестов.
Цикл красный-зелёный-рефакторинг — ядро навыка:
- красный — написать падающий тест (например,
test_user_creation: пользователь создан, пароль проверяется,is_staffвыключен); - зелёный — сделать минимум, чтобы тест прошёл;
- рефакторинг — улучшить, не выходя из зелёного.
Чтобы цикл крутился быстро, навык даёт конкретную настройку pytest.ini: --reuse-db (не пересоздавать базу на каждый прогон), --nomigrations (не гонять миграции), --cov=apps с отчётом покрытия и --strict-markers. Тестовые настройки — SQLite в памяти, отключённые миграции через класс DisableMigrations, быстрый хешер паролей MD5 только для тестов, консольный почтовый бэкенд, Celery в режиме немедленного выполнения.
Второй артефакт — фабрики factory_boy вместо ручных фикстур: UserFactory с Sequence для уникальных email, Faker для имён, SubFactory для связей (ProductFactory сам создаёт категорию и автора), LazyAttribute для производных полей, fuzzy для чисел в диапазоне. В conftest.py — фикстуры user, admin_user, authenticated_client, api_client для Django REST Framework.
Кирилл собрал команду pytest --reuse-db --nomigrations --cov=apps — прогон стал занимать секунды, и красный тест перестал быть наказанием.
Компромисс: быстрые тестовые настройки отличаются от продакшена (SQLite вместо Postgres, MD5 вместо настоящего хеша) — некоторые ошибки они не поймают. Зато цикл крутится десятки раз в час, а не два раза в день.
10. docker-patterns: многоступенчатый образ и что в него не класть
Четыре стадии одного Dockerfile, сервисы по именам — и ни одного секрета в слоях образа.
Ключевая мысль: многоступенчатая сборка образа
Пора упаковать агента Кирилла в контейнер. Навык docker-patterns начинает с вопроса, на который ты сейчас ответишь сам: сколько стадий должно быть в Dockerfile, чтобы разработчик получил горячую перезагрузку, а продакшен — минимальный образ без инструментов разработки? Одна? Две? Запомни ответ.
Ответ навыка — многоступенчатая сборка образа из четырёх стадий:
deps—npm ciпо lock-файлу;dev— зависимости изdeps, исходники,npm run devс горячей перезагрузкой;build—npm run build && npm prune --production;production— отдельный пользовательappuser, толькоdistи продакшен-зависимости,HEALTHCHECK,node dist/server.js.
Compose для локальной разработки берёт target: dev, а docker-compose.prod.yml — target: production с лимитами ресурсов. Сервисы в одной сети находят друг друга по имени: postgres://…@db:5432, redis://redis:6379; depends_on с condition: service_healthy ждёт, пока база ответит на pg_isready.
Три типа томов, которые навык просит различать: именованный (pgdata — переживает перезапуск), привязанный (.:/app — исходники для горячей перезагрузки) и анонимный (/app/node_modules — защищает зависимости контейнера от перекрытия хостом).
Безопасность — короткий список, который Кирилл повесил над столом:
- конкретные теги, никогда
:latest; - запуск не от root;
cap_drop: ALL,read_only: true,no-new-privileges;- секретов в слоях образа нет — только переменные окружения из
.env(в git не попадает) или Docker secrets;ENV API_KEY=sk-…в Dockerfile — прямой анти-паттерн.
Сверь свой ответ: если ты сказал «две», ты потерял либо горячую перезагрузку, либо минимальный образ; четыре стадии дают оба.
Компромисс: четыре стадии — длиннее Dockerfile и дольше первая сборка. Зато продакшен-образ не содержит ни инструментов разработки, ни исходников, ни секретов.
11. e2e-testing и browser-qa: плавающий тест и четыре фазы проверки
Почему тест проходит через раз, как это доказать десятью повторами и что проверять в браузере после выкатки.
Ключевая мысль: плавающий тест
Тест поиска у Кирилла проходит на ноутбуке и падает в CI через раз. Вопрос без простого ответа, с которого начинается навык e2e-testing: это тест плохой или код плохой? Кирилл три дня чинил код — а виноват был тест. Ответ навыка — сначала докажи, что тест плавающий, потом ищи причину.
Плавающий тест — тест, исход которого зависит не от кода, а от времени: гонки, сеть, анимации. Навык даёт три инструмента:
- доказать плавание —
npx playwright test tests/search.spec.ts --repeat-each=10: если из десяти прогонов падают два, это плавание, а не регрессия; - карантин —
test.fixme(true, 'Flaky - Issue #123')илиtest.skipв CI с номером задачи, чтобы падение не блокировало остальных, но и не забылось; - три типовые причины и починки: гонка — не
page.click(...), а локатор с автоожиданиемpage.locator(...).click(); сеть — неwaitForTimeout(5000), аwaitForResponseпо конкретному запросу; анимация — дождатьсяstate: 'visible'иnetworkidleперед кликом.
Вокруг — структура набора: Page Object Model (класс страницы с локаторами по data-testid и методами goto, search), конфигурация с retries: 2 только в CI, trace: 'on-first-retry', скриншот только при падении, четыре проекта браузеров; артефакты — скриншоты, трассы, видео.
Навык browser-qa берёт ту же автоматизацию браузера и превращает её в проверку после выкатки в четыре фазы: дымовая (ошибки консоли, нет 4xx/5xx, Core Web Vitals: LCP < 2,5 с, CLS < 0,1, INP < 200 мс), взаимодействие (все ссылки навигации, формы с верными и неверными данными, вход → защищённая страница → выход), визуальная регрессия (три ширины: 375, 768, 1440; сдвиги больше 5 px), доступность (axe-core, нарушения WCAG AA, клавиатурная навигация). Итог — отчёт с вердиктом вроде «SHIP WITH FIXES (2 issues, 0 blockers)».
Компромисс: десять повторов и трассы стоят минут машинного времени, а карантин с номером задачи требует дисциплины вернуться. Зато плавающий тест перестаёт маскироваться под регрессию — и наоборот.
12. Оставь след: ADR и осмысленные коммиты
Запись решения рядом с кодом — не примечание на полях, а то, без чего через полгода никто не вспомнит «почему».
Ключевая мысль: запись решения рядом с кодом
Через полгода новый разработчик спросит Кирилла: «почему у агента память в JSON-файле, а не в базе?» Кирилл вспомнит спор в чате, но не аргументы. Два навыка пакета существуют ради этого вопроса — и то, что часто считают примечанием на полях, здесь ядро материала.
Навык architecture-decision-records: запись решения живёт рядом с кодом, в docs/adr/NNNN-название.md, по лёгкому формату Найгарда:
- Контекст — какая проблема и какие силы действуют (2–5 предложений);
- Решение — что делаем (1–3 предложения);
- Рассмотренные альтернативы — у каждой плюсы, минусы и «почему нет»;
- Последствия — что стало проще, что сложнее, риски.
Навык сам замечает момент решения по сигналам вроде «давай возьмём X», «мы решили…», «компромисс того стоит, потому что…» — но никогда не создаёт файлы без явного согласия: сначала показывает черновик, пишет только после одобрения, ведёт индекс в docs/adr/README.md. Что делает ADR хорошим: конкретика («взять Prisma», а не «взять ORM»), записанное „почему“ важнее „что“, честные последствия, краткость.
Навык git-workflow закрывает второй след — историю коммитов. Формат Conventional Commits: <тип>(<область>): <тема>, где тип — feat, fix, docs, refactor, test, chore, perf, ci, revert; тело объясняет «почему», а не «что». Три стратегии веток с таблицей выбора: GitHub Flow для непрерывной выкатки, trunk-based для команд с сильным CI и флагами фич, GitFlow для релизов по расписанию. И правило, которое Кирилл однажды нарушил: никогда не делай rebase ветки, которую уже отправили в общий репозиторий или на которую опираются другие — rebase переписывает историю и ломает чужую работу; для общих веток — revert.
Компромисс: ADR и осмысленные коммиты — это минуты на каждое решение, которые кажутся лишними в моменте. Зато «почему» переживает и чат, и память автора.
13. После выкатки: канарейка, инцидент и кнопка «стоп»
Выкатить — половина дела; вторая половина — смотреть, что стало, и уметь заморозить раскатку.
Ключевая мысль: наблюдение после выкатки
Агент Кирилла ушёл в продакшен в пятницу вечером. Кирилл уже закрыл ноутбук — и здесь его история заканчивается, а твоя начинается. Теперь ты на его месте: решения принимать тебе, а два навыка пакета — твои приборы.
canary-watch — наблюдение после выкатки. Он следит за развёрнутым адресом по восьми проверкам: статус HTTP, новые ошибки консоли, отказы сети, регрессия производительности относительно базы (LCP/CLS/INP), исчезновение ключевых элементов (h1, навигация, кнопка действия), здоровье критичных API в пределах SLA, статические ресурсы с ожидаемыми типами содержимого, SSE-потоки с первым событием или сердцебиением. Три режима:
- быстрая проверка — один проход:
/canary-watch https://myapp.com; - длительное наблюдение —
--interval 5m --duration 2hна окно запуска; - сравнение —
--compare https://staging… https://prod….
Пороги разложены по уровням: критично (статус не 200, больше 5 новых ошибок консоли, LCP > 4 с, 5xx от API, отвалившийся SSE), предупреждение (LCP вырос больше чем на 500 мс, CLS > 0,1, время ответа вдвое выше базы), информация (мелкий разброс, новые сторонние запросы). Критичный порог — уведомление на рабочий стол, по желанию Slack/Discord, лог в ~/.claude/canary-watch.log. Навык советует ставить его хуком на git push и парой к browser-qa до выкатки.
enterprise-agent-ops — что делать, когда наблюдение показало всплеск. Четыре домена: жизненный цикл (старт, пауза, стоп, рестарт), наблюдаемость (логи, метрики, трассы), предохранители (области, права, кнопки «стоп»), управление изменениями (раскатка, откат, аудит). Базовые контроли: неизменяемые артефакты, минимальные права, секреты через окружение, жёсткие бюджеты таймаутов и повторов, аудит опасных действий. Метрики — не только доля успеха, но и среднее число повторов, время восстановления, стоимость успешной задачи и распределение классов отказов.
Паттерн инцидента, шесть шагов и первый — не «чинить»: заморозить новую раскатку → собрать представительные трассы → изолировать падающий маршрут → починить наименьшим безопасным изменением → прогнать регрессию и проверки безопасности → возобновлять постепенно.
Компромисс: длительное наблюдение и аудит — это шум уведомлений и затраты на инфраструктуру мониторинга. Зато «выкатили и ушли» превращается в «выкатили, увидели, заморозили до ущерба».
Частые вопросы
- Как поставить пакет и как выбрать только нужные навыки?
Весь пакет: dz install @dzhechkov/skills-ecc. Точечно: dz init --target claude-code --select docker-patterns,autonomous-loops — через запятую любые имена из списка двадцати. Страница пакета: npmjs.com/package/@dzhechkov/skills-ecc.
- Что значит trust_tier: 0 в шапке каждого навыка?
«Community (imported from ECC)» — материал привезён из внешнего проекта ECC (github.com/affaan-m/ECC, лицензия MIT) командой dz import-ecc, а не написан автором харнеса. Это честная пометка происхождения, а не оценка качества: читай навык критически и сверяй с своим стеком.
- Как узнать, на какие фразы откликается навык?
dz info <skill-id> показывает шапку SKILL.md с триггерами и ресурсами. Если автоактивация не сработала, назови навык по имени — это нормальный путь, а не обход.
- В курсе тринадцать секций, а навыков двадцать. Что осталось за кадром?
Три навыка вне сюжета Кирилла: brand-voice (профиль стиля письма из реальных постов и документов, с жёсткими запретами на штампы), data-scraper-agent (сборщик публичных данных по расписанию: собрать → обогатить бесплатной LLM → сохранить в Notion/Sheets/Supabase, на GitHub Actions) и flutter-dart-code-review (чек-лист ревью Flutter/Dart из пятнадцати разделов, независимый от библиотеки состояния). Они ставятся тем же пакетом.
- autonomous-loops и continuous-agent-loop — это один навык или два?
Два, с разделением ролей: continuous-agent-loop — парадная дверь, выбирает форму петли и составляет её из навыков харнеса; autonomous-loops — глубокие паттерны одной петли (шесть форм, De-Sloppify, DAG по RFC). В шапке autonomous-loops записано, что каноническое имя теперь continuous-agent-loop, а старое оставлено на один выпуск ради совместимости.
- Навык agent-eval требует одноимённый инструмент. Он в пакете?
Нет. В навыке прямо сказано: установить agent-eval из его репозитория после просмотра исходников (github.com/joaquinhuigomez/agent-eval). Пакет даёт методику — YAML-задачи, worktree-изоляцию, метрики и судей — а инструмент ставится отдельно.
- Можно привезти из ECC больше навыков, чем эти двадцать?
Да: dz import-ecc --limit 50 импортирует до пятидесяти навыков с приведением шапки к формату agentskills.io. Каждый привезённый получит тот же trust_tier: 0.