docs(plan): C1 marketing-tooling implementation plan

13 задач (Phase 0 IS9-вет → Phase 1 установка → Phase 2 нормативка →
Phase 3 верификация), #74–#83, subagent-driven по паттерну A8/finance.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-05-22 16:18:34 +03:00
parent 7746b7ab5c
commit dbfa48cac7
@@ -0,0 +1,300 @@
# C1 marketing-tooling Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Наполнить пустой раздел карты C1 «Маркетинг и лидогенерация» 10 узлами (#74#83: 8 install-now + 2 DEFERRED), новой 18-й off-phase подкатегорией marketing-tooling, с провенанс-ветом, ADR-015, нормативной синхронизацией и обновлением карты.
**Architecture:** Off-phase tooling integration по проверенному паттерну A8/finance/A1 — subagent-driven: self-authored скил + IS9-вет + provenance-doc по Sonnet-субагентам; нормативка/ADR/карта/роутер — controller (Opus) атомарными коммитами. Внешние инструменты проходят IS9-гейт ДО установки. Аналитика — READ-ONLY, рекламные мутации — только с явным подтверждением (без авто-трат бюджета).
**Tech Stack:** Claude Code plugins (knowledge-work-plugins marketplace), self-authored skills (`.claude/skills/`), MCP-серверы (`.mcp.json`), нормативный markdown (Tooling / PSR_v1 / Pravila / CLAUDE.md / ADR), карта vis.js (`automation-graph-data.js` + `.html`), lefthook.
**Spec:** `docs/superpowers/specs/2026-05-22-c1-marketing-tooling-design.md`
**Worktree:** `.claude/worktrees/c1-marketing-tooling` (ветка `worktree-c1-marketing-tooling`, от origin/main `9bf97ef`). CLAUDE.md правится прямым Edit — worktree-эксцепшн §5 п.10 (claude-md-management не наводится на worktree-копию; прецедент A8/A1/finance).
**Нумерация:** #74 marketing · #75 marketingskills · #76 brand-voice · #77 marketing-ru · #78 Метрика · #79 Директ+Wordstat · #80 Telegram · #81 Postiz · #82 DataForSEO (DEFERRED) · #83 Unisender (DEFERRED). Tooling §4.49–§4.58. 18-я off-phase подкатегория.
---
## Файловая структура
**Создаются:**
- `docs/security/marketing-vet.md` — IS9 провенанс-вет внешних (#75/#78/#79/#80/#81)
- `.claude/skills/marketing-ru/SKILL.md` + `references/ru-channels.md` + `evals/evals.json` — self-authored скил #77
- `.claude/skills/marketingskills/**` — вендоренный набор #75 (clone subset)
- `docs/marketing/README.md` — home-директория раздела C1 + Postiz self-host инструкция (#81)
- `docs/adr/015-marketing-tooling.md` — границы MKT1MKT10
**Модифицируются:**
- `~/.claude/settings.json` (enabledPlugins +marketing +brand-voice) — машинно-локально, вне репо
- `.mcp.json` (+#78 Метрика, +#79 Директ, +#80 Telegram, +#81 Postiz skeleton)
- `lefthook.yml` + `.markdownlintignore` + `cspell.json` (exclude `.claude/skills/marketingskills/**` — MKT10)
- `docs/Tooling_v8_3.md` (§4.49–§4.58 + §0 счётчик + подкатегория)
- `docs/Plugin_stack_rules_v1.md` (R10.1 + R15.6)
- `docs/Pravila_raboty_Claude_v1_1.md` (§13.2)
- `CLAUDE.md` (§3.3 + §0 + §6 + §9 header)
- `docs/routing-off-phase.md` (+узлы + связка L16) + `docs/router-procedure.md` (version-метка)
- `docs/automation-graph-data.js` + `docs/automation-graph.html` (узлы/рёбра/NODE_SECTION/browser-smoke)
---
## Phase 0 — Провенанс-вет (IS9) [гейт]
### Task 0: IS9-вет внешних кандидатов
**Files:**
- Create: `docs/security/marketing-vet.md`
- [ ] **Step 1: Вет каждого внешнего кандидата.** Для каждого репозитория проверить: лицензию, последний коммит/активность, наличие сетевых вызовов помимо заявленного API, отсутствие попыток чтения секретов/credential-эксфильтрации (риск ToxicSkills ≈13%, прецедент ADR-014 IS9). Кандидаты:
- `coreyhaines31/marketingskills` (#75, вендоринг) — лицензия (вендоринг требует совместимости с репо), содержание скилов (markdown, без исполняемого кода).
- Яндекс.Метрика MCP (#78): `atomkraft/yandex-metrika-mcp` vs `theYahia/*` vs `Vadosdavos/*` — выбрать финальный по коду + OAuth-скоупам (read-only).
- `SvechaPVL/yandex-mcp` (#79) — Директ-мутации в коде, OAuth-скоупы.
- `chigwell/telegram-mcp` (#80) — MTProto user-account, отсутствие скрытой эксфильтрации.
- `gitroomhq/postiz-app` + `antoniolg/postiz-mcp` (#81) — AGPL-3.0 применимость для self-host.
- [ ] **Step 2: Записать вердикты в `docs/security/marketing-vet.md`.** Структура как `docs/security/infosec-vet.md` (A8): таблица «инструмент · источник · лицензия · вердикт PASS/FAIL/REPLACE · обоснование». Финальный выбор Метрика-сервера зафиксировать.
- [ ] **Step 3: Гейт.** Любой FAIL → заменить кандидата или перевести узел в DEFERRED/out-of-scope (прецедент Enlightn→Ward). Зафиксировать решение в vet-доке.
- [ ] **Step 4: Commit.**
```bash
git add docs/security/marketing-vet.md
git commit -m "docs(sec): IS9 provenance vet for C1 marketing-tooling external candidates"
```
---
## Phase 1 — Установка инструментов
### Task 1: marketing plugin #74 + brand-voice #76 (Anthropic marketplace)
**Files:**
- Modify: `~/.claude/settings.json` (enabledPlugins) — машинно-локально
- [ ] **Step 1: Добавить marketplace и плагины.** Marketplace `knowledge-work-plugins` уже подключён (оттуда operations #51 / product-management #42 / design #46 / finance #61). Включить `marketing` и `brand-voice` (partner-built) в `~/.claude/settings.json` `enabledPlugins` (user-level, как прочие плагины этой витрины).
- [ ] **Step 2: Smoke — скилы видны.** Перезапустить сессию / проверить, что скилы плагина `marketing` (`content-creation`, `seo-audit`, `campaign-plan`, `email-sequence`, `competitive-brief`, `brand-review`, `performance-report`, `draft-content`) и `brand-voice` появились в available-skills. NB: плагины «primarily for Cowork, но работают в Claude Code» — подтвердить фактически.
Expected: скилы перечислены в system-reminder available-skills.
- [ ] **Step 3: Зафиксировать факт активации.** Записать в `docs/marketing/README.md` (создаётся в Task 4) строку «marketing #74 + brand-voice #76 enabled в settings.json (user-level), дата». settings.json вне репо — commit не требуется для самого файла.
### Task 2: Вендоринг marketingskills #75 + lint-исключение
**Files:**
- Create: `.claude/skills/marketingskills/**`
- Modify: `lefthook.yml`, `.markdownlintignore`, `cspell.json`
- [ ] **Step 1: Клонировать субсет.** После PASS в Task 0, скопировать набор скилов `coreyhaines31/marketingskills` в `.claude/skills/marketingskills/` (вендоринг — иммунитет к потере апстрима, прецедент data-scientist #49 / mermaid #37). Сохранить файл лицензии апстрима рядом.
- [ ] **Step 2: Lint-исключение (MKT10).** Добавить `.claude/skills/marketingskills/**` в: `lefthook.yml` markdownlint+cspell job `exclude`, `.markdownlintignore`, `cspell.json` `ignorePaths` (как ML3 для data-scientist / CC1 для ccpm).
- [ ] **Step 3: Verify exclude.** Запустить `npx markdownlint-cli2` и `npx cspell` — вендоренные файлы не должны попадать в линт.
Expected: 0 новых нарушений от `.claude/skills/marketingskills/**`.
- [ ] **Step 4: Commit.**
```bash
git add .claude/skills/marketingskills lefthook.yml .markdownlintignore cspell.json
git commit -m "feat(c1): vendor marketingskills #75 + lint exclusion (MKT10)"
```
### Task 3: Self-authored marketing-ru skill #77 + eval (TDD)
**Files:**
- Create: `.claude/skills/marketing-ru/SKILL.md`, `.claude/skills/marketing-ru/references/ru-channels.md`, `.claude/skills/marketing-ru/evals/evals.json`
- [ ] **Step 1: Написать eval (failing).** Создать `evals/evals.json` с ~20 триггер-кейсами (модель discovery-interview eval 20/20): должны срабатывать («подбери каналы продвижения Лидерры», «как настроить Яндекс.Директ для нас», «конверсия лендинга», «можно ли слать email-рассылку по 152-ФЗ») + near-miss которые НЕ должны (общий копирайтинг → marketingskills #75; продуктовые метрики → product-management #42; ПДн-аудит кода → pdn-152fz #71; визуал → A4).
- [ ] **Step 2: Прогнать eval — провал (скила нет).**
Run: классификатор по `evals.json` (как в discovery-interview).
Expected: FAIL — скил не существует.
- [ ] **Step 3: Написать SKILL.md.** `description` с РФ-триггерами + границами (NOT generic-копирайтинг, NOT продуктовые метрики, NOT ПДн-аудит кода). Тело: playbook каналов РФ (Яндекс.Директ/Метрика/VK/Telegram), конверсия лендинга (заземлить в `лендинг/TZ_landing_v1_0.md`), маркетинг в рамках 152-ФЗ (согласия на рассылки, cross-ref pdn-152fz-audit #71). `references/ru-channels.md` — детали каналов.
- [ ] **Step 4: Прогнать eval — успех.**
Expected: 20/20 (near-miss уходят в правильные узлы).
- [ ] **Step 5: Commit.**
```bash
git add .claude/skills/marketing-ru
git commit -m "feat(c1): self-authored marketing-ru skill #77 + eval 20/20"
```
### Task 4: MCP-серверы #78/#79/#80 + Postiz #81 skeleton + home-doc
**Files:**
- Modify: `.mcp.json`
- Create: `docs/marketing/README.md`
- [ ] **Step 1: Добавить MCP-серверы в `.mcp.json`.** По финальным репо из Task 0:
- `#78` Яндекс.Метрика (READ-ONLY env: OAuth-токен) — entry рядом с `mcp-universal-icons`/`openapi`.
- `#79` Яндекс.Директ+Wordstat (`SvechaPVL/yandex-mcp`).
- `#80` Telegram (`chigwell/telegram-mcp`).
Секреты — через env-переменные (User scope PowerShell, как Sentry #34), НЕ в репо (gitleaks).
- [ ] **Step 2: Smoke MCP.** Для каждого: `npx <pkg> --help` или подключение в Claude Code (native-Windows), как openapi-mcp #47. Без живых токенов — проверить, что сервер стартует и регистрирует tools.
Expected: серверы стартуют, tools перечислены.
- [ ] **Step 3: Postiz #81 — skeleton + self-host doc.** Не бутить self-host сейчас (нет аккаунтов соцсетей). Добавить в `docs/marketing/README.md` install-инструкцию (self-host `gitroomhq/postiz-app` + MCP `antoniolg/postiz-mcp`, AGPL-note из vet-дока). MCP-entry в `.mcp.json` — закомментированным skeleton или с пометкой «активировать после self-host».
- [ ] **Step 4: `docs/marketing/README.md`.** Home-директория C1: карта 10 узлов, что install-now / DEFERRED, READ-ONLY/без-авто-трат постура (MKT8), cross-ref на spec/ADR-015/vet-док.
- [ ] **Step 5: Commit.**
```bash
git add .mcp.json docs/marketing/README.md
git commit -m "feat(c1): Metrika/Direct/Telegram MCP #78-80 + Postiz #81 skeleton + C1 home doc"
```
---
## Phase 2 — Нормативная синхронизация (controller, атомарно)
> Pravila §15.2 pre-flight: `git fetch && git log HEAD..origin/main --oneline` перед правкой каждого нормативного файла. cross-ref-checker (C2) STRICT может потребовать атомарного version-bump-набора (прецедент finance) — Tasks 5–9 коммитить связно.
### Task 5: Tooling Прил. Н §4.49–§4.58 + §0 счётчик
**Files:**
- Modify: `docs/Tooling_v8_3.md`
- [ ] **Step 1: §4.49–§4.58 attribute-блоки #74#83.** По образцу §4.48 (A8 security-go-live) — 9 обязательных атрибутов на узел (§0.1 row template). Для #74/#76 — marketplace-плагин; #75 — вендоренный; #77 — self-authored; #7881 — MCP/self-host; #82/#83 — DEFERRED (pending-слот как Figma #44 / NightOwl #67). Категория-строка: «off-phase, **marketing-tooling** — 18-я off-phase подкатегория».
- [ ] **Step 2: §0 счётчик.** Канон счётчиков — Tooling §0 (anchor «КАНОН СЧЁТЧИКОВ»). Обновить: 73→83 формализованных позиций (+10), 17→18 подкатегорий. Total с ruflo пересчитать.
- [ ] **Step 3: Header version-bump.** Прил. Н v2.22 → **v2.23**; §0 cross-ref строки Pravila/PSR_v1/CLAUDE.md → новые версии (Task 6/7/8).
- [ ] **Step 4: Commit** (вместе с Tasks 6–9 если C2 требует атомарности).
```bash
git add docs/Tooling_v8_3.md
git commit -m "docs(tooling): C1 marketing-tooling §4.49-58 (#74-83) + §0 counter v2.23"
```
### Task 6: ADR-015
**Files:**
- Create: `docs/adr/015-marketing-tooling.md`
- [ ] **Step 1: Написать ADR-015.** Формат как `docs/adr/014-infosec-tooling.md`. Context (C1 пуст, собственный go-to-market), Decision (8 install-now + 2 DEFERRED, VK out-of-scope, вариант Б), Boundaries MKT1MKT10 (из spec §4), Consequences, Status Accepted.
- [ ] **Step 2: adr-judge (если в lefthook job 9).** Прогон не должен падать (декларативно, без `--llm`).
- [ ] **Step 3: Commit.**
```bash
git add docs/adr/015-marketing-tooling.md
git commit -m "docs(adr): ADR-015 marketing-tooling boundaries MKT1-MKT10"
```
### Task 7: PSR_v1 R10.1 + R15.6
**Files:**
- Modify: `docs/Plugin_stack_rules_v1.md`
- [ ] **Step 1: R10.1 реестр ролей.** Блок 1 (плагины/скилы): +marketing #74 (решатель C1) + brand-voice #76 + note (marketingskills #75 материал/резерв-библиотека — модель UPM; marketing-ru #77 self-authored). Блок 3 (MCP): +Метрика #78 / Директ #79 / Telegram #80 / Postiz #81 / DataForSEO #82 (DEFERRED) / Unisender #83 (DEFERRED). Все — не UI → вне R6.0/R6.1/R14.
- [ ] **Step 2: R15.6 +marketing-tooling** (гранулярные off-phase категории — 18-я).
- [ ] **Step 3: Header v3.21 → v3.22** + cross-ref строки.
- [ ] **Step 4: Commit.**
```bash
git add docs/Plugin_stack_rules_v1.md
git commit -m "docs(psr): R10.1 + R15.6 marketing-tooling (#74-83) v3.22"
```
### Task 8: Pravila §13.2
**Files:**
- Modify: `docs/Pravila_raboty_Claude_v1_1.md`
- [ ] **Step 1: §13.2 +абзац «Off-phase marketing-tooling»** (18-я подкатегория: #74 marketing / #75 marketingskills / #76 brand-voice / #77 marketing-ru / #7881 каналы / #8283 DEFERRED — раздел C1). Пин счётчиков на Tooling §0 (не дублировать числа — feedback_brain_counter_canon).
- [ ] **Step 2: Header v1.38 → v1.39** + §0 cross-ref строки.
- [ ] **Step 3: Commit.**
```bash
git add docs/Pravila_raboty_Claude_v1_1.md
git commit -m "docs(pravila): §13.2 marketing-tooling off-phase subcategory v1.39"
```
### Task 9: CLAUDE.md §3.3 + §0 + §6 + §9
**Files:**
- Modify: `CLAUDE.md` (прямой Edit — worktree-эксцепшн §5 п.10)
- [ ] **Step 1: §3.3** +10 строк #74#83 (однострочный индекс-стиль: «задача · инструмент · off-phase, marketing-tooling — Tooling §4.NN»; #82/#83 с пометкой DEFERRED; #78 READ-ONLY; #79 без авто-трат).
- [ ] **Step 2: §0 cross-refs** version-bump: Pravila v1.39 / PSR_v1 v3.22 / Tooling Прил.Н v2.23.
- [ ] **Step 3: §6** +абзац «2026-05-22 C1 marketing-tooling integration» сверху.
- [ ] **Step 4: §9** +запись v2.27 + header v2.26 → **v2.27**.
- [ ] **Step 5: Commit.**
```bash
git add CLAUDE.md
git commit -m "docs(claude-md): C1 marketing-tooling #74-83 v2.27"
```
### Task 10: routing-off-phase.md + router-procedure.md
**Files:**
- Modify: `docs/routing-off-phase.md`, `docs/router-procedure.md`
- [ ] **Step 1: routing-off-phase.md** +строки триггер→узел для #74#83 (напр. «маркетинговый контент/кампания → marketing #74»; «SEO-фреймворк → marketingskills #75»; «тон бренда → brand-voice #76»; «РФ-каналы/лендинг/152-ФЗ-рассылка → marketing-ru #77»; «веб-аналитика → Метрика #78»; «реклама/ключи → Директ #79»; «постинг → Telegram #80 / Postiz #81») + связка **L16** «marketing chain» (brainstorming → marketing #74 → marketing-ru #77 → каналы #7881).
- [ ] **Step 2: router-procedure.md** — version-метка (как v1.3→v1.4 при A8).
- [ ] **Step 3: Commit.**
```bash
git add docs/routing-off-phase.md docs/router-procedure.md
git commit -m "docs(routing): C1 marketing nodes + L16 marketing chain"
```
### Task 11: Карта automation-graph
**Files:**
- Modify: `docs/automation-graph-data.js`, `docs/automation-graph.html`
- [ ] **Step 1: Узлы.** В `automation-graph-data.js` массив узлов +8 install-now (`mkt_plugin`, `mkt_skills`, `brand_voice`, `sk_marketing_ru`, `mcp_metrika`, `mcp_ya_direct`, `mcp_telegram`, `postiz`) +2 DEFERRED (`mcp_dataforseo`, `mcp_unisender`). Формат: `{ id, label, group, size, ring, ...pos(ring, deg) }` (group: `plugins`/`skills_proj`/`mcp`).
- [ ] **Step 2: NODE_SECTION.** +маппинг всех 10 на `'C1'`. NODE_SECTION_SECONDARY при необходимости (напр. marketing-ru cross-ref D2 для 152-ФЗ).
- [ ] **Step 3: Рёбра.** Связь L16 (marketing chain) + границы (brand-voice ↔ Brandbook; performance-report ↔ product-mgmt). Обновить узлы/рёбра-счётчики в `automation-graph.html` legend (137→147 узлов).
- [ ] **Step 4: browser-smoke.** Открыть `automation-graph.html` (Playwright), проверить 0 JS-ошибок в консоли, C1-узлы рендерятся.
Expected: 0 console errors, 10 узлов C1 видны.
- [ ] **Step 5: Commit.**
```bash
git add docs/automation-graph-data.js docs/automation-graph.html
git commit -m "feat(map): C1 marketing nodes #74-83 + L16 (browser-smoke 0 errors)"
```
---
## Phase 3 — Верификация
### Task 12: Регрессия + финальная проверка
- [ ] **Step 1: Линт/гейты.**
Run: `npx markdownlint-cli2`, `npx cspell`, `npm run links` (lychee), `./bin/gitleaks.exe detect`, cross-ref-checker (C2) + l1-watcher (C1).
Expected: 0 нарушений / 0 drift (вендоренный #75 исключён).
- [ ] **Step 2: Карта browser-smoke** (повтор Task 11 Step 4 на финальном состоянии).
Expected: 0 console errors.
- [ ] **Step 3: marketing-ru eval** (повтор Task 3 Step 4).
Expected: 20/20.
- [ ] **Step 4: Сводка self-review** (CLAUDE.md §8): счётчики Tooling §0 сходятся, 0 дублей, Tooling↔CLAUDE.md cross-refs синхронны, ADR-015 ссылки валидны.
- [ ] **Step 5: Push** (после подтверждения заказчика).
```bash
git push origin worktree-c1-marketing-tooling:main
```
---
## Self-Review (плана против спеки)
**Spec coverage:** все 10 узлов #74#83 покрыты Tasks 14 (install) + Task 5 (Tooling) + Task 11 (карта); MKT1MKT10 → ADR-015 (Task 6) + lint-exclude (Task 2); IS9 → Task 0; нормативка → Tasks 5–10; верификация → Task 12. ✓
**Placeholder scan:** финальный выбор Метрика-MCP (#78) — решается в Task 0 (не плейсхолдер, а гейт-решение). Точные §4.NN номера / version-bump'ы — выводятся из live-состояния файла при исполнении (pre-flight §15.2). ✓
**Type consistency:** node-id (`mkt_plugin`/`mkt_skills`/`brand_voice`/`sk_marketing_ru`/`mcp_metrika`/`mcp_ya_direct`/`mcp_telegram`/`postiz`/`mcp_dataforseo`/`mcp_unisender`) согласованы между Task 11 и spec §2. Tooling-номера #74#83 согласованы во всех задачах. ✓