Начни здесь

Семнадцать развилок: навыки ai-apps для проектировщика агентов

Практический курс по @dzhechkov/skills-book-ai-apps — пакету из 17 навыков моментов решения, машинно выделенных из книги про проектирование AI-агентов. Вместе с Тимуром, которому продакт принёс задачу «давайте сделаем агента», ты поставишь пакет и проверишь регистрацию, поймёшь, как навык находится по описанию задачи, пройдёшь лестницу «нужен ли агент», цепочку проектирования с нуля, лечение промахов по инструментам, три навыка оценки, лестницу выкатки, дрейф и RCA в проде, загрузишь 223 единицы знания в свой brain, посчитаешь цену пакета на Copilot и научишься отличать, что в нём доказано гейтом, а что надо сверить со страницей.

Знакомься: Тимур

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

Содержание курса

1. Что это за пакет и зачем он тебе

Семнадцать навыков моментов решения из одной книги — не конспект, а подсказка на развилке проектирования.

Ключевая мысль: навыки моментов решения

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

Пакет @dzhechkov/skills-book-ai-apps существует ровно для этого момента. Это 17 навыков моментов решения. Навык (skill) — инструкция для AI-ассистента, которая подгружается, когда твоя задача попадает под её описание. А «момент решения» — конкретная развилка проектирования: «нужен ли агент вообще», «один агент или несколько», «можно ли выкатывать эту версию». Каждый навык включается на своей развилке и даёт критерии, таблицы компромиссов, факты с привязкой к странице и антипаттерны.

Откуда навыки взялись: их машинно выделили из книги Майкла Альбады «Building Applications with AI Agents» (русский перевод) конвейером book-knowledge-digitizer. Важно понимать, ЧТО именно лежит в пакете:

  • не текст книги — она остаётся у правообладателей, исходный корпус не распространяется;
  • а единицы знания (Knowledge Units, KU) — собственные переформулировки методики с привязкой к странице, и навыки, построенные на них;
  • граница проверяется механически: гейт на совпадения нашёл 0 нецитированных дословных отрывков длиной от 8 слов против исходника.

Что это меняет для Тимура: вместо «прочитай 350 страниц и вспомни нужное в среду» ассистент сам применяет методику книги в тот момент, когда Тимур описывает задачу.

Компромисс: ты получаешь методику в точке решения, но не саму книгу — за формулой или примером кода всё равно придётся сходить в источник. И пакет честно помечен trust_tier: 1: машинная выжимка, не выверенная человеком по каждой цитируемой странице (об этом — последняя секция).

💬 Просто попроси. Ассистенту не надо называть имя навыка. Тимур написал: «нам нужен агент для обработки заявок в поддержку, или хватит детерминированного конвейера?» — и нужный навык включился сам. Как именно это происходит — в четвёртой секции.

2. Установка и проверка, что навыки действительно зарегистрировались

Одна команда dz install по имени пакета, явная двухшаговая форма и живая проверка регистрации.

Ключевая мысль: dz install ставит пакет по имени

Хватит вводных — Тимур открыл терминал, открывай и ты.

Пакет опубликован на npm: страница @dzhechkov/skills-book-ai-apps на npmjs.com; исходники лежат в публичном зеркале на GitHub. Ставь версию 0.2.9 или новее: у 0.2.1 и 0.2.2 подпись не совпадает с содержимым README (они помечены как устаревшие), содержимое навыков при этом никогда не было под вопросом.

Самый короткий путь — одна команда, где dz install ставит пакет по имени:

  1. dz install @dzhechkov/skills-book-ai-apps --target claude-code — dz сам скачает пакет с npm и разложит навыки под платформу.

Хочешь видеть каждый шаг — явная двухшаговая форма (измерено при установке из архива в чистый проект, вывод ниже — дословный):

  1. npm install @dzhechkov/skills-book-ai-apps --save-dev — пакет приезжает в node_modules.
  2. dz init --target claude-code --skills-dir node_modules/@dzhechkov/skills-book-ai-apps --project . → 17 skill(s), 51 file(s) written, 0 skipped.

Дальше — проверка, что навыки зарегистрировались, а не просто легли на диск. Это два разных уровня:

  • dz verify --skills-dir node_modules/@dzhechkov/skills-book-ai-apps --target claude-code → 17/17 skill(s) valid — структурная проверка файлов (уровень L1);
  • dz skills-verify --dir . --expect <17 идентификаторов> --strict → PASS — all 17 expected skill(s) are registered — запускает живую сессию и читает её список навыков (уровень L2). Файл на диске ещё не значит, что ассистент его видит.

Грабли Тимура — не повторяй: он сначала подал dz install путь к архиву .tgz. Команда принимает имя npm-пакета и ищет его в node_modules/<имя>; на путь она падает с ошибкой package not found (код выхода 1).

Компромисс: одна команда dz install быстрее, но прячет два шага; двухшаговая форма длиннее, зато ты видишь, что именно легло в проект и сколько файлов записано.

💬 Просто попроси. «Поставь пакет навыков ai-apps для Claude Code» → ассистент выполнит dz install; «проверь, что все 17 навыков зарегистрировались» → dz skills-verify --strict. Тимур команды не набирал — только читал их в ответах ассистента.

3. Карта семнадцати решений: навык владеет ровно одним

Две волны выделения, таблица «навык → решение → главы» и правило: каждый навык владеет одним решением и отсылает к соседям.

Ключевая мысль: навык владеет ровно одним решением

Тимур открыл README и увидел таблицу на 17 строк. Первая реакция — «я это не запомню». Не надо запоминать: надо понять один принцип, по которому таблица построена.

Принцип: навык владеет ровно одним решением. У каждого навыка есть описание-триггер, и в нём две половины: «ЧТО я решаю» и «чего я НЕ решаю — иди к соседу». Например, aiagents-single-vs-multi-agent решает, сколько агентов и как они координируются, но явно отказывается от транспорта и брокеров — это владение aiagents-multi-agent-infrastructure. Такие отказы — не занудство: они и есть причина, по которой два похожих навыка не перехватывают запросы друг у друга.

Навыки пришли двумя волнами (измерено по sources.json): 8 в первой, 9 во второй. Вторая волна закрыла все тематические кластеры, которые нашёл этап свёртки книги; третьей волны не будет — остались только 18 словарных KU, из которых навык не вырастает.

Как читать карту — по группам решений:

  1. Ещё до кода: нужен ли агент и какая модель (agent-fit-and-model-choice), один агент или несколько (single-vs-multi-agent).
  2. Форма и начинка: архетип управления и топология (orchestration-and-planning), транспорт и брокер под готовую форму (multi-agent-infrastructure), контракт инструментов и их выбор (tool-design-and-selection), знания против памяти (knowledge-and-memory), что попадает в окно ЭТОГО вызова (context-engineering), нужно ли обучение и какого класса (learning-strategy).
  3. Проверка и выпуск: построить оценку (evaluation-design), тестировать недетерминированный слой (probabilistic-behaviour-checks), можно ли выкатывать и сколько трафика (release-gates-and-rollout).
  4. Эксплуатация: телеметрия и дрейф (observability-and-drift), цикл улучшений после релиза (improvement-loops), уровень автономии и эскалация к человеку (human-in-the-loop).
  5. Люди и компания: поверхность взаимодействия (agent-ux), полномочия и аудит внутри организации (org-adoption-and-governance), защита (agent-security).

Каждый навык внутри устроен одинаково: выход, когда применять и когда нет, критерии решения с номерами KU, ключевые факты и формулы, антипаттерны, смежные решения, источник, самопроверка, примеры. Открой любой SKILL.md — и ты уже знаешь, где что искать.

Компромисс: узкое владение делает навыки предсказуемыми, но реальная задача Тимура почти всегда цепляет два-три навыка подряд — цепочки передач между ними разберём в шестой секции.

💬 Просто попроси. «Что решает навык про наблюдаемость и чего он не решает?» → ассистент прочитает описание aiagents-observability-and-drift и перескажет обе половины. Тимур так прошёлся по всем семнадцати за один вечер.

4. Как срабатывает нужный навык: маршрутизация по описанию задачи

Почему не надо называть идентификаторы: гейт маршрутизации, 97,7 % срабатываний и 1,8 % перехвата между соседями.

Ключевая мысль: маршрутизация по описанию задачи

Тимур ждал, что придётся писать что-то вроде «/aiagents-agent-fit-and-model-choice». Не пришлось. Он описал задачу обычными словами — и навык включился сам. Это и есть маршрутизация по описанию задачи: ассистент сравнивает твою фразу с описаниями-триггерами всех установленных навыков и подгружает подходящий.

Насколько это надёжно — измерено, а не обещано. Гейт маршрутизации (в пакете он называется CP3.5) на полном каталоге из 17 навыков показал:

  • 97,7 % срабатываний — 216 из 221 положительных запросов подняли нужный навык;
  • 1,8 % перехвата — доля случаев, когда вместо нужного навыка сработал сосед;
  • 0 из 152 нарушений на «жёстких отрицательных» запросах — фразах, на которые ни один навык срабатывать не должен;
  • пороги гейта: не меньше 80 % срабатываний и не больше 10 % перехвата.

И отдельная проверка на регрессию: после добавления девяти навыков второй волны все 104 из 104 запросов первой волны по-прежнему уходят в свой навык. Соседи не украли ничего у первых восьми.

Отсюда практическое правило:

  1. Опиши задачу так, как рассказал бы коллеге: «у агента 30 инструментов, он стал вызывать не те — делить на агентов или чинить выбор?».
  2. Фраза «используй нужные скиллы из набора ai-apps для решения задачи: …» тоже работает, но нужна редко — описания уже несут триггеры.
  3. Если хочешь поставить один навык под одно решение: dz init --target claude-code --select aiagents-agent-security.

Что гейт доказывает, а что нет — ключевая честность пакета. Он доказывает, что навыки *срабатывают на правильных запросах*. Он НЕ доказывает, что каждое число внутри навыка верно; за это отвечает отдельная проверка KU (о ней — в последней секции).

Компромисс: маршрутизация по описанию избавляет от заучивания имён, но 2,3 % запросов навык всё же пропустил — если ассистент явно не применил методику, назови навык по имени.

💬 Просто попроси. Именно так: попроси. Тимур за всю неделю ни разу не написал идентификатор навыка — он писал задачи.

5. «Нужен ли нам агент?» — лестница из четырёх ступеней

Первый навык в деле: лестница простой код → рабочий поток → чат-бот/RAG → агент и пять вопросов на воротах.

Ключевая мысль: лестница из четырёх ступеней

Вернёмся к понедельнику. Продакт сказал «сделаем агента», и Тимур описал задачу ассистенту. Сработал aiagents-agent-fit-and-model-choice — и первое, что он сделал, это НЕ согласился с постановкой. Он предложил лестницу из четырёх ступеней и правило: поднимайся только настолько, насколько заставляет задача.

Прежде чем читать дальше, реши за Тимура сам. Заявки в поддержку приходят свободным текстом на почту; в ответ надо понять намерение, найти ответ в базе знаний, написать черновик и при необходимости передать человеку. Какая ступень? Запомни ответ — сейчас сверим.

Ступени, снизу вверх:

  1. Простой код — когда ввод полностью предсказуем и каждый исход описывается заранее, нужна миллисекундная задержка или жёстко регулируемая область. Навык хранит формулировку книги с её силой: при таких условиях обычный код «почти всегда лучше фундаментальной модели» — почти, не всегда.
  2. Детерминированный рабочий поток — логика укладывается в конечную последовательность шагов и ветвлений, и ты заранее знаешь, где вмешивается человек. Пример из навыка: счета в трёх известных форматах, разводимые по парсерам.
  3. Чат-бот / RAG — нужны ответы на вопросы по базе знаний. Жёсткий потолок: RAG находит, но не решает о дальнейших действиях — не заводит тикет, не назначает звонок.
  4. Автономный агент — ввод нельзя описать заранее, план строится в несколько шагов и перестраивается по промежуточным итогам, или система должна улучшаться по обратной связи.

Четыре фактора, которые двигают выбор: изменчивость ввода, сложность рассуждения, ограничения по производительности и соответствию, бремя сопровождения. Числовых порогов навык не даёт и честно об этом пишет — критерии качественные.

А на воротах перед четвёртой ступенью стоят пять вопросов, на которые надо ответить письменно: ввод неструктурирован? нужно многошаговое планирование с перестройкой? хватит ли пользователям выдачи документов, или система обязана сама решать и действовать? должна ли она улучшаться почти без людей? готовы ли вы мириться с задержкой и стоимостью модели? Третий вопрос разделяет RAG и агента; пятый — тот, который команды пропускают и за который платят потом.

Сверь свой выбор. Тимур получил четвёртую ступень — но не потому что «продакт так сказал», а потому что ввод свободный, а система обязана действовать (черновик, эскалация). Если ты выбрал третью — посмотри на третий вопрос ворот: одной выдачи документов здесь недостаточно.

Компромисс: лестница экономит месяцы на переусложнённой системе, но требует честно ответить на пять вопросов — а ответ «нет» на четвёртой ступени иногда неприятен продакту.

💬 Просто попроси. «Нам нужен агент для X, или хватит детерминированного конвейера?» — этой фразы достаточно, чтобы навык провёл тебя по лестнице и воротам.

6. Проектирование с нуля: цепочка передач между навыками

Инструменты → знания и память → один или несколько агентов; форма потока → его инфраструктура. Каждый навык передаёт следующему своё ограничение.

Ключевая мысль: цепочка передач между навыками

Агент одобрен. Теперь Тимур должен выбрать инструменты, память и топологию — и сделать это до того, как архитектура застынет. Здесь впервые проявляется главная особенность пакета: одна реальная задача — это цепочка передач между навыками, и порядок в ней не случаен. Каждый навык, закончив, передаёт следующему ограничение, которое сам наложил.

Сценарий из README «спроектировать агента с нуля» проходит так:

  1. aiagents-tool-design-and-selection — контракт инструмента: имя и описание (то, что модель реально читает), строгие схемы входа и выхода, контракт ошибок, наименьшие привилегии для инструментов с состоянием, локальный / API / MCP-тип, режим выбора инструмента на вызов, лестница выбора «стандартный → семантический → иерархический». Передаёт дальше: сколько инструментов и как они сгруппированы.
  2. aiagents-knowledge-and-memory — знания (RAG) против памяти (собственная история агента), деление на краткосрочную и долгосрочную, какое хранилище получает каждый слой, и как далеко подниматься по лестнице от скользящего окна до графа знаний. Передаёт дальше: какие хранилища и какой объём координации они требуют.
  3. aiagents-single-vs-multi-agent — порог перехода, цена перехода (координация, коммуникация, токены, конфликты), шесть принципов добавления агента и тест бережливости, схема координации.

Есть и вторая цепочка — для потока, который перерос свою форму (сценарий 7 в README):

  • aiagents-orchestration-and-planning сначала решает форму: архетип (рефлекс, ReAct, планировщик-исполнитель, декомпозиция, рефлексия перед необратимыми операциями), режим исполнения (один вызов, параллель, цепочка, граф) и пределы глубины;
  • aiagents-multi-agent-infrastructure берёт форму как данность и подбирает несущее: транспорт (внутрипроцессные вызовы → протокол A2A → брокер), сам брокер, среду исполнения (монолит, шина, акторы, движок рабочих потоков), где живёт общее состояние.

Ключевое: ни один навык не пересматривает решение соседа. Инфраструктурный навык не спорит о форме; навык памяти не спорит о контракте инструментов. Именно поэтому порядок важен: перепутай — и следующему навыку нечего принимать на вход.

Компромисс: цепочка даёт согласованную архитектуру, но требует пройти три-пять навыков подряд, а не один; попытка «спросить всё сразу» размывает ограничения, которые навыки передают друг другу.

💬 Просто попроси. «Проектирую агента для анализа логов: какие инструменты дать, как он их выберет, нужна ли память, когда это станет мультиагенткой?» — одна фраза, и Тимур получил цепочку из трёх навыков в правильном порядке.

7. «Агент стал выбирать не те инструменты» — дешёвое лечение раньше дорогого

Лестница выбора инструмента стандартный → семантический → иерархический, тест бережливости и цена второго агента.

Ключевая мысль: дешёвое лечение раньше дорогого

Через месяц агент Тимура вырос: 30 инструментов. И стал промахиваться — вызывать возврат вместо отмены, искать не там. Коллега предложил очевидное: «разделим на несколько агентов». Тимур описал ситуацию ассистенту — и получил два навыка, которые вместе держат одно правило: дешёвое лечение раньше дорогого.

Открытый вопрос, на который нет одного ответа, — зато есть порядок проверки. Что ты сделал бы первым: разделил на агентов, переписал описания инструментов или включил семантический выбор? Подумай, потом читай.

Сначала aiagents-tool-design-and-selection исчерпывает лестницу ВНУТРИ одного агента:

  1. Стандартный выбор — все описания идут модели, она выбирает. Просто, без инфраструктуры; плохо масштабируется, когда инструментов много.
  2. Семантический выбор — описания инструментов превращаются в векторы и индексируются; поиск сужает кандидатов, модель делает финальный выбор. Навык называет это самым распространённым образцом и рекомендует для большинства сценариев; цена — похожие описания сталкиваются.
  3. Иерархический выбор — инструменты сгруппированы, сначала выбирается группа, потом инструмент внутри. Точность куплена задержкой и трудом на поддержание групп; держи для действительно большого набора.

Числового порога «мало / много» навык не даёт — границу ты находишь опытным путём, и навык говорит об этом прямо.

Только если лестница исчерпана, слово берёт aiagents-single-vs-multi-agent — и первым делом применяет тест бережливости к рефлексу «добавим агента»: проверь, не берут ли эту задачу уже существующие узлы, напрямую или после расширения. Причина названа: неоправданный рост числа агентов усложняет сопровождение и создаёт узкие места. Три системных цены перехода — сложность координации, стоимость коммуникации и расход токенов, конфликты между агентами — ты платишь всегда, а не «если не повезёт».

Что Тимур сделал. Переписал описания (модель читает именно их), включил семантический выбор — промахи ушли. Второй агент не понадобился. Если ты выбрал «разделить» — не ошибка, а дорогой путь: ты заплатил бы координацией за то, что лечится индексом описаний.

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

💬 Просто попроси. «У агента 30 инструментов, он стал вызывать не те. Делить на агентов или чинить выбор?» — оба навыка включаются в правильном порядке.

8. Оценка, недетерминизм, выпуск: три навыка оценки с разными границами

Построить прибор, проверить вероятностный слой, решить о выкатке — три вопроса, три владельца, и правило триажа 3–5 повторов.

Ключевая мысль: три навыка оценки с разными границами

«Как оценивать нашего агента?» — спросил Тимур, когда текущая «оценка» состояла из того, что кто-то прокликивал три промпта. Ответ пакета оказался неожиданным: это не один вопрос, а три, и у каждого свой навык. Три навыка оценки с разными границами — и каждый явно отказывается от чужой работы.

1. Построить прибор — aiagents-evaluation-design. Метрики выводятся из измеримых целей (количественные, качественные, семантическая близость). Оценочный набор — живая спецификация, а не одноразовый файл. Каждый кейс имеет форму «состояние на входе + диалог + ожидаемое конечное состояние»: список ожидаемых вызовов инструментов с параметрами и фразы, которые обязан содержать финальный ответ. Планировщик оценивается тремя числами: полнота по инструментам (не потерял ли вызовы), точность по инструментам (не добавил ли лишних), точность параметров. Навык честно указывает ограничения этих формул: метрики над множеством имён, порядок вызовов не оценивается, параметры сравниваются строгим равенством.

2. Проверить вероятностный слой — aiagents-probabilistic-behaviour-checks. Там, где один и тот же ввод законно даёт разный вывод, сравнивать байты бессмысленно. Вместо этого — инварианты поведения (обязательный шаг, который агент делает при любой формулировке), связность длинного диалога (без самопротиворечий и ухода от темы), устойчивость к неожиданному вводу с критерием «уточни — деградируй — эскалируй», а не «упади или выдумай». И правило триажа: неудачный результат перезапускается три-пять раз; частота сбоев выше 80 % — систематическая ошибка, иначе — законный разброс. Навык отмечает, какие из порогов книга вводит словом «например» — их калибруй на своих данных.

3. Решить о выпуске — aiagents-release-gates-and-rollout. Может ли эта версия вообще выкатываться и сколько живого трафика ей дать — следующая секция целиком об этом.

А живой дрейф в проде — четвёртый владелец, aiagents-observability-and-drift (секция 10). Навык оценки прямо перечисляет, кому что отдаёт: гейты и канарейку — выпуску, дрейф — наблюдаемости, недетерминизм — вероятностным проверкам.

Компромисс: три навыка вместо одного — это три границы, которые надо помнить; зато «оценка на глазок» становится невозможной: у каждого вопроса есть владелец с критериями.

💬 Просто попроси. «Нужны метрики, оценочный набор и способ понять, что планировщик выбрал не тот инструмент» — этого достаточно, чтобы включился первый навык и назвал двух других.

9. Выкатка: лестница выкатки от staging до канарейки

Гейт готовности, теневой режим, канарейка на 1–5 % с меткой версии, A/B и путь отката — по возрастанию доли живых пользователей.

Ключевая мысль: лестница выкатки от staging до канарейки

Новая версия агента Тимура — переписанный промпт и новый инструмент — прошла оценку локально. Продакт спрашивает: «выкатываем?». «Выглядело нормально в трёх ручных прогонах» — не решение о выпуске, и aiagents-release-gates-and-rollout начинает с этого.

Сначала гейт готовности. Готовность — целостная оценка, что система будет работать безопасно и стабильно в реальной среде; прохождение тестов — не то же самое. Гейт — автоматическая или человеческая проверка, которая блокирует продвижение, когда требование не выполнено: регрессия на оценочном наборе, отсутствие явного одобрения после пилота. Навык различает две формы гейта: закрывающийся (требование не выполнено → стоп) и эскалирующий (результат неоднозначен → решает человек). Число из примера книги — «не меньше 95 % полноты выбора инструмента на потоках возврата и отмены» — навык приводит как один возможный критерий для одного агента, а не как всеобщую планку; свою цифру бери из прибора, который построил aiagents-evaluation-design.

Потом — механизм выдачи трафика. Тимур ждал единой инструкции; навык честен: книга упорядочивает только первый шаг («процесс часто начинается со staging / RC»), остальные механизмы перечисляет рядом, не ранжируя. Поэтому лестница выкатки от staging до канарейки ниже — это порядок по доле живых пользователей, которые видят результат, а не закон из книги:

  1. Staging / RC — изолированная копия прода; пользователей ноль. Предел: контролируемая среда скрывает, как ведут себя реальные люди.
  2. Теневой режим — новая версия работает параллельно на живом вводе, её вывод пишется в журнал и никогда не доходит до пользователя. Предел: не даёт сигнала о реакции человека; тонкий сдвиг характера взаимодействия тень не увидит — за ним книга отправляет к A/B.
  3. Канарейка — новая версия открыта малой доле реальных пользователей, в книге это 1–5 % трафика, с меткой версии, без которой сравнение «канарейка против базы» невозможно. Откат немедленный и дешёвый.
  4. A/B на живом трафике — 50/50 между контролем и вариантом с четырьмя условиями постановки и ловушкой долгоживущего состояния агента (или адаптивный байесовский бандит).
  5. Полная выкатка — сине-зелёная, поэтапная или пилотное расширение; и заранее написанный путь отката.

Что бы канарейка ни подняла, это уходит в aiagents-improvement-loops — секция 10.

Компромисс: каждая ступень лестницы покупает сигнал о реальных пользователях ценой риска для них; тень безопасна и слепа к реакции, канарейка видит реакцию и рискует пятью процентами.

💬 Просто попроси. «Готова новая версия. Можно ли её выкатывать, сколько трафика дать и что делать с тем, что вылезет на канарейке?» — навык проведёт по гейту и лестнице.

10. Прод: три теста дрейфа и четыре шага RCA

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

Ключевая мысль: три теста дрейфа и четыре шага RCA

Через два месяца после выкатки Тимур получил самый неприятный тикет: «агент стал хуже». Частота ошибок ровная, в логах ничего. Два навыка — aiagents-observability-and-drift и aiagents-improvement-loops — дают ему три теста дрейфа и четыре шага RCA.

Остановись и подумай о своём агенте: что ты сегодня измеряешь, кроме частоты ошибок? Если ответ «ничего» — эта секция про тебя.

Что мерить. Навык раскладывает метрики по уровням — инфраструктура, рабочий поток, качество вывода, обратная связь пользователей — и для каждой метрики называет действие, которое она обязана вызвать. Метрика без действия — это шум на дашборде.

Три теста дрейфа — и почему их нельзя сливать в один балл. Дрейф — это когда распределение того, что приходит агенту или выходит из него, уехало от исторической базы. Навык даёт три разных инструмента, и каждый отвечает на свой вопрос:

  1. Колмогоров — Смирнов — для непрерывных величин: длина запроса, задержка, числовые метрики.
  2. KL-дивергенция — для распределения токенов на входе: смена языка пользователей, новая терминология. Она несимметрична: KL(P‖Q) ≠ KL(Q‖P), где P — история, Q — текущие данные.
  3. PSI (индекс стабильности выборки) — для категорий и групп: доли категорий использования инструментов вроде «возврат / отмена / изменение».

Объединить три в один «балл дрейфа» — значит выбросить ровно ту информацию, которая говорит, ЧТО сдвинулось. И навык фиксирует две несогласованности источника, которые ты обязан знать до того, как вшить пороги: PSI в одной главе — триггер вмешательства при > 0,1, а в другой полоса 0,1–0,25 — «только наблюдать»; у KL — «< 0,2 — ожидаемое отклонение» и «> 0,5 — концептуальный сдвиг», а середина не определена. Выбери одно чтение сознательно и запиши, какое.

Четыре шага RCA. Обнаружение — не диагноз. Когда детектор поднял проблему, aiagents-improvement-loops ведёт по цепочке: трассировка рабочего потока (восстановить цепочку решений и вызовов) → локализация сбоя (какой компонент) → распознавание закономерностей (единичный случай или повторяющийся) → оценка последствий (частота и критичность). Выход RCA — список возможностей улучшения, а не виновный: сбои агентных систем часто вообще не технические — размытая постановка, изменившиеся ожидания пользователей.

Дальше — рычаги исправления (уточнение промпта с его гейтом проверки, автоматическая оптимизация промпта, доработка инструментов) и один общий бэклог, приоритизированный по пяти осям: частота, критичность, осуществимость, соответствие стратегии, риск повторения.

Компромисс: три теста и четыре шага дают диагноз вместо догадки, но требуют исторической базы — если ты не писал распределения с первого дня, сравнивать не с чем.

💬 Просто попроси. «Агент деградировал, ошибок в логах нет — что мониторить и как поймать дрейф?» — Тимур получил и уровни метрик, и три теста с их чтениями.

11. Не только поведение: единицы знания и dz brain

Три уровня поиска: references в пакете, срез 223 KU для твоего brain, корпус только у владельца — и ловушка dz recall --books.

Ключевая мысль: dz brain add загружает 223 KU в brain

В навыках Тимур постоянно встречал пометки вроде «KU: ch08-p193-ku08» и «см. источник». Куда они ведут? На этом месте пакет раскрывает вторую половину себя: 17 навыков — это поведение, а за ними стоят 223 единицы знания (KU) — это знание, и оно тоже приезжает с установкой.

Три уровня, на которых «см. источник» разрешается (пакет объявляет их честно в sources.json):

  1. references/ внутри пакета — всегда. Каждый навык везёт свои KU целиком в <навык>/references/knowledge-units.md; всего 207 ссылок по пакету, каждая с привязкой к странице и меткой проверки (190 «true», 17 «partial»). Работает на любой машине и любой платформе — файл уже лежит рядом.
  2. Brain — после одной команды. Brain — это твоё личное кросс-проектное хранилище знаний в ~/.dz/brain. Пакет везёт срез brain/ai-apps.sqlite — все 223 KU канона. Команда dz brain add --from-pack @dzhechkov/skills-book-ai-apps загружает срез к тебе: это идемпотентная вставка-обновление по ключу (книга, ku_id, версия корпуса), так что повторная установка заменяет, а не дублирует; векторы пересчитываются локально.
  3. Корпус страниц — только у владельца, в рабочем пространстве оцифровки. Не распространяется.

После загрузки Тимур спрашивает brain из ЛЮБОГО проекта, не только из того, где ставил пакет:

  • dz brain query "один агент или несколько" --source ai-apps → [ai-apps гл.2 с.57-208] (decision-framework) Один агент или несколько: критерии выбора и цена каждого варианта;
  • dz brain primer ai-apps — карточка возможностей: гистограмма типов KU и главные моменты решения;
  • dz brain ground "<вопрос>" — для размытых, естественных вопросов.

Грабли Тимура — не повторяй: он набрал dz recall --books --book ai-apps и получил 0 KU hit(s). Это проектное хранилище (.dz/memory/books.sqlite текущего проекта), а не brain; из свежей папки оно пусто, тогда как dz brain query из той же папки вернул хиты (измерено 2026-08-19). Кросс-проектные глаголы — dz brain query / ground / primer.

Второе ограничение: срез лексический — поиск по префиксам через И, без морфологии и синонимов. Длинный вопрос естественным языком может дать 0, а его ключевые слова — хиты. Размытые вопросы веди через dz brain ground.

Компромисс: brain делает знание книги доступным в любом проекте одной командой, но лексический поиск требует думать ключевыми словами; за точной страницей всё равно идёшь в references/.

💬 Просто попроси. «Загрузи знания из пакета ai-apps в мой brain» → dz brain add --from-pack …; «что книга говорит про выбор между одним и несколькими агентами?» → dz brain query.

12. Copilot и цена постоянно загруженных тел навыков

763 килобайта на каждый запрос: почему на платформе без ленивой загрузки пакет ставят выборочно, и откуда пять оценок B.

Ключевая мысль: цена постоянно загруженных тел навыков

Коллега Тимура работает в GitHub Copilot и попросил «поставь мне тот же пакет». Тимур почти сделал это — и вовремя открыл раздел README про Copilot. Там его ждал сюрприз с конкретной ценой.

На Copilot каждый файл инструкций загружается на каждый запрос. Нет ленивой подгрузки: всё, что установлено, резидентно всегда. Теперь размер. Семнадцать тел SKILL.md вместе весят 763 183 байта / 727 835 символов (измерено: cat aiagents-*/SKILL.md | wc -c; папки references/ на Copilot не загружаются и не считаются). При константе оцифровщика 2,1 символа на токен это оценка ≈ 347 тысяч токенов на запрос, если поставить все 17 — оценка из измеренного размера, а не измеренный счётчик токенов. Вторая волна примерно удвоила резидентную стоимость: у восьми тел версии 0.1.0 было 354 846 байт.

Это и есть цена постоянно загруженных тел навыков — и пакет её не прячет:

  • самое маленькое тело — 29 187 байт (aiagents-context-engineering), самое большое — 63 936 байт (aiagents-agent-security);
  • пять тел превышают порог харнеса в 50 000 байт на тело: безопасность, инфраструктура мультиагенток, наблюдаемость, петли улучшений, внедрение в организации;
  • и это ровно те же пять навыков, что получили оценку B в эталонном тесте dz benchmark: все 12 навыков с оценкой A набирают 18/20, все 5 с оценкой B — 17/20, разница в одной проверке. Размер тела — весь разрыв между этим пакетом и «сплошь A», и он показан открыто.

Отсюда правило: на Copilot ставь только навыки под текущую работу, не пакет целиком — --select <имя> из четвёртой секции. На Claude Code пакет целиком в порядке: резидентно только описание каждого навыка, тело подгружается при срабатывании.

Компромисс: тела не худые — в них таблицы, формулы и антипаттерны, за которые ты и ставишь пакет; платформа с ленивой загрузкой получает это бесплатно, платформа без неё платит токенами за каждый запрос.

💬 Просто попроси. «Поставь коллеге на Copilot только навык про безопасность агентов» → ассистент выполнит dz init --target copilot --select aiagents-agent-security и не притащит остальные 16 тел.

13. Насколько верить: уровень доверия trust_tier 1 и происхождение

Что доказано гейтами (маршрутизация, IP, верификация KU), что нет, и как Тимур пишет проектный документ с числами из пакета.

Ключевая мысль: уровень доверия trust_tier 1

Последняя секция — ты в роли Тимура, и решения принимаешь сам. Он пишет проектный документ и хочет вписать в него числа из навыков: «канарейка 1–5 %», «PSI > 0,1», «95 % полноты выбора инструмента». Можно ли? Ответ пакета — не «да» и не «нет», а уровень доверия trust_tier 1 и список того, что доказано, а что нет.

Что доказано измерением (гейты 2026-08-18/19, на содержимом версии 0.2.2; 0.2.9 везёт то же содержимое, гейты не перегонялись):

  1. Верификация KU. Канон из 223 KU проверен кросс-семейным судьёй (gpt-5.6-sol): 202 «true», 21 «partial», 0 «false». Копии в references/ по 207 ссылкам: 190 «true», 17 «partial». «Partial» означает, что страница поддерживает утверждение не полностью — и такие KU помечены, а не выброшены.
  2. IP / совпадения. Гейт по 8-словным окнам: 0 нецитированных дословных отрывков — и на сборке, и повторно перед самой публикацией на точных байтах, которые ушли на npm.
  3. Маршрутизация. 97,7 % срабатываний, 1,8 % перехвата, 0/152 на жёстких отрицательных.
  4. Эталонный тест и регистрация. dz benchmark: 89 % (301/340), 12 A / 5 B; dz verify 17/17; живая сессия — все 17 зарегистрированы.

Что НЕ доказано — и пакет говорит это первым предложением README: навыки машинно выделены и не проверены человеком по цитируемым страницам. Гейт маршрутизации доказывает, что навык срабатывает на нужном запросе, а не что каждое его число верно. Отсюда правило: сверяй со страницей, прежде чем полагаться на конкретное число.

Как выглядит честный навык изнутри — Тимур увидел это в трёх местах:

  • пороги, которые книга вводит словом «например» (оценка > 0,8, KL < 0,2), навык помечает как примеры для калибровки, а «3–5 повторов, > 80 %» — как утверждение без оговорки;
  • когда две страницы одной главы дают PSI два разных чтения, навык не сглаживает — он записывает обе и требует выбрать сознательно;
  • когда в примере книги номер заказа в ожидании не совпадает с номером в данных, навык пишет: «копируй форму, не это значение».

Что Тимур вписал в документ. «Канарейка 1–5 % [книга, с. 271-272]; порог 95 % — пример книги для её агента поддержки, наш порог — из нашего оценочного набора; PSI-порог: выбираем чтение 0,1–0,25 = наблюдать, записано здесь». Числа со страницей, примеры — как примеры, двоящиеся пороги — с выбором.

Компромисс: trust_tier 1 честно снижает силу каждого числа — зато ты точно знаешь, где граница между «измерено гейтом» и «сверь сам». Пакет — указатель на методику, не замена книге; хочешь текста — купи книгу.

💬 Просто попроси. «Из какой страницы это число и насколько ему можно верить?» — ассистент откроет references/knowledge-units.md навыка и покажет KU с меткой проверки.

Частые вопросы

Надо ли называть идентификатор навыка, чтобы он сработал?

Нет. Опиши задачу обычными словами — маршрутизация по описанию поднимет навык (97,7 % срабатываний, 1,8 % перехвата на полном каталоге из 17). Фраза «используй нужные скиллы из набора ai-apps» работает, но нужна редко.

Какую версию ставить?

0.2.9 или новее. У 0.2.1 и 0.2.2 подпись не совпадает с содержимым README (они помечены устаревшими); содержимое навыков при этом не менялось.

dz install принимает путь к .tgz?

Нет — только имя npm-пакета; на путь падает с package not found (код 1). Правильно: dz install @dzhechkov/skills-book-ai-apps --target claude-code.

Есть ли в пакете текст книги?

Нет. Только единицы знания (KU) — собственные переформулировки с привязкой к странице — и навыки на них. Гейт совпадений: 0 нецитированных дословных отрывков от 8 слов, перепроверен перед публикацией.

Почему dz recall --books ничего не находит?

Он читает проектное хранилище .dz/memory/books.sqlite, а не brain. Загрузи срез командой dz brain add --from-pack @dzhechkov/skills-book-ai-apps и спрашивай dz brain query / ground / primer — они работают из любого проекта.

Можно ли поставить пакет целиком на GitHub Copilot?

Технически да, но каждый файл инструкций загружается на каждый запрос: 763 183 байта тел, оценка ≈347 тыс. токенов. Ставь только навыки под текущую работу через --select.

Насколько верить числам внутри навыков?

trust_tier 1: машинная выжимка без проверки человеком по страницам. Канон KU проверен судьёй (202 true / 21 partial / 0 false), но конкретное число сверяй со страницей в references/knowledge-units.md, прежде чем строить на нём решение.

Бесплатный интерактивный курс · aicoding.space

Лицензии шрифтов

Onest

Copyright 2021 The Onest Project Authors (https://github.com/googlefonts/onest)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded, 
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

JetBrainsMono

Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL


-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded, 
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.