| name | yandex-direct-client-lifecycle |
| description | Use when onboarding a new or stale Yandex Direct client, building a reusable client knowledge base, collecting company/site/social/analytics context, gathering raw competitor and keyword data, preparing a human-reviewable research pack and client proposal, or handing the account into yandex-performance-ops for build and long-term management. |
Yandex Direct Client Lifecycle
Overview
Этот навык закрывает upstream-слой работы с клиентом по Яндекс.Директ: intake -> база знаний -> raw research -> analysis -> human review -> client proposal -> handoff.
Path Contract
<plugin-root> = корень этого bundle, где лежат .codex-plugin/plugin.json, skills/, mcp/, scripts/.
- Repo-local пример:
./plugins/yandex-direct-for-all
- Home-compatible install пример:
~/.codex/plugins/yandex-direct-for-all или ~/.claude/plugins/yandex-direct-for-all
- Все runtime-команды в этом skill должны ссылаться на
<plugin-root>/..., а не на ~/.codex/skills/....
Новый skill не имеет права заменять канонические source-skills по Wordstat, Direct semantics и Direct.
Перед любым sematics/Direct блоком считай обязательным upstream contract:
references/source_skill_contract.md
Используй его, когда задача не про “ежедневно вести уже живой кабинет”, а про:
- онбординг нового клиента;
- re-onboarding старого/непонятного клиента;
- сбор первой базы знаний о компании, продуктах, сайтах, соцсетях, кейсах и аналитике;
- подготовку research-backed плана и предложения для клиента;
- сбор и систематизацию всех данных перед build/launch;
- передачу клиента в downstream-слой
yandex-performance-ops.
Товарный или фидовый слой не предлагай по умолчанию.
Включать его в клиентский пакет можно только по прямому запросу пользователя или после отдельного решения, что такой слой действительно нужен.
Не используй этот навык как замену yandex-performance-ops для day-2/day-N операций. Когда контекст собран, структура согласована и начинается build/live/monitoring, переключайся на yandex-performance-ops.
Если работа идет по уже начатому клиенту, сначала искать готовые артефакты исследования, generated tables, готовую клиентскую страницу и deploy bundle, а не поднимать новый слой поверх старого.
Перед таким продолжением сначала опираться на:
<plugin-root>/skills/yandex-performance-ops/references/future_session_start_checklist.md
Quick Start
Если в проекте еще нет локального клиентского слоя, сначала создай его:
python3 <plugin-root>/skills/yandex-direct-client-lifecycle/scripts/scaffold_client_lifecycle.py \
--output-dir . \
--client-key acme \
--client-name "Acme"
Скрипт создает локальный стартовый пакет:
./client-kb.md
./source-register.tsv
./competitor-raw-register.tsv
./human-review.tsv
./proposal-pack.md
./product-map.md
./routing-map.tsv
./research/analysis/company-footprint.md
./research/analysis/landing-inventory.md
./research/analysis/research-backlog.md
./research/analysis/единая-карта-конкурентов.md
./research/analysis/пакет-структуры-будущего-кабинета.md
./research/analysis/пакет-текстов-и-офферов.md
./research/analysis/готовые-тексты-для-директа.tsv
./research/jobs/organic-serp-jobs.tsv
./research/jobs/ad-serp-jobs.tsv
./research/jobs/page-capture-jobs.tsv
./research/jobs/sitemap-jobs.tsv
./research/jobs/search-api.env.example
./.codex/yandex-performance-client.json
./research/semantics/__CLIENT_KEY__/00-product-map.md
./research/semantics/__CLIENT_KEY__/01-masks-wave1.tsv
Для batch-сбора используй канонические job-spec -> collector paths:
python3 <plugin-root>/skills/yandex-direct-client-lifecycle/scripts/yandex_search_batch.py \
--jobs-file ./research/jobs/organic-serp-jobs.tsv \
--output-dir ./research/raw/competitor-search/wave-01
python3 <plugin-root>/skills/yandex-direct-client-lifecycle/scripts/yandex_search_ads_batch.py \
--jobs-file ./research/jobs/ad-serp-jobs.tsv \
--output-dir ./research/raw/ad-serp/wave-01
Если cloud-auth еще не подключен, сначала прогони только request preview:
python3 <plugin-root>/skills/yandex-direct-client-lifecycle/scripts/yandex_search_batch.py \
--jobs-file ./research/jobs/organic-serp-jobs.tsv \
--output-dir ./research/raw/competitor-search/wave-01-preview \
--dry-run
python3 <plugin-root>/skills/yandex-direct-client-lifecycle/scripts/firecrawl_scrape.py \
--jobs-file ./research/jobs/page-capture-jobs.tsv \
--output-dir ./research/raw/competitors/firecrawl/wave-01 \
--proxy enhanced \
--location-country RU
python3 <plugin-root>/skills/yandex-direct-client-lifecycle/scripts/sitemap_probe_batch.py \
--jobs-file ./research/jobs/sitemap-jobs.tsv \
--output-dir ./research/raw/competitors/sitemaps/wave-01
Пакет текстов после ручной подготовки нужно прогонять через reusable validator:
python3 <plugin-root>/skills/yandex-performance-ops/scripts/validate_direct_copy_pack.py \
--input-tsv ./research/analysis/готовые-тексты-для-директа.tsv \
--output-dir ./research/analysis/валидация-текстов-директ
Если клиентский отчет выводится в веб-страницу, в него нужно включать отдельный слой спрос из Wordstat:
- широкие корневые маски отдельно;
- точные базовые маски отдельно;
- без суммирования вложенных запросов и без складывания масок между собой.
- использовать готовый renderer
<plugin-root>/skills/yandex-performance-ops/scripts/render_wordstat_mask_demand.py, а не дописывать цифры вручную.
- сезонность и географию считать обязательными частями этого же блока.
- использовать готовые renderer paths:
<plugin-root>/skills/yandex-performance-ops/scripts/render_wordstat_seasonality.py
<plugin-root>/skills/yandex-performance-ops/scripts/render_wordstat_geo.py
- raw для сезонности и географии собирать тем же wave-collector path, а не отдельными ручными
wordstat_* вызовами:
<plugin-root>/skills/yandex-performance-ops/scripts/wordstat_collect_wave.js --dynamics true --regions-report true --regions-tree true
python3 <plugin-root>/skills/yandex-direct-client-lifecycle/scripts/build_followup_jobs_from_serp.py \
--serp-results ./research/raw/competitor-search/wave-01/serp_results.tsv \
--page-capture-out ./research/jobs/page-capture-jobs.tsv \
--sitemap-out ./research/jobs/sitemap-jobs.tsv \
--exclude-domain yandex.ru \
--exclude-domain ya.ru
Workflow
1. Set The Phase
Перед работой явно зафиксируй текущую фазу:
intake
knowledge-base
raw-research
analysis
proposal
handoff
ops
Если пользователь просит “сделать стратегию / предложение / исследование / онбординг”, почти всегда это фазы intake -> proposal.
1.1. Re-read Source Skills Before Wordstat/Direct Work
Когда работа доходит до Wordstat, Direct semantics или Direct account слоя, этот skill обязан заново опираться на source-skills, а не на сжатое пересказанное знание.
Обязательные источники:
references/source_skill_contract.md
- глобальный
yandex-performance-ops Wordstat framework
- канонический
yandex-wordstat source skill
- канонический
direct-search-semantics source skill
- канонический
yandex-direct source skill
Если локальный lifecycle workflow конфликтует с source-skill, source-skill побеждает.
2. Build The Client Knowledge Base First
До глубокого анализа сначала собери и оформи клиентский контекст в client-kb.md.
Что вносить:
- компания и бизнес-модель;
- продукты / услуги / направления;
- гео;
- цикл сделки;
- lead path;
- сайт, owned company pages, лендинги, соцсети, каталоги, карты, отзывы, кейсы;
- ограничения и red lines;
- подтвержденные данные и неизвестные.
Используй шаблон:
templates/client-kb-template.md
Все источники фиксируй отдельно в source-register.tsv, чтобы будущие чаты не переизобретали контекст.
Используй шаблон:
templates/source-register-template.tsv
Параллельно веди отдельный операционный слой company footprint, если уже есть owned pages, реквизиты, адреса, логистика и внешние registry-сигналы.
Используй:
templates/company-footprint-template.md
3. Separate Collection From Analysis
Парсинг и сбор данных не смешивай с выводами.
Сначала собирай raw-слой, потом анализируй.
Для upstream research ручные одиночные прогоны не считать нормой. Default path теперь:
- job-spec
.tsv;
- batch collector script;
- raw
json/xml/html/md/tsv;
- только потом markdown analysis.
Это особенно важно для:
- конкурентов;
- объявлений конкурентов;
- Wordstat;
- старых рекламных кабинетов;
- аналитических выгрузок;
- креативных ассетов.
Для конкурентов сначала заполняй competitor-raw-register.tsv, без оценок и “кто лучше”.
Используй шаблон:
templates/competitor-raw-register-template.tsv
Для competitor research обязательно веди два раздельных raw-слоя:
organic SERP
ad SERP
Их нельзя смешивать в один без явного поля discovery_layer, потому что это разные поверхности рынка и разные последующие выводы.
Для самого SERP действуют отдельные правила:
organic SERP и ad SERP по Яндексу собирай только через официальный путь Яндекса:
- API;
- официальный экспорт;
- подтвержденную выгрузку из интерфейса.
- Браузерный скрейпинг Яндекс-выдачи не считать допустимым каноническим методом.
- Не используй
Firecrawl для discovery, parsing или эмуляции самого SERP.
Firecrawl разрешен только после discovery, чтобы забирать уже найденные landing pages и публичные страницы.
- Для поисковых рекламных объявлений Яндекса подтвержден рабочий путь через
Yandex Search API в FORMAT_HTML.
- Канонический batch collector для этого слоя:
scripts/yandex_search_ads_batch.py
6.1. Если этот path уже был локализован глобально, не искать его заново по remote-машинам. Сначала проверять:
- локальный private credentials file вне git
../yandex-performance-ops/references/yandex_cloud_search_handoffs.md
- Этот слой не закрывает автоматически
РСЯ; для РСЯ нужен отдельный подтвержденный официальный источник.
- Если в поисковых рекламных объявлениях всплывают спорные хосты, их нельзя механически записывать в карту конкурентов.
Сначала нужно посмотреть фактический
source_url и отнести сущность к одному из слоев:
- прямой конкурент;
- товарная витрина;
- теххост / квиз;
- шум и самореклама поисковой системы.
Для Wordstat действуют еще более жесткие правила:
- только
masks-file -> wave collector, не one-off запросы по ходу работы;
- сначала
00-product-map.md, потом 01-masks-wave1.tsv;
Wave 1 должен включать L1 root-маски; где возможно это однословные маски;
- для текущего канона
Wave 1 в основном однословный; Wave 2 добавляет двухсловные product/object masks;
- после составления
Wave 1 обязателен mask review по двум плоскостям:
- web/source synonyms review;
- Wordstat associations review;
Wave 1 и Wave 2 обязательны;
- до анализа обязателен completeness gate:
- все raw-файлы на месте;
- пустые/ошибочные raw обнаружены;
- новые маски из associations вынесены в gap/wave2 backlog;
- lifecycle skill не имеет права подменять этот процесс “ручным набором запросов”.
Для полноты competitor collection действуют отдельные правила очередности:
- ранний competitor scout до семантики допустим только как
reconnaissance, чтобы понять рынок и проверить collectors;
- исчерпывающий competitor raw collection нельзя считать начатым, пока не собран и вручную не валидирован keyword set;
- после валидации семантики
organic SERP и ad SERP jobs должны генерироваться от матрицы validated keyword x geo, а не от произвольного shortlist запросов;
- для каждой валидированной фразы нужно сохранять
query, region, timestamp, domain, landing, discovery_layer, а затем запускать sitemap и page-capture уже по найденным доменам;
4.1. после organic SERP wave домены и landing URLs должны переводиться в page-capture-jobs.tsv и sitemap-jobs.tsv только через reusable builder script, а не вручную;
4.2. перед follow-up сбором обязателен отдельный шаг shortlist:
- сводка повторяемости доменов по подтвержденной выдаче;
- ручное утверждение укороченного списка сильных доменов;
- ориентир по умолчанию =
топ-15 доменов, которые повторяются по большинству целевых фраз;
- страницы статей, новостей, справочников, PDF и прочие некоммерческие URL должны исключаться механическими паттернами до
page-capture и sitemap;
- pre-semantics waves нельзя выдавать человеку как полный competitor set: это только разведка и proof-of-pipeline.
Канонический batch collector для Yandex-native organic SERP:
scripts/yandex_search_batch.py
- job template:
templates/serp-job-template.tsv
Канонический batch collector для поисковых рекламных объявлений Яндекса:
scripts/yandex_search_ads_batch.py
- вход =
research/jobs/ad-serp-jobs.tsv
- источник =
Yandex Search API в FORMAT_HTML
Канонический рендер доменного shortlist из поисковой выдачи:
scripts/build_domain_shortlist_from_serp.py
- использовать после подтвержденной поисковой волны и до follow-up jobs
- скрипт только сортирует и рендерит повторяемость доменов, не принимает решения
Канонический batch collector для second-pass page capture:
scripts/firecrawl_scrape.py --jobs-file ...
- job template:
templates/page-capture-job-template.tsv
Канонический batch collector для sitewide discovery по конкуренту:
scripts/sitemap_probe_batch.py
- job template:
templates/sitemap-job-template.tsv
Канонический utility для batch chunking:
scripts/split_tsv_batch.py
- использовать когда один большой jobs-файл нужно распараллелить на несколько workers
Канонический utility для merge chunked sitemap waves:
scripts/merge_sitemap_batch_outputs.py
- использовать после параллельного
sitemap_probe_batch.py, чтобы собрать единый sitemap_manifest.tsv и candidate_urls.tsv
Канонические render utilities для ручного review:
scripts/render_serp_wave.py
scripts/render_ad_serp_wave.py
scripts/render_sitemap_candidates.py
scripts/render_page_capture_inventory.py
- эти scripts только сортируют, чанкуют и рендерят verified raw для ручного анализа
Канонический builder между organic SERP raw и follow-up collectors:
scripts/build_followup_jobs_from_serp.py
- вход:
serp_results.tsv
- выход:
page-capture-jobs.tsv
sitemap-jobs.tsv
- script не анализирует конкурентов и не фильтрует таргетность по смыслу; он только преобразует raw SERP в batch job-spec для следующего шага.
- использовать после domain discovery, чтобы не ограничиваться одним landing URL
Все operator-facing и client-facing отчеты, summary и proposal-паки писать на русском языке.
По возможности не использовать англицизмы, если есть ясный русский эквивалент.
Если доступен FIRECRAWL_API_KEY, предпочитай scripts/firecrawl_scrape.py для raw-сбора публичных страниц, особенно когда:
- страница сильно JS-driven;
curl возвращает anti-bot, 403, security-check или обрезанный HTML;
- нужен нормализованный markdown/html/json-слой для дальнейшего ручного анализа.
Firecrawl не заменяет source register и raw register: он только улучшает слой извлечения.
Если second-pass нужен для антиботных доменов:
- сначала обычный
Firecrawl;
- затем retry с
proxy=enhanced;
- при geo-sensitive сайте можно передать
location.country и location.languages;
- но даже в таком режиме это page-capture tool, а не SERP tool.
Перед любым analysis-stage bundle нужно закрыть отдельной машинной проверкой:
scripts/verify_research_bundle.py
- verifier только проверяет полноту и presence raw/job artifacts
- verifier не делает выводов и не решает достаточно ли хороши сами данные по смыслу
4. Cover The Full Research Surface
Не ограничивайся одной плоскостью.
Покрытие должно пройти по блокам из:
references/coverage-checklist.md
Минимальный каркас:
- клиент и его компания;
- продукты и офферы;
- сайт и посадочные;
- аналитика и lead routing;
- конкуренты;
- объявления конкурентов;
- спрос / маски / ключи / минус-фразы;
- структура кампаний;
- тексты объявлений, изображения, расширения;
- план, гипотезы, аналитические требования, договорный контур, build/handoff.
После закрытия ручного analysis-stage этот skill обязан выдавать еще три обязательных операторских артефакта, не откладывая их "на потом":
research/analysis/единая-карта-конкурентов.md
Нормализованная ручная карта: органика + поисковые рекламные объявления + тип игрока + сегменты.
research/analysis/пакет-структуры-будущего-кабинета.md
Каркас будущего кабинета: кампании, группы, посадочные, география, без запуска.
research/analysis/пакет-текстов-и-офферов.md
Полный пакет текстов, быстрых ссылок и уточнений для ручной сборки.
research/analysis/готовые-тексты-для-директа.tsv
Машинно-читаемый пакет текстов для проверки длин и дальнейшей сборки.
5. Use Other Skills Deliberately
Связки по умолчанию:
playwright
Используй для реального браузерного сбора объявлений конкурентов, выдачи и страниц.
Если relevant competitor pages отдают 403, anti-bot или DDoS challenge при curl, сразу планируй second-pass через браузер вместо ложного ощущения, что raw уже собран.
Firecrawl script
Если есть FIRECRAWL_API_KEY, сначала попробуй scripts/firecrawl_scrape.py для публичных страниц и лендингов конкурентов.
Это preferred path для page parsing, когда нужна чистая markdown/html/json-выгрузка без ручной браузерной возни.
Не используй его для SERP collection: поиск выдачи и ads discovery идут только через Яндекс-native paths.
Для batch-режима используй --jobs-file вместо перечисления URL вручную.
yandex-performance-ops
Используй для:
- официального
Wordstat;
- client overlay;
- Direct/Metrika/Roistat raw-сборов;
- структуры, validation, build, launch, ongoing ops.
Делай это по канону source-skills, а не по самодельным shortcut-правилам lifecycle skill.
russian-b2b-service-contracts
Используй, когда нужно собрать:
- договор;
- ТЗ;
- акт;
- клиентский комплект документов.
6. Human Review Is A First-Class Artifact
Не делай процесс завязанным на “копировать в чат” и “смотреть скриншоты”.
Веди отдельный human-review queue:
human-review.tsv
Там должны жить:
- что именно нужно утвердить;
- из какого артефакта это пришло;
- какой тип решения нужен;
- текущий статус;
- комментарий человека.
Используй шаблон:
templates/human-review-template.tsv
7. Proposal Pack Must Be Client-Facing
Когда делаешь предложение клиенту, собери не просто заметки, а читаемый пакет:
- что исследовано;
- какие факты подтверждены;
- на какие источники опираемся;
- какие гипотезы и почему;
- какую структуру кабинета предлагаем;
- что нужно по аналитике;
- что будет в first wave;
- что не обещаем;
- что нужно согласовать.
Используй:
templates/proposal-pack-template.md
Но proposal не заменяет три операторских пакета выше.
Сначала вручную собрать:
- единую карту конкурентов;
- пакет структуры будущего кабинета;
- пакет текстов и офферов;
и только потом вносить их выводы в client-facing документы.
Если полезно, добавляй эмуляцию реального вида объявлений в Поиске и РСЯ, но только как наглядный mockup, а не как обещание финального live-вида.
Если собираешь клиентскую веб-страницу или веб-презентацию, действуют обязательные правила:
- это клиентский артефакт, а не operator-dump;
- не тянуть в страницу ссылки на исходные markdown/tsv/json документы и не показывать внутренние названия файлов;
- не оставлять внутренние подписи вроде
главный документ, клиентская версия, полный комплект, сводка исследования;
- не дублировать один и тот же смысл в нескольких секциях;
- длинный контент раскладывать по вкладкам, переключателям и отдельным блокам, а не сваливать в бесконечную ленту;
- объявления на такой странице показывать в виде, максимально близком к реальному интерфейсу Яндекс.Директа, а не в стиле общей декоративной темы страницы;
- текст страницы писать в прямом обращении к клиенту, без рассказа о клиенте в третьем лице там, где это читается как внутренняя заметка.
- если страницу нужно отдать клиенту по ссылке, собирать отдельный deploy-пакет, а не публиковать рабочую папку целиком;
- для защищенной ссылки использовать отдельную однофайловую сборку через
scripts/build_secure_client_report.py, затем проверять live-страницу на десктопе и мобиле уже после выката;
- не полагаться на внешние markdown/tsv/json в клиентском деплое: нужные данные должны быть встроены в итоговый пакет.
8. Handoff Cleanly
Когда proposal и human review завершены:
- обнови
client-kb.md;
- обнови
source-register.tsv;
- обнови
product-map.md;
- обнови
routing-map.tsv;
- обнови
./.codex/yandex-performance-client.json;
- зафиксируй, что готово для downstream-этапа.
Дальше:
- build / validation / live apply / daily ops веди через
yandex-performance-ops;
- юридический пакет веди через
russian-b2b-service-contracts.
Границы handoff описаны в:
references/handoff-map.md
Guardrails
- База знаний клиента создается раньше глубокого анализа.
- На старте задавай только блокирующие вопросы, а не длинный generic-бриф.
ПАРСИНГ != АНАЛИЗ.
- Конкурентов сначала собирай как raw-слой, потом анализируй.
- Для
Wordstat действуют правила downstream skill:
- только официальный путь;
numPhrases=2000;
- не резать low volume;
- собирать хвост до
1 показа/месяц, если задача про новую семантику.
- Не обещай клиенту лиды и продажи без доказательной базы.
- Перед build/live этапами нужен human approval.
- После каждого крупного цикла обновляй KB, source register и proposal artifacts, чтобы следующие чаты работали от канонического слоя, а не “из головы”.
References
Читай по необходимости:
references/artifact-contract.md
Что именно должно лежать в локальном проекте и когда это обновлять.
references/coverage-checklist.md
Как не пропустить важные плоскости исследования и подготовки.
references/handoff-map.md
Где заканчивается этот skill и начинается yandex-performance-ops.
Templates
Переиспользуемые шаблоны:
templates/client-kb-template.md
templates/source-register-template.tsv
templates/company-footprint-template.md
templates/competitor-raw-register-template.tsv
templates/human-review-template.tsv
templates/proposal-pack-template.md
templates/product-map-template.md
templates/routing-map-template.tsv
templates/landing-inventory-template.md
templates/research-backlog-template.md
templates/yandex-performance-client-template.json
templates/unified-competitor-map-template.md
templates/future-cabinet-structure-template.md
templates/offers-pack-template.md
Trigger Examples
Этот skill должен триггериться на запросы типа:
- “Новый клиент по Директ, собери мне онбординг и базу знаний.”
- “Подготовь исследование и предложение клиенту по Яндекс.Директ.”
- “Собери все данные по компании, конкурентам и спросу, потом упакуй план.”
- “Нужно системно заводить клиентов в полный цикл от онбординга до handoff.”