feat: research-tooling Perplexity Pack #87-89 — registry/router/normative sync + ADR-019

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-14 15:44:42 +03:00
parent bfc1f5750d
commit d74d3113e5
14 changed files with 599 additions and 21 deletions
+10 -4
View File
File diff suppressed because one or more lines are too long
+8 -3
View File
@@ -1,8 +1,10 @@
# Plugin Stack Rules — Superpowers + Frontend Design (v3.23)
# Plugin Stack Rules — Superpowers + Frontend Design (v3.24)
**Дата:** 27.05.2026
**Дата:** 14.06.2026
**Назначение:** свод правил совместного использования плагинов Claude Code в проекте Лидерра — paired-stack ядро `obra/superpowers` (14 skills) + `anthropics/frontend-design`, плюс расширенный пул UI-инструментов `ui-ux-pro-max` (skill, marketplace `nextlevelbuilder/ui-ux-pro-max-skill`) и `21st.dev Magic MCP` (MCP-сервер `magic`), плюс инфраструктурный `claude-md-management` (skills, marketplace `anthropics/claude-plugins-official`), плюс **debug-runtime MCP** `@sentry/mcp-server` + `@modelcontextprotocol/server-redis` (v2.1+, R10.1 Блок 3). **17 правил R0R16** (R15 off-phase routing введён в v3.14 на освободившийся после v2.0 R15-motion слот; R16 brain evidence loop введён в v3.16).
**v3.24** — research-tooling (Perplexity Pack): R10.1 Блок 3 +3 MCP-сервера **perplexity** #87 / **exa** #88 / **firecrawl** #89 (внешняя веб-разведка, READ-ONLY, платные API — ключи только в env, gate read_only `bfc1f575`). Новая 20-я off-phase подкатегория **research-tooling**; R15.6 +research-tooling. ADR-019 (RT1RT9). User-level/external MCP, не UI → вне R6.0/R6.1/R14. Содержательных изменений R0–R16: 0. Связано: Tooling v2.25 (§4.60–§4.62 + §0 счётчик 84→87), Pravila v1.44 (§13.2 +абзац), CLAUDE.md v2.46 (§3.3 +#87-89; §0 cross-refs); план `docs/superpowers/plans/2026-06-14-perplexity-pack-plan3-router-registry.md`.
**v3.23** — knowledge-graph-tooling: R10.1 Блок 1 note +**graphifyy** #86 (user-level скил `~/.claude/skills/graphify/SKILL.md`, CLI `graphifyy`, строит knowledge graph портала; активация `/graphify <command>`; артефакты `graphify-out*/` gitignored). Новая 19-я off-phase подкатегория **knowledge-graph-tooling** (раздел A12/graph карты). User-level скил, не project-level → вне R6.0/R6.1/R14. R15.6 +knowledge-graph-tooling. ADR-017 (KG1KG5). Содержательных изменений R0–R16: 0. Связано: Tooling v2.24 (§4.59 + §0 счётчик 83→84), Pravila v1.43 (§13.2 +абзац), CLAUDE.md v2.31 (§3.3 +#86; §0 cross-refs).
**v3.22** — C1 marketing-tooling: R10.1 Блок 1 +2 строки (**marketing** #74, Anthropic `knowledge-work-plugins/marketing`; **brand-voice** #76, Anthropic partner-built/Tribe AI) + Блок 1 note (v3.22 — **marketingskills** #75 вендорен MIT, материал/резерв-библиотека; **marketing-ru** #77 self-authored project-скил, eval 20/20) + Блок 3 +6 строк (**Метрика MCP** #78 `atomkraft/yandex-metrika-mcp` READ-ONLY; **Директ+Wordstat MCP** #79 `SvechaPVL/yandex-mcp` Wordstat-only, Direct-mutations disabled IS9; **Telegram MCP** #80 `chigwell/telegram-mcp` Apache-2.0; **Postiz MCP** #81 self-host AGPL-3.0 internal; **DataForSEO MCP** #82 DEFERRED — платный post-Б-1; **Unisender Go MCP** #83 DEFERRED — своя обёртка). Новая 18-я off-phase подкатегория **marketing-tooling** (раздел C1 карты). Не UI → вне R6.0/R6.1/R14. R15.6 +marketing-tooling. Провенанс-вет IS9 выполнен (`docs/security/marketing-vet.md`, 5 инструментов PASS/PASS-with-conditions). Содержательных изменений R0–R14, R16: 0. Связано: Tooling v2.23+, Pravila v1.42+, CLAUDE.md v2.27+; план `docs/superpowers/plans/2026-05-22-c1-marketing-tooling.md`; spec `docs/superpowers/specs/2026-05-22-c1-marketing-tooling-design.md`.
@@ -516,6 +518,9 @@ Stack — **головной**. Все плагины вне stack'а — **ин
| **Postiz MCP** *(`postiz-mcp` сервер)* — **self-hosted AGPL-3.0** | `.mcp.json` (stdio MCP, `antoniolg/postiz-mcp`; precondition: запущенный self-hosted Postiz `gitroomhq/postiz-app`, AGPL-3.0 — допустим для внутреннего self-host без дистрибуции) | **marketing-tooling MCP** — мультиканальный постинг в соцсети (VK через Postiz, Telegram, и др.). Категория: **marketing-tooling** (Tooling #81). Раздел C1 карты. Off-phase. Провенанс-вет C1-5 PASS-with-conditions | при мультиканальном постинге контента. AGPL-3.0: self-host as-is без модификаций, copyright сохранить. Проверить лицензию `antoniolg/postiz-mcp` перед активацией (Open note в marketing-vet.md). Не trigger'ит R6.0/R6.1/R14 |
| **DataForSEO MCP** *(`dataforseo-mcp` сервер)* — **DEFERRED** | `.mcp.json` (stdio MCP, `dataforseo/mcp-server-typescript`, ~204★ официальный) — не установлен; precondition: платный аккаунт DataForSEO | **marketing-tooling MCP** — SEO-данные (ключевые слова, SERP, backlinks, технический SEO-аудит). Категория: **marketing-tooling** (Tooling #82). Раздел C1 карты. Off-phase | DEFERRED — **платный** аккаунт DataForSEO; активация после Б-1. Зарегистрирован как pending-слот (как Figma MCP #44). Не trigger'ит R6.0/R6.1/R14 |
| **Unisender Go MCP** *(своя обёртка)* — **DEFERRED** | `.mcp.json` (stdio MCP — нет готового upstream-сервера; обёртка над Unisender Go API пишется по мере необходимости) | **marketing-tooling MCP** — email-маркетинг через Unisender Go (массовые рассылки, шаблоны, аналитика доставки). Категория: **marketing-tooling** (Tooling #83). Раздел C1 карты. Off-phase | DEFERRED — нет готового MCP-сервера Unisender Go; написать тонкий wrapper когда понадобится массовая рассылка. Unisender Go уже в стеке как SMTP-relay (транзакционный). Зарегистрирован как pending-слот. Не trigger'ит R6.0/R6.1/R14 |
| **perplexity MCP** *(`perplexity` сервер, tools `mcp__perplexity__*`)* | `.mcp.json` (stdio MCP, `@perplexity-ai/mcp-server`; env `PERPLEXITY_API_KEY` + `PERPLEXITY_BASE_URL` через AITUNNEL — только в env) | **research-tooling MCP** — ранжированный веб-ответ с источниками (search/ask/research/reason поверх sonar). Категория: **research-tooling** (Tooling §4.60 #87). Off-phase. Провенанс-вет `docs/research/research-vet.md` ПРИНЯТ; gate read_only (`bfc1f575`) | при веб-разведке (актуальные практики/нормы/конкуренты, deep-research). **READ-ONLY**; платный API, без авто-трат. Связка L17 (research chain). Не trigger'ит R6.0/R6.1/R14. Вне R6/R14. ADR-019 |
| **exa MCP** *(`exa` сервер, tools `mcp__exa__*`)* | `.mcp.json` (stdio MCP, `exa-mcp-server` exa-labs; env `EXA_API_KEY` — только в env) | **research-tooling MCP** — семантическое/нейро обнаружение источников (`web_search_exa` / `web_fetch_exa`). Категория: **research-tooling** (Tooling §4.61 #88). Off-phase. Провенанс-вет ПРИНЯТ | при обнаружении источников по смыслу (что keyword-поиск пропускает). **READ-ONLY**; платный API. Связка L17. Не trigger'ит R6.0/R6.1/R14. Вне R6/R14. ADR-019 |
| **firecrawl MCP** *(`firecrawl` сервер, tools `mcp__firecrawl__*`)* | `.mcp.json` (stdio MCP, `firecrawl-mcp` Firecrawl/Mendable; env `FIRECRAWL_API_KEY` — только в env) | **research-tooling MCP** — глубокое чтение/обход веба (scrape/batch/map/search/crawl/extract + agent). Категория: **research-tooling** (Tooling §4.62 #89). Off-phase. Провенанс-вет ПРИНЯТ | при глубоком чтении страницы / обходе сайта / извлечении структурированного. **READ-ONLY** (read-тяжёлый); платный API. Связка L17. Не trigger'ит R6.0/R6.1/R14. Вне R6/R14. ADR-019 |
**Отмена:** через удаление из `~/.claude.json` или `.mcp.json`. Live-override через `/команду` для MCP не предусмотрен — MCP-серверы не имеют slash-интерфейса.
@@ -848,7 +853,7 @@ Pravila §12 (Superpowers инвокация первой), §14 (queen-роут
- **UI-пул** (#31 UPM, #32 21st) — здесь R15 не применяется; R14 pipeline ведёт (это UI-задачи по природе).
- **infrastructure** (#33 claude-md-management) — единственный канал для правок CLAUDE.md (Pravila §5 п.10 + R10.1 Блок 1).
- **authoring-tooling** (#56-#58) — политика триггеров: skill-creator ≥3 повторений workflow → новый скил; hookify повторяющаяся ошибка → новый хук (с pre-check HK1); plugin-dev — для расширений plugin-grain.
- **business-process / discovery-tooling / ml-ai-tooling / architecture-tooling / audit-security / project-management / design-tooling / integration-tooling / dev-support / finance-tooling / backend-tooling / infosec-tooling / marketing-tooling / knowledge-graph-tooling** — следуют routing-off-phase.md.
- **business-process / discovery-tooling / ml-ai-tooling / architecture-tooling / audit-security / project-management / design-tooling / integration-tooling / dev-support / finance-tooling / backend-tooling / infosec-tooling / marketing-tooling / knowledge-graph-tooling / research-tooling** — следуют routing-off-phase.md.
### 15.7. Тип правила и enforcement
+4 -2
View File
@@ -1,7 +1,7 @@
# Правила работы Claude в проекте «Лидерра»
**Версия:** v1.43 (27.05.2026)
**Дата:** 27.05.2026
**Версия:** v1.44 (14.06.2026)
**Дата:** 14.06.2026
**Назначение:** настройки проекта (Project instructions) — Claude читает этот файл в каждом чате и следует правилам ниже.
**Статус документа:** ✅ утверждён. Содержимое скопировано в поле "Project instructions" Claude.ai. Файл хранится в архиве как служебный документ.
@@ -748,6 +748,8 @@ Frontend Design и `obra/superpowers` (v5.1.0, 14 skills) — **парный sta
**Off-phase knowledge-graph-tooling (v1.43, 27.05.2026):** #86 `graphifyy` (Tooling §4.59; CLI-инструмент, установка `uv tool install graphifyy`; user-level skill `~/.claude/skills/graphify/SKILL.md` установлен через `/graphify install --platform claude`). **Активация:** через явный вызов `/graphify <команда>` — `query` / `path` / `explain` / `update` / `build`; не проактивно. Граф знаний всего портала Лидерры (docs + .claude/ + app/) для cross-layer навигации — «где вызывается функция», «как модуль X связан с Y», «структурные зависимости spec→code». Spike 27.05.2026: combined граф 6305 узлов / 6753 рёбер / 1009 communities (93% EXTRACTED / 7% INFERRED). **Артефакты `graphify-out*/` обязательно в `.gitignore`**. Backend экстракции: GEMINI_API_KEY (если есть) ИЛИ Claude Code subagent dispatch (применяется в Лидерре). Граничные правила ADR-017: KG1 (vs context7 #60 — внутренний codebase vs внешние SDK-доки), KG2 (vs Boost #10 — статический граф vs runtime-queries), KG3 (vs openapi-mcp #47 — весь проект vs один спек), KG4 (vs Sentry MCP #34 — структура vs runtime errors), KG5 (vs adr-kit #36 / mermaid #37 — auto-discovery vs manual authoring). **Девятнадцатая** off-phase подкатегория. Off-phase, не UI → вне R6.0/R6.1/R14 PSR_v1. Регулируется PSR_v1 R10.1 Блок 1 note + R15.6 knowledge-graph-tooling.
**Off-phase research-tooling (Perplexity Pack, v1.44, 14.06.2026):** Внешние MCP-серверы веб-разведки — #87 `perplexity` (Tooling §4.60; `@perplexity-ai/mcp-server`, READ-ONLY; ранжированный ответ-с-источниками поверх sonar: search/ask/research/reason; первичный «дай ответ-с-источниками»; базовый URL через AITUNNEL, ключ `PERPLEXITY_API_KEY` только в env), #88 `exa` (Tooling §4.61; `exa-mcp-server` exa-labs, READ-ONLY; семантическое/нейро обнаружение источников — web_search_exa/web_fetch_exa — находит концептуально близкое, что keyword-поиск пропускает; ключ `EXA_API_KEY` только в env), #89 `firecrawl` (Tooling §4.62; `firecrawl-mcp` Firecrawl/Mendable, READ-ONLY read-тяжёлый; глубокое чтение/обход — scrape/batch/map/search/crawl/extract + agent; ключ `FIRECRAWL_API_KEY` только в env). Все три — **READ-ONLY** (gate-постура read_only зафиксирована в коде, commit `bfc1f575`); **платные API**, ключи только в env, без авто-трат (owner waiver). Провенанс-вет IS9 (`docs/research/research-vet.md`) — все три **ПРИНЯТ** ДО формализации. Связка L17 (research chain): perplexity (ответ) → exa (обнаружение) → firecrawl (чтение). **Двадцатая** off-phase подкатегория. Off-phase, не UI → вне R6.0/R6.1/R14 PSR_v1. Счётчики инструментов — канон [Tooling Прил. Н §0](Tooling_v8_3.md). Границы — ADR-019 (RT1RT9: research-tooling = открытый веб vs context7 #60 SDK-доки / openapi #47 наш REST / Boost #10 Laravel / Sentry+Redis #34/#35 runtime / graphify #86 внутренний граф / GitHub #3 репо). Регулируется PSR_v1 R10.1 Блок 3 + R15.6 research-tooling. Plan `docs/superpowers/plans/2026-06-14-perplexity-pack-plan3-router-registry.md`.
### 13.3. Скоуп
| Тип задачи | Кто отвечает |
+44 -3
View File
File diff suppressed because one or more lines are too long
+148
View File
@@ -0,0 +1,148 @@
# ADR-019: Off-phase research-tooling (Perplexity Pack)
**Status:** Accepted
**Date:** 2026-06-14
**Контекст:** эпик «Perplexity Pack», spec `docs/superpowers/specs/2026-06-14-perplexity-pack-research-tooling-design-v3.md`, провенанс-вет `docs/research/research-vet.md`.
## Context
В тулчейне Лидерры не было выделенного слоя веб-разведки. Существующие узлы дают
знания узких типов: `context7` (#60) — документация библиотек/SDK; `openapi`-mcp (#47)
— интроспекция нашего REST-API; `Laravel Boost` (#10) — Laravel-экосистема и runtime-запросы;
`Sentry`/`Redis` MCP (#34/#35) — runtime-факты прод-системы; `graphify` (#86) — внутренний
граф проекта; `GitHub` MCP (#3) — операции с репозиторием. Ни один не покрывает **открытый
веб**: актуальные практики, нормативные требования, фич-разведку конкурентов, deep-research
с цитатами.
Три зрелых MCP-сервера закрывают этот пробел: **perplexity** (ранжированный ответ-с-источниками поверх sonar), **exa** (нейро/семантическое обнаружение источников), **firecrawl** (глубокое чтение и обход страниц). Все три присутствовали только в ветке `worktree-perplexity-pack`;
main и нормативка их не знали.
Аналогичный паттерн «новый off-phase слой» закрывался ранее: A8 infosec (ADR-014), C1
marketing (ADR-015), knowledge-graph (ADR-017). Дисциплина та же: провенанс-вет IS9 →
перенос конфигурации в main → формализация в нормативке → реестр узлов.
**Риск ecosystem.** Все три — внешние пакеты с платными API-ключами. Snyk/SentinelOne
«ToxicSkills» 2025: ≈13% маркетплейс-артефактов содержат критичные дефекты. Провенанс-гейт
IS9 (прецедент A8/C1) обязателен ДО формализации; вет завершён — `docs/research/research-vet.md`,
все три **ПРИНЯТ**.
**Решение заказчика (зафиксировано):** платные API приняты владельцем (owner waiver,
Вариант 2); ключи (`PERPLEXITY_API_KEY` / `EXA_API_KEY` / `FIRECRAWL_API_KEY`) живут только
в пользовательском окружении, никогда в репозитории.
## Decision
Принят слой **research-tooling** — новая **20-я off-phase подкатегория**, номера Tooling
**#87#89**, классификация роутера `research`.
| # | Узел | Источник | Тип | Назначение |
|---|---|---|---|---|
| 87 | perplexity MCP | `@perplexity-ai/mcp-server` | внешний MCP, READ-ONLY | ранжированный ответ-с-источниками (search/ask/research/reason; sonar) |
| 88 | exa MCP | `exa-mcp-server` (exa-labs) | внешний MCP, READ-ONLY | семантическое/нейро обнаружение источников (web_search_exa/web_fetch_exa) |
| 89 | firecrawl MCP | `firecrawl-mcp` (Firecrawl/Mendable) | внешний MCP, READ-ONLY (read-тяжёлый) | глубокое чтение и обход (scrape/batch/map/search/crawl/extract + agent) |
**Детали решений:**
1. **#87 perplexity** — первичный «дай ответ-с-источниками». Четыре инструмента поверх
sonar-моделей: `perplexity_search` (ранжированный web), `perplexity_ask` (sonar-pro
real-time), `perplexity_research` (sonar-deep-research, медленный 30s+), `perplexity_reason`
(sonar-reasoning-pro). READ-ONLY. Базовый URL через AITUNNEL-прокси (`PERPLEXITY_BASE_URL`).
2. **#88 exa** — обнаружение того, что keyword-поиск пропускает: семантический `web_search_exa` плюс `web_fetch_exa`. READ-ONLY.
3. **#89 firecrawl** — прочитать страницу целиком/обойти сайт/извлечь структурированное;
`firecrawl_agent` — автономный web-research. READ-ONLY (read-тяжёлый режим).
**Gate-постура (реализована, commit `bfc1f575`):** все инструменты трёх серверов
(`mcp__perplexity__*` / `mcp__exa__*` / `mcp__firecrawl__*`) классифицированы как **read_only**
в `tools/mcp-tool-classifier.mjs` (+тест). Это не намерение, а зафиксированный факт: router-gate
пускает их без approve, мутаций они не несут.
## Boundaries (конфликт-аудит)
- **RT1 — ↔ context7 (#60):** разные слои знаний. context7 = документация библиотек/SDK
(vendor docs известного пакета); research-tooling = открытый веб — практики, нормы,
конкуренты, новости. context7 первый для «как настроить пакет X»; research для «что
индустрия делает с Y».
- **RT2 — ↔ openapi-mcp (#47):** разный объект. openapi = наш REST-спек (introspection
endpoints/схем); research = внешние источники в вебе.
- **RT3 — ↔ Laravel Boost (#10):** разный масштаб. Boost = Laravel-экосистема и runtime-запросы
в app/; research = веб вне проекта.
- **RT4 — ↔ Sentry (#34) / Redis (#35):** разная плоскость. Sentry/Redis = runtime-факты
прод-системы (ошибки/очереди/кэш); research = внешние знания.
- **RT5 — ↔ graphify (#86):** направление. graphify = внутренний граф проекта (наружу не
ходит); research = наружу, в открытый веб. Post-mortem: graphify даёт blast radius внутри,
research приносит внешний контекст.
- **RT6 — ↔ GitHub MCP (#3):** разный канал. GitHub = операции с репозиторием/issues/PR;
research = открытый веб.
- **RT7 — внутренние слои (anti-overlap внутри пака):** хотя все три «ищут в вебе», роли
не пересекаются. **perplexity** = ранжированный ответ-с-источниками; **exa** = семантическое
обнаружение источников по смыслу; **firecrawl** = глубокое чтение/обход конкретных страниц.
Канонический порядок — связка L17: perplexity (ответ) → exa (обнаружение) → firecrawl
(глубокое чтение).
- **RT8 — платные API + запрет авто-трат:** все три держат платные ключи (прецедент MKT8
/ READ-ONLY Sentry/Redis). Ключи только в пользовательском окружении; без авто-расхода
без нужды; gitleaks стережёт утечку в репозиторий.
- **RT9 — классификация `research` ≠ analysis/knowledge_graph_query/planning:** `research`
= разведка широты во внешнем вебе на крупных/абстрактных задачах. Не перехватывает
`analysis` (статанализ кода — Semgrep/ToB), `knowledge_graph_query` (внутренний граф —
graphify), `planning` (Superpowers/CCPM). Разграничение — триггер-ключевые слова +
настоящий ADR.
## Alternatives Considered
- **Только WebSearch/WebFetch (встроенные)** — отклонено: дают сырой список/одну страницу,
без ранжированного ответа-с-источниками, без семантического обнаружения, без глубокого
обхода. research-tooling — качественный апгрейд.
- **Один сервер вместо трёх** — отклонено: роли не дублируются (RT7); ответ ≠ обнаружение ≠
глубокое чтение. Один сервер не закрывает все три потребности.
- **DEFERRED до Б-1** — отклонено: владелец принял платные API сейчас (owner waiver);
слой полезен немедленно для разведки практик/норм при проектировании.
## Consequences
**Positive:**
- Закрыт пробел «открытый веб»: 0 → 3 узла research-разведки.
- Новая **20-я off-phase подкатегория research-tooling**; номера #87#89.
- Связка **L17** research chain (`brainstorming` → perplexity → exa → firecrawl) в
routing-off-phase.md (canonical chain).
- Провенанс-вет IS9 всех трёх пройден ДО формализации — ни одного FAIL.
- Gate-постура read_only зафиксирована в коде (не декларация): мутаций нет.
**Neutral / Cautionary:**
- Платные API: расход контролируется дисциплиной (без авто-вызовов без нужды); ключи в env.
- Bulk-load MCP-инструментов исторически ронял субагентов API-ошибкой; +3 сервера
увеличивают суммарное число инструментов — митигация через deferred-tools (схемы по запросу),
риск помечен в дом-README раздела.
- `perplexity_research` медленный (30s+) — для глубоких задач, не для быстрых вопросов.
## Related Decisions
- **ADR-014** — A8 infosec-tooling; IS9-провенанс-дисциплина, прецедент платных/внешних.
- **ADR-015** — C1 marketing-tooling; паттерн «пустой/новый слой → наполнение», MKT8
(READ-ONLY + запрет авто-трат) — прямой предок RT8.
- **ADR-017** — knowledge-graph-tooling; граница «внутрь vs наружу» (graphify ↔ research, RT5).
## Enforcement
Граница research-tooling против смежных узлов (RT1–RT9) проверяется при маршрутизации: задача
«открытый веб / практики / нормы / конкуренты» → research-узлы (#87#89); задача «документация
библиотеки» → context7 (#60); «наш API» → openapi (#47); «внутренний граф» → graphify (#86);
«runtime прод» → Sentry/Redis (#34/#35). Read-only-постура трёх серверов закреплена в
`tools/mcp-tool-classifier.mjs` (+тест в `tools/mcp-tool-classifier.test.mjs`) — router-gate
пускает их без approve и блокирует любую не-read_only попытку по умолчанию. Ключи API только
в пользовательском окружении; gitleaks (pre-commit/pre-push) блокирует утечку в репозиторий.
Узлы #87#89 живут в `docs/registry/nodes.yaml` (`subcategory: research-tooling`,
`triggers.classification: research`); инвариант покрытия карточками (Машина 3-E) требует
контракт-карточку на каждый узел (`docs/registry/contracts/{perplexity,exa,firecrawl}-mcp.contract.json`).
## References
- `docs/superpowers/specs/2026-06-14-perplexity-pack-research-tooling-design-v3.md` — design (D1D9).
- `docs/research/research-vet.md` — IS9 провенанс-вет (#87/#88/#89, все ПРИНЯТ).
- `docs/research/README.md` — дом раздела research-tooling.
- `docs/Tooling_v8_3.md` §4.60–§4.62 — 9-атрибутные блоки узлов #87#89.
- `docs/Plugin_stack_rules_v1.md` R10.1 Блок 3 + R15.6 — реестр ролей MCP-серверов.
- `docs/Pravila_raboty_Claude_v1_1.md` §13.2 — Off-phase research-tooling абзац.
- `docs/routing-off-phase.md` — связка L17 (research chain) + routing #87#89.
- `.mcp.json` — три блока mcpServers (perplexity/exa/firecrawl); commit `bfc1f575` (gate read_only).
@@ -0,0 +1,12 @@
{
"skill": "exa-mcp",
"kind": "external",
"needs": ["нужно найти источники по смыслу, которые keyword-поиск пропускает"],
"produces": ["семантически близкие результаты веб-поиска (web_search_exa) + страница по URL (web_fetch_exa)"],
"constraints": ["READ-ONLY MCP, живой веб", "платный API, ключ EXA_API_KEY только в env", "обнаружение источников, НЕ ранжированный ответ (perplexity #87) и НЕ глубокое чтение (firecrawl #89)"],
"preview-form": "none",
"defaults": ["семантическое обнаружение источников по смыслу"],
"key-decisions": ["web_search_exa vs web_fetch_exa; глубина выдачи"],
"acceptance-criteria": ["найдены концептуально релевантные источники по смыслу запроса"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "firecrawl-mcp",
"kind": "external",
"needs": ["нужно прочитать страницу целиком / обойти сайт / извлечь структурированное со страниц"],
"produces": ["содержимое страниц и обхода (scrape/batch_scrape/map/search/crawl/extract) + автономный web-research (firecrawl_agent)"],
"constraints": ["READ-ONLY (read-тяжёлый) MCP, живой веб", "платный API, ключ FIRECRAWL_API_KEY только в env", "глубокое чтение/обход, НЕ ранжированный ответ (perplexity #87) и НЕ наш REST-спек (openapi #47)"],
"preview-form": "none",
"defaults": ["scrape одной страницы целиком в markdown"],
"key-decisions": ["scrape vs crawl vs extract vs agent; глубина обхода"],
"acceptance-criteria": ["получено полное/структурированное содержимое целевой страницы или обхода"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,12 @@
{
"skill": "perplexity-mcp",
"kind": "external",
"needs": ["вопрос веб-разведки: актуальные практики/нормы/конкуренты — нужен ответ-с-источниками"],
"produces": ["ранжированный web-ответ с цитатами (sonar): search/ask/research/reason"],
"constraints": ["READ-ONLY MCP, живой веб", "платный API (sonar-*), ключ PERPLEXITY_API_KEY только в env — без авто-расхода без нужды", "НЕ SDK-доки (context7 #60); НЕ внутренний граф проекта (graphify #86)"],
"preview-form": "none",
"defaults": ["ранжированный ответ-с-источниками, не сырой список ссылок"],
"key-decisions": ["search vs ask vs research vs reason; глубина (reasoning_effort)"],
"acceptance-criteria": ["получен ответ с цитируемыми источниками по запросу веб-разведки"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
+79
View File
@@ -1718,6 +1718,75 @@ nodes:
version: "0.8.20+"
spike_branch: "spike/graphify-2026-05-27"
- id: "#87"
name: "perplexity MCP"
slug: "perplexity-mcp"
category: "off-phase"
subcategory: "research-tooling"
status: "active"
dormancy_reason: null
capabilities: "MCP-сервер веб-разведки Perplexity: perplexity_search (ранжированный web-ответ), perplexity_ask (sonar-pro real-time с цитатами), perplexity_research (sonar-deep-research, многоисточниковое расследование), perplexity_reason (sonar-reasoning-pro). READ-ONLY, живой веб; назначение — ответ-с-источниками, не сырой список ссылок."
triggers:
- {keyword: "веб-разведка", weight: 1.0}
- {keyword: "актуальные практики", weight: 1.0}
- {keyword: "что говорят источники", weight: 1.0}
- {keyword: "ранжированный веб-ответ", weight: 1.0}
- {keyword: "perplexity", weight: 1.0}
- {keyword: "sonar", weight: 1.0}
- {keyword: "deep research", weight: 1.0}
- {classification: "research", weight: 1.0}
boundaries:
- {adr: "ADR-019", role: "RT1 ≠ context7 #60 (открытый веб/практики vs SDK-доки); RT4 — perplexity = ранжированный ответ vs exa #88 семантическое обнаружение"}
chain_membership: ["L17"]
attributes:
tooling_section: "§4.60 #87"
install: "npx -y @perplexity-ai/mcp-server (в .mcp.json; PERPLEXITY_API_KEY в env)"
- id: "#88"
name: "exa MCP"
slug: "exa-mcp"
category: "off-phase"
subcategory: "research-tooling"
status: "active"
dormancy_reason: null
capabilities: "MCP-сервер нейро/семантического веб-поиска Exa: web_search_exa (находит концептуально близкое, что keyword-поиск пропускает), web_fetch_exa (страница по URL). READ-ONLY, живой веб; назначение — обнаружение источников по смыслу, а не по точным словам."
triggers:
- {keyword: "семантический поиск", weight: 1.0}
- {keyword: "нейро-поиск", weight: 1.0}
- {keyword: "обнаружение источников по смыслу", weight: 1.0}
- {keyword: "концептуально близкое", weight: 1.0}
- {keyword: "exa", weight: 1.0}
- {classification: "research", weight: 1.0}
boundaries:
- {adr: "ADR-019", role: "RT4 — exa = семантическое обнаружение vs perplexity #87 ранжированный ответ vs firecrawl #89 глубокое чтение"}
chain_membership: ["L17"]
attributes:
tooling_section: "§4.61 #88"
install: "npx -y exa-mcp-server (в .mcp.json; EXA_API_KEY в env)"
- id: "#89"
name: "firecrawl MCP"
slug: "firecrawl-mcp"
category: "off-phase"
subcategory: "research-tooling"
status: "active"
dormancy_reason: null
capabilities: "MCP-сервер глубокого чтения и обхода веба Firecrawl: firecrawl_scrape / batch_scrape / map / search / crawl / extract + firecrawl_agent (автономный web-research) + firecrawl_agent_status. READ-ONLY (read-тяжёлый), живой веб; назначение — прочитать страницу целиком, обойти сайт, извлечь структурированное."
triggers:
- {keyword: "глубокое чтение страницы", weight: 1.0}
- {keyword: "обход сайта", weight: 1.0}
- {keyword: "scrape", weight: 1.0}
- {keyword: "crawl", weight: 1.0}
- {keyword: "извлечь структурированное со страницы", weight: 1.0}
- {keyword: "firecrawl", weight: 1.0}
- {classification: "research", weight: 1.0}
boundaries:
- {adr: "ADR-019", role: "RT4 — firecrawl = глубокое чтение/обход vs perplexity #87 ответ vs exa #88 обнаружение; RT3 ≠ openapi #47 (внешний веб vs наш REST-спек)"}
chain_membership: ["L17"]
attributes:
tooling_section: "§4.62 #89"
install: "npx -y firecrawl-mcp (в .mcp.json; FIRECRAWL_API_KEY в env)"
chains:
L1:
name: "feature discovery & implementation chain"
@@ -1850,3 +1919,13 @@ chains:
- "#79"
- "#80"
- "#81"
L17:
name: "research chain"
sequence:
- "superpowers:brainstorming"
- "#87"
- "#88"
- "#89"
triggers:
- {classification: "research"}
+5 -1
View File
@@ -12,7 +12,7 @@
> **Источник истины.** Tooling §4.X (детальное описание каждого узла), Pravila §13.2
> (категоризация off-phase), PSR_v1 R10.1 (3-блочный реестр ролей).
>
> **Версия.** 1.6 (22.05.2026 — C1 marketing-tooling: +10 строк routing #74-#83 + связка L16 (marketing chain), ADR-015). 1.5 (21.05.2026 — A8 install-sync: #68 ZAP + #70 Ward установлены портативно → строки routing #68/#70 обновлены, статус pending install снят, setup-доки `docs/security/{zap,ward}-setup.md`). 1.4 (21.05.2026 — A8 infosec-tooling: +6 строк routing #68-#73 + связка L15 (security go-live chain), ADR-014; #69 Nuclei/#70 Ward — CLI (не MCP), #68 ZAP/#70 Ward pending install. 1.3 (20.05.2026) — A1 backend-tooling: +4 строки routing #64-#67 + связка L14 + scope §4.11→§4.42, ADR-013. v1.2 — finance-tooling: +3 строки routing #61-#63 + связка L13 + scope, ADR-012. v1.1 18.05.2026 вечер — аудит дисциплины R15: +строка «диагностика
> **Версия.** 1.7 (14.06.2026 — research-tooling: +3 строки routing #87-#89 (классификация `research`) + связка L17 (research chain), ADR-019; узлы perplexity/exa/firecrawl, 20-я off-phase подкатегория). 1.6 (22.05.2026 — C1 marketing-tooling: +10 строк routing #74-#83 + связка L16 (marketing chain), ADR-015). 1.5 (21.05.2026 — A8 install-sync: #68 ZAP + #70 Ward установлены портативно → строки routing #68/#70 обновлены, статус pending install снят, setup-доки `docs/security/{zap,ward}-setup.md`). 1.4 (21.05.2026 — A8 infosec-tooling: +6 строк routing #68-#73 + связка L15 (security go-live chain), ADR-014; #69 Nuclei/#70 Ward — CLI (не MCP), #68 ZAP/#70 Ward pending install. 1.3 (20.05.2026) — A1 backend-tooling: +4 строки routing #64-#67 + связка L14 + scope §4.11→§4.42, ADR-013. v1.2 — finance-tooling: +3 строки routing #61-#63 + связка L13 + scope, ADR-012. v1.1 18.05.2026 вечер — аудит дисциплины R15: +строка «диагностика
> конверсии» → process-analysis #53 (M3); +note про UI-пул #31/#32 как делегирующие
> строки, не R15-routed (M1). v1.0 — Rec3 SYSTEM-аудита). Триггеры — формулировки
> заказчика или явные ключевые слова в промпте.
@@ -55,6 +55,9 @@
| `refactor` | #64 Rector | 1 |
| `refactor` | #65 PHP Insights | 1 |
| `refactor` | #19 Superpowers v5.1.0 | 0.8 |
| `research` | #87 perplexity MCP | 1 |
| `research` | #88 exa MCP | 1 |
| `research` | #89 firecrawl MCP | 1 |
| `security` | #68 OWASP ZAP | 1 |
| `security` | #69 Nuclei | 1 |
| `security` | #70 Ward | 1 |
@@ -96,6 +99,7 @@
| L14 | `Rector` (#64) → `PHP Insights` (#65) → `Larastan` (#12) → `deptrac` (#43) | backend-quality chain: авто-трансформация кода (Rector) → метрики сложности/архитектуры (PHP Insights) → типовой статанализ (Larastan) → fitness направления слоёв (deptrac). Все на одном PHP-коде, разные оси. Anti-pattern: Rector-автоправка и PHP Insights-метрика — разные фазы, не один блокирующий шаг (ADR-013). |
| L15 | `security-go-live` (#73) → статика (`gitleaks` #8 / `Semgrep` #25 / `Ward` #70 / `Trail of Bits` #39) → `pdn-152fz-audit` (#71) → `threat-model` (#72) → динамика (`Nuclei` #69 широта → `OWASP ZAP` #68 глубина, цель 127.0.0.1 IS8) | security go-live chain: единый прогон перед публикацией → вердикт GO/NO-GO. #73 оркеструет, не заменяет D3 (IS7). Anti-pattern: ZAP/Nuclei в pre-commit хук (тяжёлые, нужна запущенная цель); #73 ≠ audit-portal (полный 14-фазный аудит). ADR-014. |
| L16 | `brainstorming``marketing` (#74) → `marketing-ru` (#77) → каналы (#78 Метрика / #79 Wordstat / #80 Telegram / #81 Postiz) | marketing chain: entry-скил #74 оркеструет RU-заземлённую маркетинговую работу через специфику рынка (#77) и канальные MCP (#78-#81). Anti-pattern: #82 DataForSEO / #83 Unisender Go — DEFERRED, не использовать до Б-1. ADR-015. |
| L17 | `brainstorming``perplexity` (#87 ask/research) → `exa` (#88 discovery) → `firecrawl` (#89 deep-read) | research chain: разведка широты на крупных/абстрактных задачах — ранжированный ответ-с-источниками (perplexity) → семантическое обнаружение источников по смыслу (exa) → глубокое чтение/обход страниц (firecrawl). Anti-pattern: подмена context7 #60 (открытый веб vs SDK-доки) или graphify #86 (наружу vs внутренний граф проекта); платные API — без авто-расхода. ADR-019. |
**Anti-pattern связок** (не комбинировать в одной задаче):
@@ -0,0 +1,50 @@
# План: Perplexity Pack — реестр узлов и таблицы соответствия (Plan 3)
## Цель
Подхватить три новых off-phase узла research-tooling — perplexity #87, exa #88, firecrawl #89 — из единого источника `docs/registry/nodes.yaml` и регенерировать
все производные таблицы соответствия «задача → инструмент». Реализует раздел {#D7}
дизайна и закрывает критерий {#D8} (пункт 5 + регрессия инструментов).
Состав работы:
- В `docs/registry/nodes.yaml` добавляются три карточки узлов (#87/#88/#89) с
`category: off-phase`, `subcategory: research-tooling`, `status: active` и
`triggers.classification: research` (по форме существующих off-phase MCP-узлов
#78/#79/#80), плюс каноническая связка **L17** research chain
(`brainstorming` → perplexity → exa → firecrawl).
- Авто-регенерируемые блоки приводятся в соответствие генератором
`node tools/registry-render.mjs`: таблица соответствия в `docs/routing-off-phase.md`
(регион `auto:routing-table`) и сводка реестра в `docs/Tooling_v8_3.md`
(регион `auto:tooling-registry-summary`).
- В `docs/routing-off-phase.md` добавляется ручная строка связки L17 и поднимается
версия заголовка.
- Карта `docs/automation-graph.html` (NODE_META baseline) и
`docs/automation-graph-data.js` (NODE_SECTION) получают по три новых элемента.
- Фикстуры-счётчики `tools/registry-load.test.mjs` поднимаются под новое число узлов
(86 → 89 nodes; active 78 → 81).
- Финальная регрессия инструментов остаётся зелёной.
```skills-json
[]
```
```steps-json
[
{"op": "MultiEdit", "object": "docs/registry/nodes.yaml", "ref": "D7"},
{"op": "MultiEdit", "object": "tools/registry-load.test.mjs", "ref": "D7"},
{"op": "Bash", "object": "node tools/registry-render.mjs", "ref": "D7"},
{"op": "Edit", "object": "docs/routing-off-phase.md", "ref": "D7"},
{"op": "Edit", "object": "docs/automation-graph.html", "ref": "D7"},
{"op": "Edit", "object": "docs/automation-graph-data.js", "ref": "D7"},
{"op": "Bash", "object": "npx vitest run --root app --config vitest.config.tools.mjs", "ref": "D8"}
]
```
```verified-context-json
[
{"id": "vc1", "kind": "EXTRACTED", "ref": "tools/cost-pricing.mjs", "anchor": "export const PRICING = Object.freeze("},
{"id": "vc2", "kind": "EXTRACTED", "ref": "docs/registry/nodes.yaml", "anchor": "subcategory: \"knowledge-graph-tooling\""},
{"id": "vc3", "kind": "EXTRACTED", "ref": "docs/routing-off-phase.md", "anchor": "<!-- auto:routing-table:begin -->"}
]
```
@@ -0,0 +1,204 @@
# Дизайн: интеграция «Perplexity Pack» (off-phase research-tooling) — v3
**Дата:** 2026-06-14
**Тип:** off-phase tooling integration (research-канал MCP)
**Статус:** проектируется
**Примечание:** повтор печати после фикса таймаута тяжёлых LLM-вызовов (судья 30с→90с); содержание идентично v2, раздел D7 нейтрализован.
## Цель
Завести в тулчейн Лидерры новый off-phase слой **research-tooling** — три MCP-сервера
веб-разведки (`perplexity`, `exa`, `firecrawl`), сейчас присутствующие только в ветке
`worktree-perplexity-pack` (main не затронут, в нормативке не формализованы). Назначение
слоя — разведка широты на крупных/абстрактных задачах: актуальные практики, нормативные
требования, фич-разведка конкурентов, deep-research с цитатами. Интеграция доводится по
обкатанному паттерну off-phase (как A8 infosec, C1 marketing): провенанс-вет → перенос
конфигурации в main → формализация в нормативке → обновление реестра узлов тулчейна
(`docs/registry/nodes.yaml`) и производных от него таблиц соответствия «задача → инструмент».
```verified-context-json
[
{"id":"vc1","kind":"EXTRACTED","ref":".mcp.json","anchor":"\"$schema\": \"https://raw.githubusercontent.com/anthropics/claude-code/main/schemas/mcp.json\""},
{"id":"vc2","kind":"EXTRACTED","ref":"docs/routing-off-phase.md","anchor":"<!-- auto:routing-table:begin -->"},
{"id":"vc3","kind":"EXTRACTED","ref":"docs/security/infosec-vet.md","anchor":"Провенанс-вет внешних инструментов A8 infosec-tooling"},
{"id":"vc4","kind":"EXTRACTED","ref":"tools/cost-pricing.mjs","anchor":"export const PRICING = Object.freeze("}
]
```
## Состав пака {#D1}
**Контракт.** Слой состоит из трёх MCP-серверов, каждый — отдельный узел реестра:
- **perplexity** (`@perplexity-ai/mcp-server`) — ранжированный веб-ответ + sonar:
`perplexity_search` (web search ranked) / `perplexity_ask` (sonar-pro, real-time) /
`perplexity_research` (sonar-deep-research, цитаты) / `perplexity_reason`
(sonar-reasoning-pro). Назначение: получить ответ-с-источниками, а не сырой список.
- **exa** (`exa-mcp-server`) — нейро/семантический поиск: `web_search_exa` (находит
концептуально близкое, что keyword-поиск пропускает) / `web_fetch_exa` (страница по URL).
Назначение: обнаружение источников по смыслу.
- **firecrawl** (`firecrawl-mcp`) — глубокое чтение и обход: `firecrawl_scrape` /
`batch_scrape` / `map` / `search` / `crawl` / `extract` + `firecrawl_agent`
(автономный web-research) + `firecrawl_agent_status`. Назначение: прочитать
страницу целиком, обойти сайт, извлечь структурированное.
**Конвенция разделения (anti-overlap).** Хотя все три умеют «веб-поиск», их роли
не пересекаются по слою: perplexity — ранжированный ответ; exa — семантическое
обнаружение; firecrawl — глубокое чтение/обход. Граница закрепляется в ADR ({#D6}).
**Крайний случай.** Состав финализируется ПОСЛЕ провенанс-вета ({#D2}): любой сервер
с неприемлемым провенансом исключается из пака, остальные интегрируются как есть.
## Провенанс-вет {#D2}
**Контракт.** Перед формализацией каждого из трёх пакетов выполняется обязательный
провенанс-вет по методологии существующего `docs/security/infosec-vet.md`:
1. README + метаданные через npm registry и GitHub API — факты, не память.
2. Поля на каждый пакет: владелец/организация, лицензия, звёзды, активность коммитов,
дата последнего релиза, что инструмент исполняет (сетевые вызовы, телеметрия,
аутентификация), куда уходит трафик.
3. Вердикт: ПРИНЯТ / ОТКЛОНЁН с зафиксированной причиной.
**Артефакты.** Новый `docs/research/research-vet.md` (вет-док, единственный
авторитетный источник «какой репозиторий/версию ставить») + `docs/research/README.md`
(дом раздела, как `docs/ml/` и `docs/marketing/`).
**Крайний случай.** Платные API (sonar-*, exa, firecrawl): ключи `PERPLEXITY_API_KEY` /
`EXA_API_KEY` / `FIRECRAWL_API_KEY` живут ТОЛЬКО в пользовательском окружении и
никогда не попадают в репозиторий (правило секретов проекта; gitleaks).
**Критерий.** Вет-док завершён со статусом ЗАВЕРШЁН и таблицей вердиктов на все три
пакета; пакеты с вердиктом ОТКЛОНЁН не попадают в перенос ({#D3}).
## Перенос конфигурации {#D3}
**Контракт.** Перенос аддитивный: в `.mcp.json` (main) добавляются ровно три блока
`mcpServers` (`perplexity`, `exa`, `firecrawl`) — по образцу уже присутствующих
блоков `sentry`/`openapi` (поля `command`/`args`/`env`/`comment`). Существующие блоки
не трогаются.
**Конвенция.** Каждый блок несёт `env` с ключом через `${VAR}`-подстановку (ключ —
из пользовательского окружения, не из файла) и `comment` с назначением, источником
пакета, статусом и пином.
**Постура активации.** Active: блоки в main, ключи уже в пользовательском окружении;
при отсутствии ключа сервер обязан падать gracefully (как `sentry`), не ломая сессию.
**Безопасность правки.** Перед правкой `.mcp.json` снимается бэкап; после правки JSON
валидируется; при невалидном JSON — авто-откат из бэкапа (необратимого повреждения
прод-конфига не происходит). Правка аддитивная, существующие серверы не трогаются.
**Крайний случай / риск.** Bulk-load большого числа MCP-инструментов исторически давал
API-ошибку и ронял субагентов; +3 сервера увеличивают суммарное число инструментов.
Митигация: механизм deferred-tools (загрузка схем по запросу) + явная пометка риска
в `comment` и в дом-README, чтобы при массовом субагент-прогоне учитывать.
**Критерий.** В main `.mcp.json` присутствуют три валидных блока; JSON валиден по
объявленной `$schema`; есть бэкап и пройдена пост-валидация.
## Реестр инструментов {#D4}
**Контракт.** В `docs/Tooling_v8_3.md` Прил. Н заводится новая (20-я) off-phase
подкатегория **research-tooling** с тремя узлами: **#87 perplexity**, **#88 exa**,
**#89 firecrawl**. Каждый узел получает 9-атрибутный блок по шаблону §0.1 (как у
существующих off-phase узлов).
**Конвенция счётчиков.** §0 «КАНОН СЧЁТЧИКОВ» — единственный источник числовых
счётчиков; счётчик off-phase узлов поднимается 86→89. CLAUDE.md числа не дублирует,
а ссылается на этот канон.
**Критерий.** Три §4.x-блока добавлены; §0-счётчик согласован; cross-ref-версии
Прил. Н подняты согласованно с остальной нормативкой ({#D5}).
## Нормативная синхронизация {#D5}
**Контракт.** Через канал `claude-md-management` синхронизируются четыре нормативных
документа (атомарным version-bump-набором, как требует cross-ref-checker):
- **CLAUDE.md** — §3.3 +3 строки оперативной карты, §0 cross-refs (Pravila/PSR/Tooling),
§6 +абзац интеграции, §9 +запись, версия шапки.
- **Pravila_raboty_Claude_v1_1.md** — §13.2 +абзац «Off-phase research-tooling», версия.
- **Plugin_stack_rules_v1.md** — R10.1 Блок 3 (MCP-серверы) +3 строки, R15.6
+research-tooling, версия.
- **Tooling Прил. Н** — см. {#D4}.
**Конвенция.** Все четыре файла несут согласованные cross-ref-строки друг на друга
с поднятыми версиями; §0/footer-счётчики берутся из канона Tooling Прил. Н §0.
**Критерий.** cross-ref-checker и l1-watcher не показывают дрейфа после правок.
## Границы (ADR-019) {#D6}
**Контракт.** Новый ADR (следующий свободный номер; в плане подтверждается фактически)
закрепляет границы research-tooling против смежных узлов, чтобы не было дублей:
- vs `context7` (#60) — context7 для документации библиотек/SDK; research-tooling для
открытого веба, практик, нормативных требований, конкурентов.
- vs `openapi` (#47) — openapi для нашего REST API; research-tooling для внешних источников.
- vs `Boost` (#10) — Boost для Laravel-экосистемы; research-tooling для веба.
- vs `Sentry` (#34) / `Redis` (#35) — runtime-факты прод-системы; research-tooling — внешние знания.
- vs `graphify` (#86) — graphify по внутреннему графу проекта; research-tooling — наружу.
- vs `GitHub` MCP (#3) — GitHub для репо-операций; research-tooling — открытый веб.
**Внутренние границы.** perplexity (ранжированный ответ) / exa (семантическое
обнаружение) / firecrawl (глубокое чтение+обход) — слои из {#D1}.
**Конвенция.** ADR в формате adr-kit (Status / Context / Decision / Consequences /
Enforcement), проходит `adr-judge` (lefthook job 9) без `--llm`.
**Критерий.** ADR принят, `adr-judge` зелёный.
## Реестр узлов и таблицы соответствия {#D7}
**Контракт.** Три новых узла подхватываются из единого источника —
`docs/registry/nodes.yaml`:
- В `nodes.yaml` добавляются **три записи узлов** (#87/#88/#89) с
`subcategory: research-tooling` и `triggers.classification: "research"`.
- Из `nodes.yaml` авто-регенерируются производные: таблица соответствия «задача →
инструмент» в `docs/routing-off-phase.md` (блок между `auto:routing-table:begin`/`end`)
и карта соответствия (`registry-to-classification-map.mjs`).
- В `docs/routing-off-phase.md` добавляется каноническая связка **L17** research chain:
`brainstorming` → perplexity (ask/research) → exa (discovery) → firecrawl (deep-read).
- `docs/automation-graph.html` — три новых элемента (NODE_META baseline + NODE_SECTION).
- `tools/registry-load.test.mjs` — счётчики фикстур поднимаются под новое число узлов.
**Конвенция.** Записи узлов следуют форме существующих off-phase узлов реестра;
авто-генерируемые блоки правятся только генератором, не вручную.
**Крайний случай.** Новая классификация `research` не должна перехватывать задачи,
покрытые `analysis`/`knowledge_graph_query`/`planning`; разграничение — через ADR ({#D6}).
**Критерий.** Регенерированные таблица соответствия и карта содержат research-узлы;
`registry-load.test.mjs` зелёный.
## Критерий приёмки {#D8}
**Контракт.** Интеграция считается доделанной, когда:
1. Провенанс-вет завершён, состав пака финализирован ({#D2}).
2. Три блока в main `.mcp.json`, JSON валиден, есть бэкап ({#D3}).
3. Реестр + нормативка синхронизированы без дрейфа cross-ref ({#D4}, {#D5}).
4. ADR принят, `adr-judge` зелёный ({#D6}).
5. nodes.yaml + регенерация + карта обновлены, `registry-load.test.mjs` зелёный ({#D7}).
6. Регрессия инструментов зелёная: одиночная команда
`npx vitest run --root app --config vitest.config.tools.mjs` (база 3928 passed + 2 skip,
не ниже после правок фикстур).
7. Live-smoke трёх серверов ПОСЛЕ переноса в main и перезапуска: по одному вызову
на сервер (`perplexity_ask` / `web_search_exa` / `firecrawl_scrape`) возвращает
осмысленный ответ — подтверждает живость и ключи.
**Конвенция.** Доказательства — фактический вывод команд, не утверждения.
## Конвенция заголовков и версий {#D9}
**Контракт.** Версии и даты ведутся единообразно:
- Дата во всех новых/правленых заголовках — 2026-06-14.
- Version-bump четырёх нормативных файлов — атомарным набором с согласованными
cross-ref-строками (см. {#D5}).
- §9 CLAUDE.md и changelog получают по записи с указанием: app-фича/нет, затронуты
ли §0 cross-refs, через какой канал внесено.
- Новые узлы нумеруются строго после последнего существующего (#86) → #87/#88/#89.
**Критерий.** Заголовки и счётчики согласованы; нет «TBD»/«TODO»/полупустых разделов.
+5 -2
View File
@@ -1,7 +1,7 @@
{
"_note": "node_chosen -> L-цепочки. Только узлы, входящие хотя бы в одну L1-L13. Узлы вне цепочек (direct, прочее) НЕ включаются -> chainsFor вернёт null. Имена ключей = реальные значения primary_rationale.node_chosen (skill-id из skill_invoked). MCP/agent-узлы (laravel-boost, openapi-mcp-server, api-docs, sentry-mcp, redis-mcp, pest, github-mcp) в node_chosen не появляются, но включены для полноты покрытия цепочек L1-L13 (контролёр C6 требует, чтобы каждая L из routing-off-phase.md была покрыта). Синхронизируется с docs/routing-off-phase.md через tools/observer-chain-map-checker.mjs.",
"discovery-interview": ["L1", "L2"],
"superpowers:brainstorming": ["L1", "L16"],
"superpowers:brainstorming": ["L1", "L16", "L17"],
"superpowers:writing-plans": ["L1"],
"superpowers:subagent-driven-development": ["L1"],
"audit-portal": ["L2"],
@@ -52,5 +52,8 @@
"yandex-metrika-mcp": ["L16"],
"yandex-wordstat-mcp": ["L16"],
"telegram-mcp": ["L16"],
"postiz": ["L16"]
"postiz": ["L16"],
"perplexity-mcp": ["L17"],
"exa-mcp": ["L17"],
"firecrawl-mcp": ["L17"]
}
+6 -6
View File
@@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi
describe('registry-load', () => {
beforeEach(() => clearCache());
it('loads registry (86 nodes after #86 graphifyy added 27.05.2026)', () => {
it('loads registry (89 nodes after #87-89 research-tooling added 14.06.2026)', () => {
const r = loadRegistry();
expect(r.nodes).toHaveLength(86);
expect(r.nodes).toHaveLength(89);
expect(r.version).toBe('0.1.0');
});
@@ -43,12 +43,12 @@ describe('registry-load', () => {
expect(r.indexById.get('#1').status).toBe('historic');
});
it('findActiveNodes excludes non-active', () => {
it('findActiveNodes excludes non-active (nodes.yaml registry)', () => {
const r = loadRegistry();
const active = findActiveNodes(r);
// 86 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred,
// #84/#85/#86 (project-agents 24.05 + graphifyy 27.05) are active → 75 + 3 = 78 active
expect(active).toHaveLength(78);
// 89 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred,
// #84/#85/#86 (project-agents 24.05 + graphifyy 27.05) + #87/#88/#89 (research-tooling 14.06) are active → 78 + 3 = 81 active
expect(active).toHaveLength(81);
expect(active.map(n => n.id)).toContain('#18');
expect(active.map(n => n.id)).toContain('#19');
expect(active.map(n => n.id)).not.toContain('#1');