Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6056db3ae5 | |||
| 94a00fabd4 | |||
| 43214c6dba | |||
| 08b8ddb653 | |||
| a297275f2f | |||
| f232843983 | |||
| 0ab125f67b | |||
| 337b717f21 | |||
| 6e7fc0b6f5 | |||
| be89710426 | |||
| 7cadc7bc97 | |||
| a242d926e3 |
@@ -1,7 +1,9 @@
|
||||
# Plugin Stack Rules — Superpowers + Frontend Design (v3.22)
|
||||
# Plugin Stack Rules — Superpowers + Frontend Design (v3.23)
|
||||
|
||||
**Дата:** 22.05.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 правил R0–R16** (R15 off-phase routing введён в v3.14 на освободившийся после v2.0 R15-motion слот; R16 brain evidence loop введён в v3.16).
|
||||
**Дата:** 26.05.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 правил R0–R16** (R15 off-phase routing введён в v3.14 на освободившийся после v2.0 R15-motion слот; R16 brain evidence loop введён в v3.16). Кросс-refs актуальны: Pravila v1.43+, Tooling v2.24+, CLAUDE.md v2.29+.
|
||||
|
||||
**v3.23** — A10 BI-tooling: R10.1 Блок 1 +2 строки (**Data plugin** #84, Anthropic Verified, первичный решатель A10; **DuckDB Skills** #85, Anthropic Verified, in-memory OLAP над CSV/Parquet) + Блок 1 note (v3.23 — **analytics-patterns** #86 / **dashboard-design-review** #87 / **bi-cohort-analyst** #88 — self-authored project-скилы). Новая 19-я off-phase подкатегория **bi-tooling** (раздел A10 карты «Аналитика и отчётность (BI)»). Не UI → вне R6.0/R6.1/R14. R15.6 +bi-tooling. Содержательных изменений R0–R16: 0. Связано: Tooling v2.24+, Pravila v1.43+, CLAUDE.md v2.29+; ADR-017 (BI1–BI8); план `docs/superpowers/plans/2026-05-26-a10-bi-tooling.md`.
|
||||
|
||||
**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`.
|
||||
|
||||
@@ -448,6 +450,8 @@ Stack — **головной**. Все плагины вне stack'а — **ин
|
||||
| **finance** *(8 skills: `reconciliation` / `variance-analysis` / `financial-statements` / `close-management` / `journal-entry` / `journal-entry-prep` / `sox-testing` / `audit-support`)* | `anthropics/knowledge-work-plugins` (plugin `finance@knowledge-work-plugins`, Anthropic Verified, v1.2.0) | финансы/бухгалтерия — сверка, анализ отклонений, US-GAAP-отчётность, закрытие периода, проводки. Категория: **finance-tooling** (Tooling #61, вне UI-пула). Homed C7, cross-ref C6 | при учётно-финансовой работе. Применимость РФ: ✅ reconciliation/variance; ⚠️ US-GAAP-скилы частично; ❌ SOX-скилы not-applicable; warehouse-MCP DEFERRED (ADR-012). Не UI → вне R6.0/R6.1/R14 |
|
||||
| **marketing** *(8 skills: `competitive-brief` / `brainstorm` / `sprint-planning` и др.)* | `anthropics/knowledge-work-plugins` (plugin `marketing@knowledge-work-plugins`, Anthropic Verified) | **первичный решатель C1** — маркетинговый контент, кампании, SEO-стратегия, конкурент-брифы, email-цепочки, план кампании. Категория: **marketing-tooling** (Tooling #74, вне UI-пула). Раздел C1 карты | при маркетинговых задачах (контент / кампании / SEO-стратегия / конкурент-анализ). Не UI → вне R6.0/R6.1/R14 |
|
||||
| **brand-voice** *(3 skills)* | `anthropics/knowledge-work-plugins` (partner-built, Tribe AI) | вербальный бренд — тон голоса, согласованность маркетинговых текстов, brand-voice guidelines. Категория: **marketing-tooling** (Tooling #76, вне UI-пула). Раздел C1 карты. Парный к marketing #74 | при задачах вербального бренда (tone-of-voice, ревью маркетинговых текстов). Не UI → вне R6.0/R6.1/R14 |
|
||||
| **Data plugin** *(skills: SQL-запрос к данным, визуализация, дашборд, QA метрик, stat-тестирование)* | `anthropics/claude-plugins-official` (Anthropic Verified) | **первичный решатель A10** — ad-hoc BI: SQL к БД, построение визуализаций, создание дашбордов, QA метрик, stat-тестирование (A/B). Категория: **bi-tooling** (Tooling #84, вне UI-пула). Раздел A10 карты | при BI-задачах: ad-hoc SQL-анализ, построение дашборда, статистическая проверка метрик. BI1 — граница с Boost #10 (запросы к prod-БД только Boost READ-ONLY; Data plugin — аналитика/агрегация). Не UI → вне R6.0/R6.1/R14 |
|
||||
| **DuckDB Skills** *(skills: CSV-анализ, Parquet, in-memory OLAP)* | `anthropics/claude-plugins-official` (Anthropic Verified) | in-memory OLAP поверх CSV/Parquet — разбор выгрузок поставщика, аналитика без обращения к PostgreSQL. Категория: **bi-tooling** (Tooling #85, вне UI-пула). Cross-ref billing-audit #62 (выгрузки). Раздел A10 карты | при работе с CSV/Parquet-файлами поставщика и аналитике без доступа к БД. BI3 — граница с Data plugin: DuckDB → файловые источники, Data plugin → БД. Не UI → вне R6.0/R6.1/R14 |
|
||||
|
||||
**Блок 1 — note (v3.3):** **mermaid-skill** (Tooling #37, генератор C4/architecture-диаграмм) — вендоренный сторонний скил в `.claude/skills/mermaid/` (`WH-2099/mermaid-skill`, MIT), **не** через marketplace и **не** в `enabledPlugins`. Пассивная утилита (генерация Mermaid-исходника), не решатель — формально вне типологии трёх блоков; регистрируется здесь для полноты. Категория **architecture-tooling**, вне R6/R14.
|
||||
|
||||
@@ -469,6 +473,8 @@ Stack — **головной**. Все плагины вне stack'а — **ин
|
||||
|
||||
**Блок 1 — note (v3.20):** **Nuclei** (Tooling #69) + **Ward** (Tooling #70) — CLI-бинари (как deptrac #43 / gitleaks / squawk), **не** marketplace-плагины и **не** в `enabledPlugins`. Nuclei (`projectdiscovery/nuclei` v3.8.0, MIT, Go) — `bin/nuclei.exe`, **установлен+verified**; широкое сканирование известных уязвимостей; **CLI, не MCP** (nuclei не говорит на MCP → нет Блока 3 / l1-watcher alias). Ward (`Eljakani/ward`, MIT, Go) — безопасность настроек Laravel; **ЗАМЕНИЛ Enlightn** (abandoned/L13); **установлен 21.05** портативно (собран portable Go → `bin/ward.exe` v0.4.1, `docs/security/ward-setup.md`). **pdn-152fz-audit** (#71) + **threat-model** (#72) + **security-go-live** (#73) — self-authored project-скилы в `.claude/skills/`, **линтуются** (LINT1, как billing-audit/process-*). Каждый внешний инструмент прошёл провенанс-вет IS9 (`docs/security/infosec-vet.md`) ДО установки (риск ToxicSkills). Категория **infosec-tooling** (17-я off-phase подкатегория, раздел A8 карты), вне R6.0/R6.1/R14. ADR-014 (IS1–IS9).
|
||||
|
||||
**Блок 1 — note (v3.23):** **analytics-patterns** (Tooling #86) + **dashboard-design-review** (Tooling #87) + **bi-cohort-analyst** (Tooling #88) — self-authored project-скилы в `.claude/skills/<name>/`, **не** вендоренные сторонние и **не** через marketplace; написаны проектом (паттерн `billing-audit`/`process-*`/`marketing-ru`). **Линтуются** lefthook'ом (cspell+markdownlint), **не** в `cspell.json` `ignorePaths` / `.markdownlintignore` (LINT1, как billing-audit/process-*). Категория **bi-tooling** (19-я off-phase подкатегория, раздел A10 карты «Аналитика и отчётность (BI)»), вне R6.0/R6.1/R14. Границы — ADR-017.
|
||||
|
||||
**Блок 1 — note (v3.22):** **marketingskills** (Tooling #75) — вендоренный сторонний скил-набор в `.claude/skills/marketingskills/` (`coreyhaines31/marketingskills`, MIT, ~30k★), **не** через marketplace и **не** в `enabledPlugins`; аналог mermaid-skill/CCPM/Data Scientist по паттерну вендоринга. Содержит только Markdown-скилы (`skills/` директория) — исполняемый код в проект не включается (условие вендоринга C1-1 из `docs/security/marketing-vet.md`). Роль — **материал/резерв-библиотека** (40 маркетинговых фреймворков), не первичный решатель (маппинг на паттерн UPM #31). **marketing-ru** (Tooling #77) — self-authored project-скил в `.claude/skills/marketing-ru/`, **не** вендоренный и **не** через marketplace; написан проектом (паттерн `audit-portal`/`billing-audit`/`process-modeling`); РФ-специфика (Яндекс-каналы / 152-ФЗ согласия / конверсия лендинга Лидерры); eval 20/20. **Линтуется** lefthook'ом (cspell+markdownlint), **не** в ignorePaths (LINT1, как billing-audit/process-*). Каждый внешний инструмент прошёл провенанс-вет IS9 (`docs/security/marketing-vet.md`) ДО установки. Категория **marketing-tooling** (18-я off-phase подкатегория, раздел C1 карты), вне R6.0/R6.1/R14.
|
||||
|
||||
**Отмена:** через удаление из `enabledPlugins` в `~/.claude/settings.json` или через live-override `/имя-плагина` (R0.4.B) на одно действие.
|
||||
@@ -844,7 +850,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** — следуют 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 / bi-tooling** — следуют routing-off-phase.md.
|
||||
|
||||
### 15.7. Тип правила и enforcement
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
# Правила работы Claude в проекте «Лидерра»
|
||||
|
||||
**Версия:** v1.42 (25.05.2026)
|
||||
**Дата:** 25.05.2026
|
||||
**Версия:** v1.43 (26.05.2026)
|
||||
**Дата:** 26.05.2026
|
||||
**Назначение:** настройки проекта (Project instructions) — Claude читает этот файл в каждом чате и следует правилам ниже.
|
||||
**Статус документа:** ✅ утверждён. Содержимое скопировано в поле "Project instructions" Claude.ai. Файл хранится в архиве как служебный документ.
|
||||
|
||||
**Что изменилось в v1.43 относительно v1.42:** A10 BI-tooling — §13.2 +абзац «Off-phase bi-tooling»: #84 Data plugin (Anthropic Verified, ad-hoc BI), #85 DuckDB Skills (Anthropic, in-memory OLAP), #86 analytics-patterns + #87 dashboard-design-review + #88 bi-cohort-analyst (self-authored). 19-я off-phase подкатегория, раздел A10. Не UI → вне R6.0/R6.1/R14. Границы — ADR-017 (BI1-BI8). Архитектурных изменений §§1–12, §14–§17: 0. Связано: Tooling v2.24, PSR_v1 v3.23, CLAUDE.md v2.29; план `docs/superpowers/plans/2026-05-26-a10-bi-tooling.md`.
|
||||
|
||||
**Что изменилось в v1.42 относительно v1.41:** LLM-first router overhaul Phase 3 deferred follow-up #1 — **§17.7 «Coverage announcement» добавлен**. Правило: в каждом ответе на non-conversation задачу Claude обязан показать coverage-пометку в формате `coverage: <channel>:<id>` рядом с первым tool-вызовом или в начале текста. 6 каналов: `skill:` / `node:` / `chain:` / `hook:` / `agent:` / `direct:<exempt-класс>`. Observability layer (не enforcement) — фиксирует **намерение** выбора канала, дополняет машинный гейт `tools/router-tool-gate.mjs` который ловит **факт**. Отсутствие пометки на non-conversation эпизоде — сигнал для C5 контролёра в STATUS.md, не блокирует коммит. Граница с routing-тегом §16.7: routing-тег только для `user_directed_method`, coverage-пометка — всегда для non-conversation. Cross-ref: реестр узлов `docs/registry/nodes.yaml`, цепочки `docs/routing-off-phase.md`, парсер `tools/observer-transcript-parser.mjs` (schema v4.4+ — реализация следующим коммитом). Архитектурных изменений §§1–16: 0. Связано: §17.1–17.6 (база §17 из v1.41), §16.4 (missed-activation = симметричный отчёт о пропусках §17), spec `docs/superpowers/specs/2026-05-24-llm-first-router-overhaul-design.md`, memory `project_brain_overhaul.md`.
|
||||
|
||||
**Что изменилось в v1.41 относительно v1.40:** LLM-first router overhaul Phase 1 Tasks 4+5. **§12 «Superpowers hard rule» снят** (Task 4, commit `bca63fc6`) — полный текст в `docs/archive/llm-bootstrap-2026-05/pravila-12/Pravila_section_12.md`; §0 priority chain пересобран без §12 + добавлен «NB про §12» pointer на архив. **§17 «Universal skill-coverage rule» добавлен** (Task 5, this commit) — classifier-driven default-deny на non-conversation задачах, 5 exempt-классов §17.2, continuation НЕ exempt (D1, §17.3), enforcement через `tools/router-tool-gate.mjs` mode-flag `off/warn-only/enforce`. **§16.4 cross-refs мигрированы** (Task 4): tools/observer-classification-map.json + tools/.node-dormancy.json → docs/registry/nodes.yaml + buildClassificationMap / buildDormancyMap. **§16.5 hard-rule list:** §12 → §17. Архитектурное обоснование — **ADR-016** (new). Связано: spec `docs/superpowers/specs/2026-05-24-llm-first-router-overhaul-design.md` v2.3, plan `docs/superpowers/plans/2026-05-25-llm-first-router-overhaul.md` v1.2.
|
||||
@@ -646,6 +648,7 @@ P0 = блокер старта спринта или регуляторного
|
||||
| **v1.32** | **19.05.2026** | Observer factor-analysis extension (ADR-011 amend): §16.2 +абзац «Схема эпизода v2» (`schema_version: 2`, `decision_provenance`, `environment`, `task_size`, `task_ref`, `prompt_signal`; `outcome` `unknown` при записи; виды событий +`hook_fired`/`interrupt`/`retry`/`time_burn`/`parse_gap`); §16.3 4→5 контролёров (+C5 observer-coverage-checker, warn-only); §16.7 (новое) routing-тег-дисциплина — Stop-хук `decision: block` при навязанном методе без тега, `stop_hook_active` guard; §16.8 (новое) самодисциплина наблюдателя (`observer_error` маркер, `parse_gap` событие, C5). Spec `docs/superpowers/specs/2026-05-19-observer-factor-analysis-design.md`, plan `docs/superpowers/plans/2026-05-19-observer-factor-analysis.md`. Связано: PSR_v1 v3.17, CLAUDE.md v2.19. Архитектурных изменений в §§1–15: 0. |
|
||||
| **v1.33** | **19.05.2026** | Observer factor-analysis phase 1.1 (ADR-011 amend): §16.2 — `decision_provenance.kind` расширен до 3 значений (`autonomous` \| `user_directed_method` \| `user_chose_from_options`); 3-й kind — collaborative-choice case (заказчик выбирает один из вариантов, предложенных Claude в предыдущем ходе). §16.7 +абзац «Граница `user_chose_from_options`»: routing-gate НЕ блокирует этот kind — выбор из choice-space, сформулированного самим Claude, не навязанный извне метод; routing-тег не обязателен (детектор `tools/observer-choice-detector.mjs` детерминированный). Spec §11 `docs/superpowers/specs/2026-05-19-observer-factor-analysis-design.md` v1.1, plan `docs/superpowers/plans/2026-05-19-observer-factor-analysis-phase-1-1.md`. Связано: CLAUDE.md v2.20. Архитектурных изменений в §§1–15: 0. |
|
||||
| **v1.42** | **25.05.2026** | LLM-first router overhaul Phase 3 deferred follow-up #1: **+§17.7 «Coverage announcement»** — правило аннотировать каждую non-conversation задачу coverage-пометкой `coverage: <channel>:<id>` (6 каналов: skill/node/chain/hook/agent/direct). Observability layer (не enforcement) — фиксирует **намерение** выбора канала, дополняет машинный гейт §17.4 который ловит **факт**. Граница с routing-тегом §16.7: routing-тег только для `user_directed_method`, coverage-пометка — всегда для non-conversation. C5 controller фиксирует отсутствие пометки в STATUS.md, не блокирует коммит. Cross-ref: реестр `docs/registry/nodes.yaml`, цепочки `docs/routing-off-phase.md`, парсер `tools/observer-transcript-parser.mjs` (schema v4.4+ — реализация следующим коммитом deferred #2). Связано: spec `docs/superpowers/specs/2026-05-24-llm-first-router-overhaul-design.md`, memory `project_brain_overhaul.md`. NB: записи таблицы v1.34–v1.41 не дотянуты предыдущими сессиями (известный дрейф); шапка `«Что изменилось в v1.NN»` авторитетна для этого периода. Архитектурных изменений §§1–16: 0. |
|
||||
| **v1.43** | **26.05.2026** | A10 BI-tooling: §13.2 +абзац «Off-phase bi-tooling» — формализованы 5 инструментов раздела A10 карты «Аналитика и отчётность (BI)» (#84 Data plugin — Anthropic Verified, первичный решатель, SQL+viz+dashboard; #85 DuckDB Skills — Anthropic, in-memory OLAP над CSV/Parquet, разбор выгрузок поставщика cross-ref billing-audit #62; #86 analytics-patterns — self-authored, конвенции BI Лидерры; #87 dashboard-design-review — self-authored, дизайн-критика BI; #88 bi-cohort-analyst — self-authored, методология TTFR/UTM/funnel/A-B) как девятнадцатая off-phase подкатегория bi-tooling, раздел A10. 0 DEFERRED. Не UI → вне R6.0/R6.1/R14. Границы — ADR-017 (BI1–BI8). Связано: Tooling v2.24 / PSR_v1 v3.23 / CLAUDE.md v2.29; план `docs/superpowers/plans/2026-05-26-a10-bi-tooling.md`. Архитектурных изменений в §§1–12, §14–§17: 0. |
|
||||
|
||||
---
|
||||
|
||||
@@ -743,6 +746,8 @@ Frontend Design и `obra/superpowers` (v5.1.0, 14 skills) — **парный sta
|
||||
|
||||
**Off-phase marketing-tooling (C1, v1.39, 22.05.2026):** Инструменты раздела C1 карты «Маркетинг и лидогенерация» — #74 `marketing` (Tooling §4.49; marketplace-плагин Anthropic Verified; **первичный решатель C1** — контент-стратегия, SEO, кампании, аналитика лидогенерации), #75 `marketingskills` (Tooling §4.50; вендоренный сторонний скил MIT — расширенный маркетинговый материал/резерв; активируется как материал, не решатель), #76 `brand-voice` (Tooling §4.51; marketplace-плагин Anthropic Verified — вербальный бренд: TOV, копирайт, сообщения; обязателен при создании публичных текстов Лидерры), #77 `marketing-ru` (Tooling §4.52; self-authored project-скил `.claude/skills/marketing-ru/` — РФ-специфика: Яндекс-экосистема, РСБУ-маркетинг, 152-ФЗ в маркетинговых коммуникациях; **линтуется**, LINT1), #78 `Яндекс.Метрика MCP` (Tooling §4.53; MCP-сервер аналитики Яндекс.Метрики — READ-ONLY доступ к метрикам/отчётам/сегментам; никаких mutation-операций), #79 `Яндекс.Директ+Wordstat MCP` (Tooling §4.54; **Wordstat-only** — подбор ключевых слов и оценка спроса; управление рекламными кампаниями Direct отключено per IS9 — mutation-риск бюджета; только аналитическое READ-ONLY использование), #80 `Telegram MCP` (Tooling §4.55; MCP-интеграция Telegram Bot API — публикация в каналы/группы Лидерры; перед использованием подтверждение канала/бота от заказчика обязательно), #81 `Postiz` (Tooling §4.56; self-hosted AGPL-3.0; SMM-планировщик публикаций internal-use; AGPL-3.0 не тригерит copyleft при внутреннем деплое без распространения), #82 `DataForSEO` (Tooling §4.57; **DEFERRED** — платный API, pending Б-1/бюджет; зарегистрирован pending-слотом, как Figma MCP #44), #83 `Unisender Go` (Tooling §4.58; **DEFERRED** — email-маркетинг через уже-интегрированный transactional SMTP Лидерры; bulk-маркетинговые кампании требуют отдельного согласования заказчика и 152-ФЗ согласия; зарегистрирован pending-слотом). **Восемнадцатая** off-phase подкатегория. Off-phase, не UI → вне R6.0/R6.1/R14 PSR_v1. Яндекс.Метрика MCP + Wordstat MCP — READ-ONLY, mutation-операции запрещены (IS9-аналогия). `marketing-ru` **линтуется** (не в ignorePaths, LINT1). Счётчики инструментов — канон [Tooling Прил. Н §0](Tooling_v8_3.md). Границы — ADR-015. Регулируется PSR_v1 R10.1 Блок 1 (marketing + brand-voice плагины) + Блок 1 note (marketingskills вендорен + marketing-ru self-authored) + Блок 3 (Яндекс.Метрика/Директ+Wordstat/Telegram MCP). Установлено 22.05.2026; план `docs/superpowers/plans/2026-05-22-c1-marketing-tooling.md`.
|
||||
|
||||
**Off-phase bi-tooling (A10, v1.43, 26.05.2026):** Инструменты раздела A10 карты «Аналитика и отчётность (BI)» — #84 `Data plugin` (Tooling §4.59; marketplace-плагин Anthropic Verified — **первичный решатель A10**: SQL-аналитика, визуализации, дашборды, data quality, статистический анализ поверх БД tenant'а; RLS-aware), #85 `DuckDB Skills` (Tooling §4.60; marketplace-плагин Anthropic — in-memory OLAP над CSV/Parquet-файлами; **главный сценарий** — разбор CSV-выгрузок поставщика для C6 сверки, cross-ref billing-audit #62), #86 `analytics-patterns` (Tooling §4.61; self-authored project-скил `.claude/skills/analytics-patterns/` — конвенции BI Лидерры: ApexCharts/Chart.js паттерны поверх Vuetify, RLS-aware SQL-агрегации с tenant_id, стандартный паттерн `report_jobs` для тяжёлых отчётов, Redis-кэш агрегатов, рекомендованные индексы; **линтуется**, LINT1), #87 `dashboard-design-review` (Tooling §4.62; self-authored project-скил `.claude/skills/dashboard-design-review/` — дизайн-критика BI-визуализаций: a11y контраст на графиках WCAG 2.1 AA, выбор типа диаграммы, KPI-читаемость, соответствие Forest-палитры; pre-code рецензия, не FD-альтернатива; **линтуется**, LINT1), #88 `bi-cohort-analyst` (Tooling §4.63; self-authored project-скил `.claude/skills/bi-cohort-analyst/` — методология BI-анализа: когортный анализ TTFR/retention, UTM-аналитика источников лидов, воронка конверсии, A/B-тест, анти-паттерны интерпретации; работает в паре с Data plugin #84; **линтуется**, LINT1). **Девятнадцатая** off-phase подкатегория. Off-phase, не UI → вне R6.0/R6.1/R14 PSR_v1. self-authored скилы analytics-patterns/dashboard-design-review/bi-cohort-analyst **линтуются** (не в ignorePaths, LINT1). 0 DEFERRED. Счётчики инструментов — канон [Tooling Прил. Н §0](Tooling_v8_3.md). Границы — ADR-017 (BI1–BI8: BI1 Data vs DuckDB vs analytics-patterns роли; BI2 Data vs finance #61; BI3 DuckDB в памяти vs PostgreSQL OLTP; BI4 CSV-сверка DuckDB cross-ref billing-audit; BI5 конвенции Лидерры vs generic Data plugin; BI6 RLS-aware cross-ref laravel-backend-patterns #66; BI7 BI-дизайн vs Frontend Design #30; BI8 Forest-палитра cross-ref Brandbook v2). Регулируется PSR_v1 R10.1 Блок 1 (Data plugin + DuckDB Skills — Anthropic plugins) + Блок 1 note v3.23 (3 self-authored скила). Spec `docs/superpowers/specs/2026-05-26-a10-bi-tooling-design.md`. Установлено 26.05.2026; план `docs/superpowers/plans/2026-05-26-a10-bi-tooling.md`.
|
||||
|
||||
### 13.3. Скоуп
|
||||
|
||||
| Тип задачи | Кто отвечает |
|
||||
|
||||
+103
-8
File diff suppressed because one or more lines are too long
@@ -0,0 +1,251 @@
|
||||
# ADR-017: A10 BI-tooling — наполнение раздела карты A10
|
||||
|
||||
**Status:** Accepted
|
||||
**Date:** 2026-05-26
|
||||
**Контекст:** эпик A10 BI-tooling, spec `docs/superpowers/specs/2026-05-26-a10-bi-tooling-design.md`, plan `docs/superpowers/plans/2026-05-26-a10-bi-tooling.md`.
|
||||
|
||||
## Context
|
||||
|
||||
Раздел A10 «Аналитика и отчётность (BI)» автомат-карты Лидерры
|
||||
(`docs/automation-graph-data.js:559`) зарегистрирован как bucket A, но содержал
|
||||
**0 дедицированных узлов** — аналог состояния A8 «Информационная безопасность»
|
||||
и C1 «Маркетинг» до их соответствующих наполнений (см. ADR-014, ADR-015).
|
||||
|
||||
Спектр задач A10 по ТЗ §12-§13 и §23.10:
|
||||
|
||||
1. **Главный дашборд `/dashboard`** — 5 KPI карточек + line chart активности + pie/donut
|
||||
статусов + таблица последних сделок.
|
||||
2. **Расширенная аналитика `/analytics/advanced`** — funnel chart, тепловая карта
|
||||
(DOW × Hour), сравнение периодов, топ-проектов.
|
||||
3. **TTFR-SLA (Биз-18)** — Time To First Response p50/p95, алерт при просрочке
|
||||
`ttfr_target_minutes`.
|
||||
4. **UTM-когорты (CTO-14)** — конверсия по `utm_source` / `utm_campaign`, A/B
|
||||
сравнение `utm_content`.
|
||||
5. **Конверсия проектов 17 колонок** (§12.5.6) — паритет с оригиналом, дисциплина
|
||||
monotone-per-column.
|
||||
6. **Асинхронные отчёты `/reports`** — 6 типов (`analytics_summary`, `deals_export`,
|
||||
`funnel_conversion`, `calls_summary`, `managers_kpi`, `requested_phones`);
|
||||
очередь → PhpSpreadsheet → S3.
|
||||
7. **SaaS-админка BI (§23.10)** — выручка, маржа поставщика, сверка счетов
|
||||
crm.bp-gr.ru, журнал инцидентов.
|
||||
8. **«Анализ информации в широком смысле»** (требование заказчика 26.05.2026 в
|
||||
brainstorming-сессии) — методологическое сопровождение когортного анализа,
|
||||
поиска аномалий, интерпретации цифр.
|
||||
|
||||
Существующий тулчейн касался A10 только косвенно: `#49 Data Scientist skill`
|
||||
(ml-ai-tooling, классический ML), `#42 product-management` (`metrics-review`),
|
||||
`#10 Boost` (базовый SQL/Eloquent), `#37 mermaid-skill` (диаграммы), `#74 marketing`
|
||||
(`performance-report` overlap по UTM), `#22 Pa11y` (a11y runtime). Ни один не
|
||||
покрывает A10 как первичный решатель.
|
||||
|
||||
**Решение заказчика** (brainstorming 26.05.2026): тип плагинов A10 —
|
||||
«помогает мне писать **+** анализ информации в широком смысле». Это **Подход 2
|
||||
(Hybrid)** в brainstorming-классификации, **без** DEFERRED-части (отброшено
|
||||
отдельным выбором после уточнения списка). 5 позиций install-now, 0 DEFERRED.
|
||||
|
||||
## Decision
|
||||
|
||||
Принят **подход Hybrid** (5 install-now узлов, 0 DEFERRED). Новая **19-я
|
||||
off-phase подкатегория «bi-tooling»**, номера Tooling **#84–#88**.
|
||||
|
||||
| # | ID карты | Узел | Источник | Тип |
|
||||
|---|---|---|---|---|
|
||||
| 84 | `data_plugin` | Data plugin | Anthropic marketplace `anthropics-data` | плагин (Anthropic Verified) |
|
||||
| 85 | `duckdb_skills` | DuckDB Skills | Anthropic `claude-plugins-official` | плагин (DuckDB-powered skills) |
|
||||
| 86 | `analytics_patterns` | analytics-patterns | self-authored project-скил | свой |
|
||||
| 87 | `dashboard_design_review` | dashboard-design-review | self-authored project-скил | свой |
|
||||
| 88 | `bi_cohort_analyst` | bi-cohort-analyst | self-authored project-скил | свой |
|
||||
|
||||
**Детали ключевых решений:**
|
||||
|
||||
1. **#84 Data plugin** — Anthropic-managed «Verified» плагин (~5 271 инсталляция на
|
||||
момент design). Capabilities: генерация SQL across диалекты (PostgreSQL,
|
||||
Snowflake, BigQuery, ANSI), профилирование датасета (shape/quality),
|
||||
Python-визуализации, сборка интерактивных HTML-дашбордов, валидация качества
|
||||
данных с детектором survivorship bias, базовый стат-анализ. **Первичный
|
||||
решатель A10** для ad-hoc анализа. Сценарии в Лидерре: разбор «не сходятся
|
||||
цифры», прототипирование 6 типов отчётов §13.2, формулы funnel/heatmap,
|
||||
§23.10 SaaS-админ-запросы. Не генерирует Vue+ApexCharts production-код (это
|
||||
Python-стек) — для production есть #30 Frontend Design + #86 analytics-patterns
|
||||
(BI7).
|
||||
|
||||
2. **#85 DuckDB Skills** — Anthropic-managed DuckDB-powered скилы: чтение
|
||||
CSV/Parquet/Excel напрямую как SQL-таблиц, attach к DuckDB-базам, поиск по
|
||||
DuckDB docs, управление расширениями. **Главный сценарий в Лидерре** — разбор
|
||||
CSV-выгрузок поставщика crm.bp-gr.ru в `CsvReconcileJob` (C6 / `#62
|
||||
billing-audit`). После недавнего фикса формулы дрейфа (`3eb6c7fe`,
|
||||
`unparseable_count`) in-memory OLAP для разбора «мусора» в `project`-колонке —
|
||||
критичен. Не подключается к боевой PG (для прод-доступа есть #10/#34/#35).
|
||||
|
||||
3. **#86 analytics-patterns** — self-authored project-скил в
|
||||
`.claude/skills/analytics-patterns/` (модель `laravel-backend-patterns` #66 /
|
||||
`billing-audit` #62 / `ru-tax-accounting` #63). Кодифицирует конвенции
|
||||
BI-разработки в стеке Лидерры: выбор chart-библиотеки (ApexCharts для
|
||||
KPI/line/bar/heatmap/funnel; Chart.js для pie/donut; Vue native `<Transition>`
|
||||
для микро-анимаций), RLS-aware SQL-агрегации (`tenant_id = ?` или `SET LOCAL
|
||||
app.current_tenant_id`), паттерн `report_jobs` (queue → PhpSpreadsheet streaming
|
||||
→ S3 → notification → 7-day TTL), Redis cache 5 мин для `/api/v1/analytics/*`
|
||||
(ключ `analytics:{tenant_id}:{endpoint}:{period_hash}`), индексы (partial
|
||||
`(tenant_id, received_at)`, `(tenant_id, utm_source)`, GIN на `extras`),
|
||||
partition-awareness `deals` (month partitions, `received_at BETWEEN` для pruning),
|
||||
materialized views для >10M rows (`REFRESH CONCURRENTLY`). Линтуется (не в
|
||||
ignorePaths).
|
||||
|
||||
4. **#87 dashboard-design-review** — self-authored project-скил в
|
||||
`.claude/skills/dashboard-design-review/` (модель `audit-portal` — узкая ниша).
|
||||
Дизайн-критика BI-экранов: WCAG 2.1 AA для графиков (контраст ≥ 4.5:1, alt-text
|
||||
на `<canvas>`, паттерны для дальтоников), палитра Forest (14 OKLCH-статусов из
|
||||
Brandbook §3.6), **обязательное правило monotone-per-column** (§12.5.6 ТЗ —
|
||||
каждая колонка свой пастельный фон, heatmap-«конверсия проектов» запрещён),
|
||||
читаемость KPI-карточек (от 32px Inter `opsz`, JetBrains Mono `tnum` для чисел),
|
||||
выбор chart type (line ≥ 7 точек / bar 3–12 категорий / heatmap для 2 измерений).
|
||||
Pre-merge gate для дашборд-изменений. Линтуется.
|
||||
|
||||
5. **#88 bi-cohort-analyst** — self-authored project-скил в
|
||||
`.claude/skills/bi-cohort-analyst/` (модель `ru-tax-accounting` —
|
||||
методологический skill, не code-pattern). Методология аналитических задач:
|
||||
когортный анализ воронки (без survivorship bias), TTFR-SLA Биз-18
|
||||
(`percentile_cont` p50/p95, target_minutes vs hard-cap, связь с эскалацией
|
||||
OPEN-И-25), UTM-когорты CTO-14 (chi-square для качества трафика, sample size
|
||||
≥ 100 лидов на вариант для A/B по `utm_content`), A/B-тестирование креативов
|
||||
(frequentist z-test vs Bayesian, peeking problem, MDE), анти-паттерны
|
||||
интерпретации (correlation vs causation, Simpson's paradox, MAR/MNAR,
|
||||
selection bias, regression to the mean). Линтуется.
|
||||
|
||||
**Нумерация (PA-namespace для project-agents).** В `docs/registry/nodes.yaml` на
|
||||
момент design было 85 узлов; последние ID `#84 normative-sync` и `#85
|
||||
prod-deploy-validator` — это project-agents (CLAUDE.md v2.28), которые Pravila
|
||||
§2.4 v1.40 явно описывает как **«не входят в Tooling канон счётчиков #1-#83»**.
|
||||
Это создавало расхождение между Tooling-нумерацией (свободный ID = #84) и
|
||||
nodes.yaml-нумерацией (свободный ID = #86).
|
||||
|
||||
**Решение:** новые BI-узлы получают ID-ы в **Tooling-нумерации** (#84-#88);
|
||||
project-agents переименовываются в `nodes.yaml` на отдельный namespace
|
||||
**`PA-1` / `PA-2`** — они не часть Tooling канона. Альтернатива (#86-#90 для BI)
|
||||
отвергнута: Tooling канон становился бы разрывным, а §2.4 v1.40 явно говорит,
|
||||
что project-agents не должны занимать слоты Tooling-нумерации.
|
||||
|
||||
## Boundaries (BI1-BI8)
|
||||
|
||||
| ID | Граница | Решение |
|
||||
|----|---------|---------|
|
||||
| **BI1** | Data plugin vs `#49 Data Scientist skill` | Data plugin = BI (дашборды, агрегации, отчёты, профилирование). Data Scientist = ML (модели, фичи, прогнозы, feature engineering). Пересечение на «статистический анализ» — простую дескриптивную статистику делает Data plugin; гипотезы / тесты / моделирование — `#49 Data Scientist`. |
|
||||
| **BI2** | Data plugin vs `#10 Boost` (SQL via MCP) | Boost = Laravel/Eloquent context + базовые SQL-запросы к dev-БД. Data plugin = аналитические SQL над прод-данными (Snowflake/BigQuery/PG) + viz + dashboards. Boost не строит дашборды, не профилирует, не делает Python-визы. |
|
||||
| **BI3** | DuckDB Skills vs Boost / Sentry MCP / Redis MCP | DuckDB = in-memory OLAP над файлами (CSV/Parquet). Boost/Sentry/Redis MCP = доступ к боевым системам. Никакого пересечения, разные источники данных. |
|
||||
| **BI4** | analytics-patterns vs `#66 laravel-backend-patterns` | laravel-backend-patterns = generic backend-конвенции (controller→service→job, RLS, деньги bcmath). analytics-patterns = специфические правила BI-кода (chart libs, report_jobs паттерн, кэш агрегаций, индексы под аналитику). Overlap = 0 — разные доменные срезы. |
|
||||
| **BI5** | dashboard-design-review vs `#30` Frontend Design vs `#46` Design plugin vs `#22` Pa11y | Frontend Design = общий UI design (Vue+Vuetify, любые экраны). Design plugin = дизайн-критика на этапе дизайн-макетов (pre-code). Pa11y = runtime a11y audit любой страницы. dashboard-design-review = BI-специфическая критика (monotone vs heatmap, KPI читаемость, chart-a11y). Пересечение с Pa11y — только на runtime-аудите дашбордов; dashboard-design-review добавляет BI-конвенции, которые axe-core не проверяет (monotone правило, формат цифр, выбор chart type). |
|
||||
| **BI6** | bi-cohort-analyst vs `#49 Data Scientist` vs `#42 metrics-review` | Data Scientist = классический ML. metrics-review (product-management) = product-метрики уровня OKR/roadmap. bi-cohort-analyst = операционная аналитика воронки Лидерры (TTFR, UTM, A/B, funnel). Разные временные горизонты и уровни абстракции. |
|
||||
| **BI7** | Data plugin scope vs production code | Data plugin генерирует Python-визы и HTML-дашборды для **ad-hoc анализа** (для меня и для Claude). Production-код дашборда `/analytics/advanced` остаётся в Vue+ApexCharts через Frontend Design + analytics-patterns. Не путать «инструмент для анализа» с «инструмент для написания продакшн UI». |
|
||||
| **BI8** | Категория `bi-tooling` vs `ml-ai-tooling` | bi-tooling (новая, 19-я off-phase) — BI/дашборды/отчёты/operational analytics. ml-ai-tooling (10-я, существует) — ML/LLM-eval/data science. Узлы могут иметь cross-ref (Data plugin + Data Scientist), но primary категория одна. |
|
||||
|
||||
## Alternatives Considered
|
||||
|
||||
- **Big-bang 10+ позиций** — отвергнут. Включал MCP Toolbox for Databases
|
||||
(`googleapis/genai-toolbox`, 15.3k★) и McKinsey-style visualization vendored
|
||||
skill. Причины отклонения: mcp-toolbox дублирует `#10 Boost` для базового
|
||||
SQL-доступа (BI2); McKinsey-style viz оптимизирован под presentation decks /
|
||||
PDF-отчёты, не embed dashboards, и не ложится на Forest-эстетику портала.
|
||||
|
||||
- **Minimum (2 позиции)** — отвергнут. Только Data plugin + 1 self-authored.
|
||||
Не покрывает «анализ информации в широком смысле» — пропущены методология
|
||||
(bi-cohort-analyst) и дизайн-критика (dashboard-design-review).
|
||||
|
||||
- **Hybrid с DEFERRED (5+3)** — модифицирован заказчиком. Изначально
|
||||
предложено: 5 install + 3 DEFERRED (Amplitude / Metabase MCP / Superset MCP).
|
||||
Заказчик 26.05.2026 явно сказал «убери эти 3 DEFERRED». Финал — 5 install + 0
|
||||
DEFERRED. Если в будущем потребуется embeddable BI (Metabase/Superset) —
|
||||
отдельный ADR и spec.
|
||||
|
||||
- **Embeddable BI как замена части аналитики** — отвергнут на уровне
|
||||
Approach question. В brainstorming заказчик выбрал Вариант А+ (помогают писать
|
||||
и анализ в широком смысле), не Вариант В (заменить часть аналитики готовым BI).
|
||||
Решение зафиксировано в `docs/observer/episodes-2026-05.jsonl` эпизодом
|
||||
26.05.2026.
|
||||
|
||||
- **Mailchimp / Google Analytics / Amplitude как product-analytics SaaS** —
|
||||
out of scope этой интеграции (Amplitude отложен до Б-1 / возможной потребности
|
||||
product-analytics на tenant-уровне; GA низкий приоритет для РФ-рынка).
|
||||
|
||||
## Consequences
|
||||
|
||||
**Positive:**
|
||||
|
||||
- A10 непуст: 0 → 5 дедицированных узлов (+ 6 cross-ref-связей на существующие
|
||||
узлы #49/#42/#37/#10/#74/#22 через `NODE_SECTION_SECONDARY`).
|
||||
- Новая **19-я off-phase подкатегория «bi-tooling»**, номера Tooling #84–#88.
|
||||
- 3 цепочки в `routing-off-phase.md`: **L17 BI exploration** (Data plugin →
|
||||
DuckDB → analytics-patterns), **L18 Dashboard authoring** (Frontend Design →
|
||||
analytics-patterns → dashboard-design-review), **L19 Cohort analysis**
|
||||
(bi-cohort-analyst → Data plugin → Data Scientist).
|
||||
- Anthropic-managed база (Data + DuckDB) — ~60% возможностей раздела без авторской
|
||||
работы; платных подписок не требует.
|
||||
- 3 self-authored skills заземлены в нашем стеке (ApexCharts/Chart.js, RLS,
|
||||
`report_jobs`, Forest-палитра, ТЗ §12.5/§12.6) — не generic-материал.
|
||||
- PA-namespace для project-agents (rename `#84/#85` → `PA-1/PA-2`) развязывает
|
||||
конфликт нумерации nodes.yaml vs Tooling канона; будущие интеграции
|
||||
project-агентов используют namespace `PA-N`.
|
||||
|
||||
**Neutral / Cautionary:**
|
||||
|
||||
- **Авторская работа ~8-10 часов** на 3 self-authored skills + ~2-3 часа evals.
|
||||
Сопоставимо с предыдущими self-authored интеграциями (`billing-audit`,
|
||||
`marketing-ru`, `pdn-152fz-audit`). Митигация: subagent-driven-development через
|
||||
Sonnet, по одному skill за раз.
|
||||
- **Data plugin Python-only.** Не генерирует Vue+ApexCharts production-код.
|
||||
Митигация — чёткое разделение в analytics-patterns (BI7): Data plugin для
|
||||
ad-hoc анализа, Frontend Design + analytics-patterns для production-кода.
|
||||
- **bi-cohort-analyst риск академизма** — методологический skill может стать
|
||||
«учебником статистики» вместо инструмента. Митигация: evals на **реальных**
|
||||
вопросах заказчика из истории сессий (`docs/observer/episodes-2026-05.jsonl`),
|
||||
не из теоретических примеров.
|
||||
- **19-я off-phase подкатегория** — рост сложности нормативки (Tooling §0
|
||||
table, PSR_v1 R15.6, Pravila §13.2), но строго в рамках сложившегося паттерна
|
||||
A8/C1/finance/backend; единая операция normative-sync через `PA-1`.
|
||||
- **Coverage discipline на 12+ turns реализации** — каждый turn реализации
|
||||
требует coverage-аннотации по §17.7. Risk = пропуск. Митигация: classifier-вывод
|
||||
(Sonnet 4.6) подсказывает coverage; C5 controller surface отсутствие в
|
||||
STATUS.md.
|
||||
|
||||
## Related Decisions
|
||||
|
||||
- **ADR-011** — brain governance / nodes.yaml как SoT (после LLM-first router
|
||||
overhaul); contracts для `subcategory`, `triggers`, `boundaries`,
|
||||
`chain_membership`, `capabilities`.
|
||||
- **ADR-012** — C6/C7 finance-tooling; паттерн «пустой раздел → наполнение»
|
||||
закрепления; `billing-audit` как образец self-authored project-скила для
|
||||
доменного анализа (cross-ref BI4).
|
||||
- **ADR-014** — A8 infosec-tooling; нумерация #68–#73 (настоящий ADR продолжает
|
||||
#84–#88 после #74-#83 marketing); провенанс-дисциплина IS9 для внешних
|
||||
инструментов (для A10 не активирована — Data plugin и DuckDB Skills —
|
||||
Anthropic-managed, провенанс по умолчанию доверенный).
|
||||
- **ADR-015** — C1 marketing-tooling; ближайший образец off-phase интеграции
|
||||
(8 install + 2 DEFERRED → A10: 5 install + 0 DEFERRED); 18-я off-phase
|
||||
подкатегория (A10 становится 19-й).
|
||||
- **Pravila §2.4 v1.40** — project-agents не входят в Tooling канон; обоснование
|
||||
rename `#84/#85` → `PA-1/PA-2`.
|
||||
- **Pravila §17 v1.42** — universal skill-coverage; контекст для coverage
|
||||
discipline (§17.7) на каждом turn реализации этой интеграции.
|
||||
|
||||
## References
|
||||
|
||||
- `docs/superpowers/specs/2026-05-26-a10-bi-tooling-design.md` — design (узлы
|
||||
1-5, BI1-BI8, alternatives, риски, DoD).
|
||||
- `docs/superpowers/plans/2026-05-26-a10-bi-tooling.md` — план реализации
|
||||
(Tasks 1-19, coverage per task).
|
||||
- `docs/observer/notes/2026-05-26-a10-bi-tooling-checkpoint.md` — checkpoint
|
||||
Tasks 1-4 (registry + schema fixtures).
|
||||
- `docs/registry/nodes.yaml` — 5 узлов `subcategory: bi-tooling` (Tasks 2-3, уже
|
||||
закоммичены).
|
||||
- `tools/registry-load.test.mjs` — fixtures `expectedNodeCount 85→90`,
|
||||
`+bi-tooling` subcategory, `PA-N` id pattern (Task 4, уже закоммичен).
|
||||
- `docs/Tooling_v8_3.md` §4.59–§4.63 — 9-атрибутные блоки узлов #84–#88
|
||||
(будут добавлены Task 6).
|
||||
- `docs/Pravila_raboty_Claude_v1_1.md` §13.2 — Off-phase bi-tooling абзац
|
||||
(будет добавлен Task 7).
|
||||
- `docs/Plugin_stack_rules_v1.md` R10.1 / R15.6 — реестр ролей + список
|
||||
off-phase подкатегорий (будут обновлены Task 8).
|
||||
- `CLAUDE.md` §3.3 + §6 + §9 — строки #84–#88 + абзац фазы + version-bump
|
||||
(будут обновлены Task 9).
|
||||
- `docs/routing-off-phase.md` — связки L17/L18/L19 (будут добавлены Task 10).
|
||||
- `docs/automation-graph-data.js` — 5 узлов A10 + 6 cross-ref-связей (будет
|
||||
обновлён Task 11, browser-smoke).
|
||||
@@ -118,6 +118,13 @@ const NODES = [
|
||||
{ id: 'mcp_dataforseo', label: 'MCP:\nDataForSEO\n(DEFERRED)', group: 'mcp', size: 18, ring: 5, ...pos(5, 470) },
|
||||
{ id: 'mcp_unisender', label: 'MCP:\nUnisender Go\n(DEFERRED)', group: 'mcp', size: 18, ring: 5, ...pos(5, 480) },
|
||||
|
||||
// A10 BI-tooling (26.05.2026) — раздел «Аналитика и отчётность (BI)»
|
||||
{ id: 'data_plugin', label: 'plugin:\nData (Anthropic)', group: 'plugins', size: 18, ring: 5, ...pos(5, 490) },
|
||||
{ id: 'duckdb_skills', label: 'plugin:\nDuckDB Skills', group: 'plugins', size: 18, ring: 5, ...pos(5, 500) },
|
||||
{ id: 'analytics_patterns', label: 'skill:\nanalytics-patterns', group: 'skills_proj', size: 18, ring: 5, ...pos(5, 510) },
|
||||
{ id: 'dashboard_design_review', label: 'skill:\ndashboard-design-review', group: 'skills_proj', size: 18, ring: 5, ...pos(5, 520) },
|
||||
{ id: 'bi_cohort_analyst', label: 'skill:\nbi-cohort-analyst', group: 'skills_proj', size: 18, ring: 5, ...pos(5, 530) },
|
||||
|
||||
// ── ХУКИ (13) — S+infra + E (economy/skill/brain) ───
|
||||
{ id: 'hk_session', label: 'SessionStart:\ncontext-inject', group: 'hooks', size: 24, ring: 4, ...pos(4, 100) },
|
||||
{ id: 'hk_economy', label: 'UserPromptSubmit:\neconomy-mode', group: 'hooks', size: 22, ring: 4, ...pos(4, 95) },
|
||||
@@ -465,6 +472,21 @@ const EDGES = [
|
||||
E('sk_marketing_ru', 'mcp_telegram', 'канал мессенджера (L16)'),
|
||||
E('sk_marketing_ru', 'postiz', 'канал соцсетей (L16)'),
|
||||
|
||||
// ── A10 BI-TOOLING (26.05.2026) — связи 5 новых узлов + L17/L18/L19 chains ──
|
||||
E('tooling', 'data_plugin', '§4.59 #A10 — реестр (Data plugin)'),
|
||||
E('tooling', 'duckdb_skills', '§4.60 #A10 — реестр (DuckDB Skills)'),
|
||||
E('tooling', 'analytics_patterns', '§4.61 #A10 — реестр (BI-конвенции)'),
|
||||
E('tooling', 'dashboard_design_review', '§4.62 #A10 — реестр (BI-дизайн-критика)'),
|
||||
E('tooling', 'bi_cohort_analyst', '§4.63 #A10 — реестр (методология BI)'),
|
||||
// L17 BI exploration: Data plugin → DuckDB (CSV) → analytics-patterns (production)
|
||||
E('data_plugin', 'duckdb_skills', 'CSV/Parquet ad-hoc (L17)'),
|
||||
E('data_plugin', 'analytics_patterns', 'ad-hoc → production-код (L17)'),
|
||||
// L18 Dashboard authoring: FD → analytics-patterns → dashboard-design-review
|
||||
E('analytics_patterns', 'dashboard_design_review', 'pre-merge ревью (L18)'),
|
||||
// L19 Cohort analysis: bi-cohort-analyst → Data plugin → Data Scientist (если ML)
|
||||
E('bi_cohort_analyst', 'data_plugin', 'методология → исполнение (L19)'),
|
||||
E('bi_cohort_analyst', 'data_scientist', 'если нужны статметоды (L19, BI6)'),
|
||||
|
||||
// ── A8 INFOSEC-TOOLING (21.05.2026) — связи 6 новых узлов + L15 chain ──
|
||||
E('tooling', 'mcp_zap', '§4.X #A8 — реестр (DAST)'),
|
||||
E('tooling', 'nuclei', '§4.X #A8 — реестр (CVE CLI)'),
|
||||
@@ -660,29 +682,34 @@ const NODE_SECTION = {
|
||||
mkt_plugin: 'C1', mkt_skills: 'C1', brand_voice: 'C1', sk_marketing_ru: 'C1',
|
||||
mcp_metrika: 'C1', mcp_ya_direct: 'C1', mcp_telegram: 'C1', postiz: 'C1',
|
||||
mcp_dataforseo: 'C1', mcp_unisender: 'C1',
|
||||
// A10 BI-tooling (26.05.2026) — раздел «Аналитика и отчётность (BI)»
|
||||
data_plugin: 'A10', duckdb_skills: 'A10', analytics_patterns: 'A10',
|
||||
dashboard_design_review: 'A10', bi_cohort_analyst: 'A10',
|
||||
};
|
||||
// Вторичная классификация: узел первично в NODE_SECTION, дополнительно — в этих
|
||||
// разделах (кросс-реф). Введено A3-интеграцией 17.05.2026 — раздел A3 наполняется
|
||||
// частично кросс-реф существующих интеграционных инструментов. NODE_SECTION 1:1 не трогается.
|
||||
const NODE_SECTION_SECONDARY = {
|
||||
mcp_boost: ['A3', 'C6', 'C7'],
|
||||
mcp_boost: ['A3', 'C6', 'C7', 'A10'],
|
||||
context7: ['A3', 'C6'],
|
||||
ag_pest: ['A3', 'C6', 'C7'],
|
||||
mcp_semgrep: ['A3'],
|
||||
mcp_sentry: ['A3', 'C6'],
|
||||
// C10 business-process 17.05.2026 — кросс-реф reuse-инструментов раздела «Бизнес-процессы»
|
||||
mermaid_skill: ['C10'],
|
||||
mermaid_skill: ['C10', 'A10'],
|
||||
arch_patterns: ['C10'],
|
||||
ccpm: ['C10'],
|
||||
product_mgmt: ['C10', 'C6'],
|
||||
product_mgmt: ['C10', 'C6', 'A10'],
|
||||
sk_wplans: ['C10'],
|
||||
// C1 marketing-tooling (22.05.2026) — cross-ref: marketing-ru затрагивает 152-ФЗ согласия (D2)
|
||||
sk_marketing_ru: ['D2'],
|
||||
// finance-tooling C6+C7 (20.05.2026) — finance cross-ref + reuse-классификация
|
||||
finance_plugin: ['C6'],
|
||||
lh_larastan: ['C6'], mcp_redis: ['C6'],
|
||||
data_scientist: ['C6', 'C7'], ops_plugin: ['C6', 'C7'],
|
||||
data_scientist: ['C6', 'C7', 'A10'], ops_plugin: ['C6', 'C7'],
|
||||
process_modeling: ['C6'], process_analysis: ['C6'],
|
||||
// A10 BI-tooling cross-refs (26.05.2026) — marketing-плагин даёт UTM-аналитику в BI
|
||||
mkt_plugin: ['A10'],
|
||||
};
|
||||
|
||||
// ════════════════════════════════════════════════════
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Brain Status (auto-generated)
|
||||
|
||||
Last updated: 2026-05-25T14:59:12.388Z
|
||||
Last updated: 2026-05-25T14:59:14.464Z
|
||||
|
||||
| Контролёр | Состояние | Детали |
|
||||
|---|---|---|
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
# A10 BI-tooling integration — checkpoint note
|
||||
|
||||
**Date:** 2026-05-26
|
||||
**Type:** off-phase integration (in-progress)
|
||||
**Scope:** 5 узлов (#84-#88), 19-я подкатегория `bi-tooling`
|
||||
**Branch:** `feat/a10-bi-tooling` (pushed to origin)
|
||||
**Spec:** [docs/superpowers/specs/2026-05-26-a10-bi-tooling-design.md](../../superpowers/specs/2026-05-26-a10-bi-tooling-design.md)
|
||||
**Plan:** [docs/superpowers/plans/2026-05-26-a10-bi-tooling.md](../../superpowers/plans/2026-05-26-a10-bi-tooling.md)
|
||||
**ADR:** ADR-017 (planned, не создан) — границы BI1-BI8
|
||||
|
||||
## Что сделано за эту сессию (Tasks 1-4 из 19)
|
||||
|
||||
Регистровый слой полностью закрыт, ветка запушена.
|
||||
|
||||
| Task | Commit | Файл | Что |
|
||||
|---|---|---|---|
|
||||
| 1 | `a242d926` | spec + plan | Setup на ветку feat/a10-bi-tooling |
|
||||
| 2 | `7cadc7bc` | nodes.yaml | normative-sync #84 → PA-1; prod-deploy-validator #85 → PA-2; pair-refs обновлены |
|
||||
| 3 | `be897104` | nodes.yaml | +5 BI nodes #84 Data plugin / #85 DuckDB Skills / #86 analytics-patterns / #87 dashboard-design-review / #88 bi-cohort-analyst (90 nodes total, +110 lines) |
|
||||
| 4 | `6e7fc0b6` | schema.json + registry-load.test | id+pair patterns принимают PA-N; expectedNodeCount 85→90; active 77→82. 88/88 tests pass |
|
||||
|
||||
## Что осталось (Tasks 5-19, ~8-10 часов)
|
||||
|
||||
1. **Task 5** — ADR-017 BI-tooling (BI1-BI8 + 4 alternatives + 6 risks)
|
||||
2. **Tasks 6-9** — normative sync 4 файлов (через `normative-sync` agent / PA-1):
|
||||
- Tooling Прил. Н v2.23 → v2.24 (§4.59-§4.63 + §0 counter 83→88 + 19-я подкатегория)
|
||||
- Pravila v1.42 → v1.43 (§13.2 +абзац bi-tooling)
|
||||
- PSR_v1 v3.22 → v3.23 (R10.1 +2 строки + R15.6 +bi-tooling)
|
||||
- CLAUDE.md v2.28 → v2.29 (§3.3 +5 строк + §6 + §9 + cross-refs)
|
||||
3. **Task 10** — routing-off-phase.md +L17/L18/L19
|
||||
4. **Task 11** — automation-graph-data.js +5 узлов + 6 cross-ref + browser smoke
|
||||
5. **Task 12** — Data plugin + DuckDB Skills install в `~/.claude/settings.json` (ручной шаг, user-level)
|
||||
6. **Tasks 13-16** — 3 self-authored skills (`analytics-patterns` / `dashboard-design-review` / `bi-cohort-analyst`) + evals — субагент-парадигма
|
||||
7. **Task 17** — regression check (markdownlint + lychee + gitleaks + cross-ref-checker + l1-watcher + browser smoke)
|
||||
8. **Task 18** — observer note для brain-retro (полная версия после завершения)
|
||||
9. **Task 19** — pre-merge review + push (опц. PR создание)
|
||||
|
||||
## Что заметить при brain-retro
|
||||
|
||||
- **Numbering conflict resolved cleanly** — project-agents переименованы в PA-namespace, BI получает Tooling-нумерацию непрерывно. Schema.json понадобилось обновить (pattern `^(#\d+|PA-\d+)$`). Это **архитектурное** изменение реестра — следующие интеграции project-агентов используют PA-N namespace.
|
||||
- **Quirk #111** — pre-commit gitleaks висит на больших добавлениях — использовал `LEFTHOOK=0` для setup-коммита (1692 lines) per known workaround.
|
||||
- **Самописные скилы** — 3 skill'а требуют ~6 часов авторской работы, оптимально через Sonnet-субагентов в чистом контексте.
|
||||
- **Coverage discipline** — каждый task носил `coverage: <канал>:<id>` first-line. Соблюдено по всем 4 закрытым task'ам.
|
||||
|
||||
## Метрики на момент checkpoint
|
||||
|
||||
- Узлы в `nodes.yaml`: 85 → 90 (+5 BI)
|
||||
- Активные узлы: 77 → 82 (+5 BI)
|
||||
- Off-phase подкатегории: 18 → **будет 19** (bi-tooling — добавляется на Task 6 в Tooling Прил. Н)
|
||||
- ADRs: 016 → **будет 017** (на Task 5)
|
||||
- Versions normative files: ожидают bump (Tasks 6-9)
|
||||
|
||||
## Routing chains queued (Task 10)
|
||||
|
||||
- **L17 BI exploration**: Data plugin → DuckDB Skills → analytics-patterns
|
||||
- **L18 Dashboard authoring**: Frontend Design → analytics-patterns → dashboard-design-review
|
||||
- **L19 Cohort analysis**: bi-cohort-analyst → Data plugin → Data Scientist (#49 cross-ref)
|
||||
+113
-3
@@ -1630,6 +1630,116 @@ nodes:
|
||||
tooling_section: "§4.58 #83"
|
||||
|
||||
- id: "#84"
|
||||
name: "Data plugin"
|
||||
slug: "data-plugin"
|
||||
category: "off-phase"
|
||||
subcategory: "bi-tooling"
|
||||
status: "active"
|
||||
dormancy_reason: null
|
||||
capabilities: "Главный решатель A10 BI: пишет SQL across диалекты (PG/Snowflake/BigQuery/ANSI), профилирует датасеты (shape/quality), генерирует Python-визы публикационного качества, собирает интерактивные HTML-дашборды, валидирует качество данных (детектор survivorship bias), делает базовый стат-анализ. Anthropic Verified marketplace plugin."
|
||||
triggers:
|
||||
- {keyword: "ad-hoc analysis", weight: 1.0}
|
||||
- {keyword: "напиши sql", weight: 1.0}
|
||||
- {keyword: "профилирование данных", weight: 1.0}
|
||||
- {keyword: "не сходятся цифры", weight: 1.0}
|
||||
- {keyword: "dashboard prototype", weight: 1.0}
|
||||
- {keyword: "разобрать выгрузку", weight: 0.8}
|
||||
boundaries:
|
||||
- {adr: "ADR-017", role: "BI7 — не генерирует Vue+ApexCharts production-код (Python-стек). Для production — Frontend Design #30 + analytics-patterns #86"}
|
||||
- {adr: "ADR-017", role: "BI1 — простая дескриптивная статистика тут; гипотезы/тесты/ML — #49 Data Scientist"}
|
||||
chain_membership: ["L17", "L19"]
|
||||
attributes:
|
||||
tooling_section: "§4.59 #84"
|
||||
|
||||
- id: "#85"
|
||||
name: "DuckDB Skills"
|
||||
slug: "duckdb-skills"
|
||||
category: "off-phase"
|
||||
subcategory: "bi-tooling"
|
||||
status: "active"
|
||||
dormancy_reason: null
|
||||
capabilities: "In-memory OLAP queries поверх файлов (CSV/Parquet/Excel) напрямую как SQL-таблиц. Attach к DuckDB-базам, поиск по DuckDB docs, управление расширениями. Главный сценарий в Лидерре — разбор CSV-выгрузок поставщика crm.bp-gr.ru в CsvReconcileJob (раздел C6)."
|
||||
triggers:
|
||||
- {keyword: "разобрать csv", weight: 1.0}
|
||||
- {keyword: "in-memory sql", weight: 1.0}
|
||||
- {keyword: "duckdb", weight: 1.0}
|
||||
- {keyword: "csv reconcile drift", weight: 1.0}
|
||||
- {keyword: "сверка с поставщиком", weight: 0.9}
|
||||
boundaries:
|
||||
- {adr: "ADR-017", role: "BI3 — не подключается к боевой PG; для прод-доступа есть #10 Boost / #34 Sentry MCP / #35 Redis MCP"}
|
||||
chain_membership: ["L17"]
|
||||
attributes:
|
||||
tooling_section: "§4.60 #85"
|
||||
|
||||
- id: "#86"
|
||||
name: "analytics-patterns"
|
||||
slug: "analytics-patterns"
|
||||
category: "off-phase"
|
||||
subcategory: "bi-tooling"
|
||||
status: "active"
|
||||
dormancy_reason: null
|
||||
capabilities: "Конвенции BI-разработки в стеке Лидерры (self-authored project skill): выбор ApexCharts vs Chart.js, RLS-aware SQL-агрегации, паттерн report_jobs (queue + PhpSpreadsheet streaming + S3 + 7-day TTL), Redis cache 5 мин для /api/v1/analytics/*, индексы под аналитику, partition-awareness deals, materialized views для >10M rows."
|
||||
triggers:
|
||||
- {keyword: "написать дашборд", weight: 1.0}
|
||||
- {keyword: "report_jobs", weight: 1.0}
|
||||
- {keyword: "apexcharts", weight: 1.0}
|
||||
- {keyword: "формула funnel", weight: 0.9}
|
||||
- {keyword: "rls агрегация", weight: 1.0}
|
||||
- {keyword: "xlsx экспорт", weight: 0.9}
|
||||
boundaries:
|
||||
- {adr: "ADR-017", role: "BI4 — generic backend conventions (controller→service→job, money) — #66 laravel-backend-patterns"}
|
||||
- {adr: "ADR-017", role: "BI5 — UI design generally — #30 Frontend Design; BI-specific design critique — #87 dashboard-design-review"}
|
||||
chain_membership: ["L17", "L18"]
|
||||
attributes:
|
||||
tooling_section: "§4.61 #86"
|
||||
skill_file: ".claude/skills/analytics-patterns/SKILL.md"
|
||||
|
||||
- id: "#87"
|
||||
name: "dashboard-design-review"
|
||||
slug: "dashboard-design-review"
|
||||
category: "off-phase"
|
||||
subcategory: "bi-tooling"
|
||||
status: "active"
|
||||
dormancy_reason: null
|
||||
capabilities: "Дизайн-критика BI-экранов (self-authored project skill): WCAG 2.1 AA для графиков, цветовая дисциплина Forest, monotone-per-column vs heatmap (§12.5.6 ТЗ правило), читаемость KPI-карточек, выбор chart type. Pre-merge gate для дашборд-изменений."
|
||||
triggers:
|
||||
- {keyword: "ревью дашборда", weight: 1.0}
|
||||
- {keyword: "a11y графика", weight: 1.0}
|
||||
- {keyword: "monotone vs heatmap", weight: 1.0}
|
||||
- {keyword: "kpi-карточки", weight: 0.9}
|
||||
- {keyword: "цвет графика", weight: 0.8}
|
||||
boundaries:
|
||||
- {adr: "ADR-017", role: "BI5 — runtime a11y axe-core — #22 Pa11y; design-критика дизайн-макетов — #46 Design plugin; general UI — #30 Frontend Design"}
|
||||
chain_membership: ["L18"]
|
||||
attributes:
|
||||
tooling_section: "§4.62 #87"
|
||||
skill_file: ".claude/skills/dashboard-design-review/SKILL.md"
|
||||
|
||||
- id: "#88"
|
||||
name: "bi-cohort-analyst"
|
||||
slug: "bi-cohort-analyst"
|
||||
category: "off-phase"
|
||||
subcategory: "bi-tooling"
|
||||
status: "active"
|
||||
dormancy_reason: null
|
||||
capabilities: "Методология аналитических задач (self-authored project skill): когортный анализ воронки, TTFR-SLA (Биз-18) p50/p95, UTM-когорты (CTO-14), A/B-тестирование креативов (z-test/Bayesian/sample size/peeking problem), анти-паттерны интерпретации (correlation vs causation, Simpson's paradox, MAR/MNAR, regression to the mean)."
|
||||
triggers:
|
||||
- {keyword: "почему конверсия упала", weight: 1.0}
|
||||
- {keyword: "когортный анализ", weight: 1.0}
|
||||
- {keyword: "ttfr", weight: 1.0}
|
||||
- {keyword: "utm когорты", weight: 1.0}
|
||||
- {keyword: "a/b тест", weight: 1.0}
|
||||
- {keyword: "достаточно ли данных", weight: 0.9}
|
||||
- {keyword: "statistical significance", weight: 0.9}
|
||||
boundaries:
|
||||
- {adr: "ADR-017", role: "BI1, BI6 — classical ML / прогнозы — #49 Data Scientist"}
|
||||
- {adr: "ADR-017", role: "BI6 — product OKR / roadmap metrics — #42 product-management metrics-review"}
|
||||
chain_membership: ["L19"]
|
||||
attributes:
|
||||
tooling_section: "§4.63 #88"
|
||||
skill_file: ".claude/skills/bi-cohort-analyst/SKILL.md"
|
||||
|
||||
- id: "PA-1"
|
||||
name: "normative-sync"
|
||||
slug: "normative-sync"
|
||||
category: "off-phase"
|
||||
@@ -1644,14 +1754,14 @@ nodes:
|
||||
- {keyword: "закрыли задачу синк", weight: 0.9}
|
||||
boundaries:
|
||||
- {relation: "Контроллер обязан звать после закрытия крупной off-phase интеграции, brain governance артефакта, принятого ADR — Pravila §2.4"}
|
||||
- {pair: "#85", relation: "Парный project-агент — оба не входят в Tooling-канон счётчиков (#1-#83), это .claude/agents/ файлы"}
|
||||
- {pair: "PA-2", relation: "Парный project-агент — оба не входят в Tooling-канон счётчиков (#1-#83), это .claude/agents/ файлы. PA-namespace (post 2026-05-26 BI-tooling integration) развязал нумерацию с Tooling каноном — освободил #84/#85 для BI-узлов."}
|
||||
chain_membership: []
|
||||
attributes:
|
||||
agent_file: ".claude/agents/normative-sync.md"
|
||||
spec: "docs/superpowers/specs/2026-05-24-controller-offload-agents-design.md §3"
|
||||
tooling_section: null
|
||||
|
||||
- id: "#85"
|
||||
- id: "PA-2"
|
||||
name: "prod-deploy-validator"
|
||||
slug: "prod-deploy-validator"
|
||||
category: "off-phase"
|
||||
@@ -1666,7 +1776,7 @@ nodes:
|
||||
- {keyword: "ready to deploy", weight: 1.0}
|
||||
boundaries:
|
||||
- {relation: "Контроллер обязан звать перед любым выкатом на liderra.ru — Pravila §2.4. READ-ONLY по дизайну."}
|
||||
- {pair: "#84", relation: "Парный project-агент"}
|
||||
- {pair: "PA-1", relation: "Парный project-агент"}
|
||||
chain_membership: []
|
||||
attributes:
|
||||
agent_file: ".claude/agents/prod-deploy-validator.md"
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
"type": "object",
|
||||
"required": ["id", "name", "slug", "category", "status", "triggers"],
|
||||
"properties": {
|
||||
"id": { "type": "string", "pattern": "^#\\d+$" },
|
||||
"id": { "type": "string", "pattern": "^(#\\d+|PA-\\d+)$" },
|
||||
"name": { "type": "string", "minLength": 3 },
|
||||
"slug": { "type": "string", "pattern": "^[a-z0-9-]+(:[a-z0-9-]+)*$" },
|
||||
"category": { "enum": ["phase-0", "phase-1", "phase-2", "phase-3", "off-phase"] },
|
||||
@@ -45,7 +45,7 @@
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"adr": { "type": "string", "pattern": "^ADR-\\d{3}$" },
|
||||
"pair": { "type": "string", "pattern": "^#\\d+$" },
|
||||
"pair": { "type": "string", "pattern": "^(#\\d+|PA-\\d+)$" },
|
||||
"relation": { "type": "string" },
|
||||
"role": { "type": "string" }
|
||||
}
|
||||
|
||||
@@ -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 (26.05.2026 — A10 BI-tooling: +3 связки L17 (BI exploration) / L18 (Dashboard authoring) / L19 (Cohort analysis), ADR-017; auto-таблица routing #84-#88 пересоберётся из nodes.yaml). 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-аудита). Триггеры — формулировки
|
||||
> заказчика или явные ключевые слова в промпте.
|
||||
@@ -45,9 +45,11 @@
|
||||
| `marketing` | #81 Postiz | 1 |
|
||||
| `monitoring` | #34 Sentry MCP | 1 |
|
||||
| `monitoring` | #35 Redis MCP | 1 |
|
||||
| `normative_sync_needed` | PA-1 normative-sync | 1 |
|
||||
| `planning` | #19 Superpowers v5.1.0 | 1 |
|
||||
| `planning` | #41 CCPM | 1 |
|
||||
| `planning` | #42 product-management | 1 |
|
||||
| `prod_deploy_imminent` | PA-2 prod-deploy-validator | 1 |
|
||||
| `refactor` | #11 Laravel Pint | 1 |
|
||||
| `refactor` | #12 Larastan | 1 |
|
||||
| `refactor` | #43 deptrac | 1 |
|
||||
@@ -95,6 +97,9 @@
|
||||
| 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 | `Data plugin` (#84) → `DuckDB Skills` (#85, для CSV-выгрузок) → `analytics-patterns` (#86, если результат идёт в production-код) | BI exploration chain: разовый аналитический разбор «не сходятся цифры» / «разбери выгрузку» / «откуда дубли в отчёте». #84 берёт SQL+viz, #85 разбирает CSV без обращения к боевой PG, #86 переводит ad-hoc в production-конвенции. Anti-pattern: #84 для production-кода Vue+ApexCharts (BI7 — это #30 + #86). ADR-017. |
|
||||
| L18 | `Frontend Design` (#30) → `analytics-patterns` (#86) → `dashboard-design-review` (#87) | Dashboard authoring chain: код дашборда/визуальной аналитики в production Vue+ApexCharts. #30 — общий UI (Vue+Vuetify) → #86 — BI-конвенции Лидерры (chart libs, RLS, report_jobs, Redis-cache) → #87 — pre-merge дизайн-критика (a11y / monotone-per-column / KPI-читаемость). Anti-pattern: #84 Data plugin вместо #30+#86 (Python-стек, не production Vue). ADR-017. |
|
||||
| L19 | `bi-cohort-analyst` (#88) → `Data plugin` (#84, исполнение SQL) → `Data Scientist` (#49, если нужны статметоды) | Cohort analysis chain: методологический вопрос про метрики / A-B / funnel («почему конверсия упала», «достаточно ли данных», TTFR p95 Биз-18). #88 ведёт по методу (когорта → segment → confounder), #84 исполняет SQL/viz, #49 — для гипотез/тестов/моделирования (BI6 — границы). Anti-pattern: #88 + #42 metrics-review (разные горизонты — операционная аналитика воронки vs OKR/roadmap). ADR-017. |
|
||||
|
||||
**Anti-pattern связок** (не комбинировать в одной задаче):
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,276 @@
|
||||
# A10 BI-tooling integration — design
|
||||
|
||||
**Status:** Ready for writing-plans (brainstorming complete, 5 open questions resolved 26.05.2026, awaiting final user review)
|
||||
**Date:** 2026-05-26
|
||||
**Author:** Claude (через `superpowers:brainstorming`)
|
||||
**Related:**
|
||||
|
||||
- [docs/CRM_bp-gr_Инструкция_v8_5.md §12-§13](../../CRM_bp-gr_Инструкция_v8_5.md) — главное ТЗ, дашборд + отчёты
|
||||
- [docs/CRM_bp-gr_Инструкция_v8_5.md §23.10](../../CRM_bp-gr_Инструкция_v8_5.md) — SaaS-админка BI
|
||||
- [docs/Tooling_v8_3.md Прил. Н](../../Tooling_v8_3.md) — реестр (текущая v2.23 = 83 узла)
|
||||
- [docs/registry/nodes.yaml](../../registry/nodes.yaml) — SoT узлов после LLM-first router overhaul (85 узлов с project-agents)
|
||||
- [docs/Pravila_raboty_Claude_v1_1.md §17](../../Pravila_raboty_Claude_v1_1.md) — universal skill-coverage (заменил §12)
|
||||
- [Prior integration: ADR-015 marketing-tooling](../../adr/015-marketing-tooling.md) — образец off-phase интеграции по тому же паттерну, что A8 / C1 / A11 / C10 (заметим: marketing был 8 install + 2 DEFERRED; A10 — 5 install + 0 DEFERRED)
|
||||
|
||||
## Context
|
||||
|
||||
Раздел A10 «Аналитика и отчётность (BI)» автомат-карты Лидерры (`docs/automation-graph-data.js:559`) зарегистрирован как bucket A, но содержит **0 узлов** — аналог состояния A8 «Информационная безопасность» и C1 «Маркетинг» до их соответствующих наполнений (см. ADR-014, ADR-015).
|
||||
|
||||
Спектр задач раздела (по ТЗ §12-§13 и §23.10):
|
||||
|
||||
1. **Главный дашборд `/dashboard`** — 5 KPI карточек + line chart активности + pie/donut статусов + таблица последних сделок
|
||||
2. **Расширенная аналитика `/analytics/advanced`** — funnel chart, тепловая карта (DOW × Hour), сравнение периодов, топ-проектов
|
||||
3. **TTFR-SLA (Биз-18)** — Time To First Response p50/p95, алерт при просрочке `ttfr_target_minutes`
|
||||
4. **UTM-когорты (CTO-14)** — конверсия по `utm_source` / `utm_campaign`, A/B сравнение `utm_content`
|
||||
5. **Конверсия проектов 17 колонок** (§12.5.6) — паритет с оригиналом, monotone-per-column дисциплина
|
||||
6. **Асинхронные отчёты `/reports`** — 6 типов (`analytics_summary`, `deals_export`, `funnel_conversion`, `calls_summary`, `managers_kpi`, `requested_phones`); очередь → PhpSpreadsheet → S3
|
||||
7. **SaaS-админка BI (§23.10)** — выручка, маржа поставщика, сверка счетов crm.bp-gr.ru, журнал инцидентов
|
||||
8. **«Анализ информации в широком смысле»** (требование заказчика 26.05.2026 в brainstorming-сессии) — методологическое сопровождение когортного анализа, поиска аномалий, интерпретации цифр
|
||||
|
||||
Существующий тулчейн касается A10 только через сторонние пересечения: `#49 Data Scientist skill` (ml-ai-tooling, классический ML), `#42 product-management` (`metrics-review` скил), `#10 Boost` (базовый SQL/Eloquent), `#37 mermaid-skill` (диаграммы), `#74 marketing` (`performance-report` overlap по UTM), `#22 Pa11y` (a11y runtime). Ни один из них не покрывает A10 как первичный решатель.
|
||||
|
||||
**Решение заказчика** (brainstorming-сессия 26.05.2026): тип плагинов A10 — «помогает мне писать **+** анализ информации в широком смысле». Это **Подход 2 (Hybrid)** в моей brainstorming-классификации, **без** DEFERRED-части (отброшено отдельным выбором заказчика после уточнения списка). 5 позиций install-now, 0 DEFERRED.
|
||||
|
||||
## Decision
|
||||
|
||||
Наполнить раздел A10 пятью узлами:
|
||||
|
||||
### Узел 1 — Data plugin (Anthropic Verified)
|
||||
|
||||
- **Источник:** marketplace `anthropics-data` (https://claude.com/plugins/data) — Anthropic-managed, помечен «Anthropic Verified», ~5 271 инсталляция на момент design.
|
||||
- **Категория:** off-phase / bi-tooling
|
||||
- **Capabilities:** генерация SQL across диалекты (PostgreSQL, Snowflake, BigQuery, общий ANSI), профилирование датасета (shape/quality), Python-визуализации публикационного качества, сборка интерактивных HTML-дашбордов, **валидация качества данных** с детектором ловушек (survivorship bias и подобные), базовый статистический анализ.
|
||||
- **Сценарии в Лидерре:**
|
||||
- Ad-hoc разбор «не сходятся цифры» — Claude профилирует таблицу `deals` или `report_jobs`, ловит дубли/пустые/выбросы
|
||||
- Прототипирование 6 типов отчётов §13.2 — Claude пишет SQL и сразу показывает превью данных
|
||||
- Подсказки для §12.5 расширенной аналитики — формулы funnel, heatmap, period comparison
|
||||
- §23.10 SaaS-админка — ad-hoc запросы «выручка по тенантам за месяц», «маржа на лиде по B1/B2/B3 за неделю»
|
||||
- **Не делает:** не генерирует Vue+ApexCharts/Chart.js production-код (это Python-стек плагина) — для production-кода используется Frontend Design #30 + наш self-authored `analytics-patterns` (узел 3)
|
||||
- **Лицензия:** Anthropic-managed, бесплатно для пользователей Claude
|
||||
|
||||
### Узел 2 — DuckDB Skills (Anthropic marketplace)
|
||||
|
||||
- **Источник:** marketplace `anthropics/claude-plugins-official` или эквивалент (категория database в [marketplace.json](https://github.com/anthropics/claude-plugins-official/blob/main/.claude-plugin/marketplace.json))
|
||||
- **Категория:** off-phase / bi-tooling
|
||||
- **Capabilities:** DuckDB-powered скилы — чтение CSV/Parquet/Excel напрямую как SQL-таблиц, attach к DuckDB-базам, поиск по DuckDB/DuckLake docs, прошлые session logs, управление расширениями DuckDB
|
||||
- **Сценарии в Лидерре:**
|
||||
- **Главный** — разбор CSV-выгрузок поставщика crm.bp-gr.ru в `CsvReconcileJob` (раздел C6 / `#62 billing-audit`). После недавнего фикса формулы дрейфа (`3eb6c7fe`, поле `unparseable_count`) важно иметь in-memory OLAP для разбора «мусора» в `project`-колонке.
|
||||
- Outbound webhook payloads / supplier-leads CSV — сравнение двух дампов за минуту без обращения к боевой PG
|
||||
- Ad-hoc анализ pg_dump'ов — «сколько лидов в марте 2026 пришло из B2 без UTM» без перегрузки прода
|
||||
- **Не делает:** не подключается к боевой PG (для прод-доступа есть `#10 Boost`, `#34 Sentry MCP`, `#35 Redis MCP`)
|
||||
- **Лицензия:** Anthropic-managed, бесплатно
|
||||
|
||||
### Узел 3 — `analytics-patterns` (self-authored project skill)
|
||||
|
||||
- **Источник:** `.claude/skills/analytics-patterns/` (создаётся в рамках интеграции, по образцу `laravel-backend-patterns` #66 / `billing-audit` #62 / `ru-tax-accounting` #63)
|
||||
- **Категория:** off-phase / bi-tooling
|
||||
- **Capabilities:** конвенции BI-разработки в стеке Лидерры:
|
||||
- Выбор chart-библиотеки: ApexCharts для KPI/line/bar/heatmap/funnel; Chart.js — допустимый альтернатив для pie/donut; Vue native `<Transition>` для микро-анимаций (motion-runtime сняты в v1.88, см. CLAUDE.md §2)
|
||||
- RLS-aware SQL-агрегации — все запросы должны включать `tenant_id = ?` или работать в контексте `SET LOCAL app.current_tenant_id`. Утечка между тенантами — критическая ошибка
|
||||
- Паттерн `report_jobs` — POST `/api/v1/reports` → `pending` → queue worker (queue `reports`, не `default`) → PhpSpreadsheet streaming → S3 → `done` + email + in-app notification → файл живёт 7 дней (`expires_at`)
|
||||
- Кэш Redis 5 мин — все агрегации `/api/v1/analytics/*` (см. §12.6 ТЗ); ключ `analytics:{tenant_id}:{endpoint}:{period_hash}`; invalidation при `deals.status_changed` event
|
||||
- PhpSpreadsheet streaming для XLSX — `Xlsx::setUseDiskCaching(true)` или Reader Iterator, чтобы не выжечь память при 50k+ строк (требование CTO-7 — лимит 3 одновременных отчёта на тенанта)
|
||||
- Индексы под аналитику — `(tenant_id, received_at)` partial WHERE NOT deleted, `(tenant_id, utm_source) WHERE utm_source IS NOT NULL`, GIN на JSONB `extras`
|
||||
- Партиционирование awareness — `deals` партиционируется по `received_at` месяцами (`y2026_m05`); запросы на span месяцев должны иметь явный `received_at BETWEEN` для partition pruning
|
||||
- Performance over 10M+ rows — если Redis-кэш 5 мин не справляется (heavy SQL держит ≥1 сек, чрезмерный CPU на read-replica): materialized view'ы для типовых дашборд-агрегаций (KPI-блок, funnel, top-projects) с `REFRESH MATERIALIZED VIEW CONCURRENTLY` по cron-у; или предагрегаты в отдельных таблицах под Lambda-архитектуру. ТЗ §12.6 говорит только про Redis — это расширение паттерна для >10M rows
|
||||
- **Сценарии:** Claude пишет код дашборда / отчёта / API-эндпоинта аналитики
|
||||
- **Eval:** 20+ задач из ТЗ §12.6 и §13.2; формат eval (общий для всех 3 self-authored skills этой интеграции) — JSON с полями `user_prompt` + `expected_node` + `reasoning`, по образцу evals в `marketing-ru` / `billing-audit`
|
||||
- **Лицензия:** project-internal
|
||||
|
||||
### Узел 4 — `dashboard-design-review` (self-authored project skill)
|
||||
|
||||
- **Источник:** `.claude/skills/dashboard-design-review/`, по образцу `audit-portal` (узкая ниша: критика дашбордов)
|
||||
- **Категория:** off-phase / bi-tooling
|
||||
- **Capabilities:** дизайн-критика BI-экранов:
|
||||
- WCAG 2.1 AA для графиков: контраст ≥ 4.5:1, alt-text для каждого `<canvas>`, читаемость для дальтоников (паттерны + цвета, не только цвет), screen-reader поддержка legend (`role="img"` + `aria-label`)
|
||||
- Палитра Forest (Brandbook v2): 14 OKLCH-статусов из §3.6 для статус-графиков; primary Teal `#0F6E56` для активных метрик; warm ivory `#F6F3EC` для page background; теало-нуар `#012019` только для sidebar
|
||||
- **Monotone per column vs heatmap** — обязательное правило §12.5.6 ТЗ. Каждая колонка получает свой пастельный фон, **не зависящий от значения**. Heatmap для «конверсия проектов» **запрещён** (паритет с оригиналом + аргумент против визуального шума)
|
||||
- Читаемость KPI-карточек: цифры от 32px (Inter `opsz` axis), численные значения — JetBrains Mono `tnum`, формат `₽` после числа, тренд-бейдж со стрелкой (зелёный/красный) и `%` изменения
|
||||
- Когда line vs bar vs heatmap: line — временные ряды от 7 точек; bar — категориальные сравнения от 3 до 12 категорий; heatmap — два измерения (DOW × Hour, по §12.5.2 ТЗ)
|
||||
- **Сценарии:** ревью PR с дашборд-изменениями; pre-merge gate на «нет регресса a11y/палитры»
|
||||
- **Не дублирует:** `#22 Pa11y` (runtime axe-core), `#30 Frontend Design plugin` (общий UI), `#46 Design plugin` (дизайн-критика дизайна, не code). `dashboard-design-review` — про BI-специфику, не general UI
|
||||
- **Eval:** 15+ задач (примеры дашбордов с/без a11y-violations, с monotone/heatmap дилеммами)
|
||||
- **Лицензия:** project-internal
|
||||
|
||||
### Узел 5 — `bi-cohort-analyst` (self-authored project skill)
|
||||
|
||||
- **Источник:** `.claude/skills/bi-cohort-analyst/`, по образцу `ru-tax-accounting` (методологический skill, не code-pattern)
|
||||
- **Категория:** off-phase / bi-tooling
|
||||
- **Capabilities:** методология аналитических задач:
|
||||
- **Когортный анализ воронки.** Как правильно считать конверсию по статусам, чтобы не было survivorship bias; почему `COUNT(paid) / COUNT(*)` врёт когда сделки в разных стадиях; счёт по «когортам created_at месяцами» vs «всё time-aggregate»; cohort retention curve
|
||||
- **TTFR-SLA (Биз-18).** Определение «первого касания» — изменение `status` ИЛИ `activity_log` event типа `deal.viewed`/`deal.commented` в карточке. Метрики p50 / p95 (`percentile_cont`), почему среднее не показывает SLA, target_minutes vs hard-cap, связь с эскалацией (OPEN-И-25)
|
||||
- **UTM-когорты (CTO-14).** Сравнение `utm_source`: chi-square test для качества трафика; statistical significance для A/B `utm_content`; sample size calculator (минимум 100 лидов на вариант перед conclusion); сравнение `utm_campaign` за 30/90 дней с trend decomposition
|
||||
- **A/B-тестирование креативов.** Frequentist (z-test для конверсии) vs Bayesian подход; когда останавливать тест (sequential testing pitfalls — peeking problem); minimum detectable effect; control of false discovery rate при multiple comparisons
|
||||
- **Анти-паттерны интерпретации.** Correlation vs causation (классика); Simpson's paradox (когда aggregate vs subgroup противоречат); MAR vs MNAR в пропущенных значениях; reverse causation; selection bias (особенно в «лиды, которых менеджер успел открыть»); regression to the mean
|
||||
- **Сценарии:** заказчик спрашивает «почему конверсия упала в апреле?» → skill ведёт Claude по методу поиска причины (cohort decomposition → segment analysis → confounder check); вопрос «можно ли уже сказать что креатив B лучше?» → проверка sample size + significance
|
||||
- **Не дублирует:** `#49 Data Scientist skill` — тот про классический ML/моделирование/feature engineering; `bi-cohort-analyst` — про BI-специфические аналитические задачи воронки Лидерры
|
||||
- **Eval:** 20+ задач (реальные вопросы заказчика типа «почему конверсия упала», «достаточно ли данных для вывода», «какая метрика TTFR актуальна»)
|
||||
- **Лицензия:** project-internal
|
||||
|
||||
## Boundaries (BI1-BI8)
|
||||
|
||||
| ID | Граница | Решение |
|
||||
|----|---------|---------|
|
||||
| **BI1** | Data plugin vs #49 Data Scientist skill | Data plugin = BI (дашборды, агрегации, отчёты, профилирование). Data Scientist = ML (модели, фичи, прогнозы, feature engineering). Пересечение на «статистический анализ» — простую дескриптивную статистику делает Data plugin; гипотезы / тесты / моделирование — #49 Data Scientist. |
|
||||
| **BI2** | Data plugin vs #10 Boost (SQL via MCP) | Boost = Laravel/Eloquent context + базовые SQL-запросы к dev-БД. Data plugin = аналитические SQL над прод-данными (Snowflake/BigQuery/PG) + viz + dashboards. Boost не строит дашборды, не профилирует, не делает Python-визы. |
|
||||
| **BI3** | DuckDB Skills vs Boost/Sentry MCP/Redis MCP | DuckDB = in-memory OLAP над файлами (CSV/Parquet). Boost/Sentry/Redis MCP = доступ к боевым системам. Никакого пересечения, разные источники данных. |
|
||||
| **BI4** | analytics-patterns vs #66 laravel-backend-patterns | laravel-backend-patterns = generic backend-конвенции (контроллер→сервис→джоб, RLS, деньги bcmath). analytics-patterns = специфические правила BI-кода (chart libs, report_jobs паттерн, кэш агрегаций, индексы под аналитику). Overlap = 0 — разные доменные срезы. |
|
||||
| **BI5** | dashboard-design-review vs #30 Frontend Design plugin vs #46 Design plugin vs #22 Pa11y | Frontend Design = общий UI design (Vue+Vuetify, любые экраны). Design plugin = дизайн-критика на этапе дизайн-макетов (pre-code). Pa11y = runtime a11y audit любой страницы. dashboard-design-review = BI-специфическая критика (monotone vs heatmap, KPI читаемость, chart-a11y). Пересечение с Pa11y — только на runtime-аудите дашбордов; dashboard-design-review добавляет BI-конвенции, которые axe-core не проверяет (monotone правило, формат цифр, выбор chart type). |
|
||||
| **BI6** | bi-cohort-analyst vs #49 Data Scientist vs #42 metrics-review | Data Scientist = классический ML. metrics-review = product-метрики уровня OKR/roadmap. bi-cohort-analyst = операционная аналитика воронки Лидерры (TTFR, UTM, A/B, funnel). Разные временные горизонты и уровни абстракции. |
|
||||
| **BI7** | Data plugin scope vs production code | Data plugin генерирует Python-визы и HTML-дашборды для **ad-hoc анализа** (для меня и для Claude). Production-код дашборда `/analytics/advanced` остаётся в Vue+ApexCharts через Frontend Design + analytics-patterns. Не путать «инструмент для анализа» с «инструмент для написания продакшн UI». |
|
||||
| **BI8** | Категория «bi-tooling» vs «ml-ai-tooling» | bi-tooling (новая, 19-я off-phase) — BI/дашборды/отчёты/operational analytics. ml-ai-tooling (10-я, существует) — ML/LLM-eval/data science. Узлы могут иметь cross-ref (Data plugin + Data Scientist), но primary категория одна. |
|
||||
|
||||
## Узлы реестра и нумерация
|
||||
|
||||
**Проблема нумерации post-LLM-first-router-overhaul.** В `docs/registry/nodes.yaml` (85 узлов) последние ID — `#84 normative-sync` и `#85 prod-deploy-validator` (project-agents, добавлены в CLAUDE.md v2.28). Эти project-agents явно отмечены «**не входят в Tooling канон счётчиков #1-#83**».
|
||||
|
||||
Это создаёт **расхождение** между:
|
||||
|
||||
- **Tooling Прил. Н нумерация** — следующий свободный ID = **#84**
|
||||
- **`docs/registry/nodes.yaml` нумерация** — следующий свободный ID = **#86**
|
||||
|
||||
**Решение:** новые BI-узлы получают ID-ы в **Tooling-нумерации** (#84-#88), но в `nodes.yaml` регистрируются с теми же ID-ами `#84`-`#88`. Project-agents `normative-sync` / `prod-deploy-validator` **переименовываются** в `nodes.yaml` на отдельный namespace (`PA-1` / `PA-2`) — они не часть Tooling канона, и Pravila §2.4 v1.40 их так и описывает.
|
||||
|
||||
**Альтернатива (рассмотрено и отвергнуто):** оставить project-agents под #84/#85, BI-узлам дать #86-#90. Отвергнуто потому что:
|
||||
|
||||
- Tooling канон счётчиков становится разрывным (после #83 → пропуск #84/#85 → #86)
|
||||
- Pravila §2.4 v1.40 явно говорит «project-агенты не входят в Tooling канон» — значит они не должны занимать слоты Tooling-нумерации
|
||||
|
||||
**Реализация:** [`normative-sync` agent](../../../.claude/agents/normative-sync.md) (после собственного переименования в `PA-1`) выполняет sync 4 нормативных файлов согласно решению выше.
|
||||
|
||||
**Финальные ID:**
|
||||
|
||||
- `#84` — Data plugin
|
||||
- `#85` — DuckDB Skills
|
||||
- `#86` — analytics-patterns
|
||||
- `#87` — dashboard-design-review
|
||||
- `#88` — bi-cohort-analyst
|
||||
|
||||
## Cross-ref на существующие узлы (без новых ID)
|
||||
|
||||
При наполнении A10 эти узлы получают **secondary section attribute** `NODE_SECTION_SECONDARY = "A10"`:
|
||||
|
||||
- `#49 Data Scientist skill` — углубление в стат-методы и ML (BI6)
|
||||
- `#42 product-management` — `metrics-review` skill (BI6, продуктовые метрики)
|
||||
- `#37 mermaid-skill` — диаграммы потоков данных в дашборде
|
||||
- `#10 Boost` — базовый SQL через MCP к dev-БД
|
||||
- `#74 marketing` — `performance-report` skill (overlap по UTM-аналитике)
|
||||
- `#22 Pa11y` — runtime a11y проверка дашбордов (BI5)
|
||||
|
||||
## Влияние на счётчики тулчейна
|
||||
|
||||
- **До:** 83 формализованных позиций, 18 off-phase подкатегорий
|
||||
- **После:** 88 формализованных позиций, **19** off-phase подкатегорий (+ **bi-tooling**, 19-я)
|
||||
- **Tooling Прил. Н §0:** счётчик 83→88 (+5 install позиций). DEFERRED не добавляем — 0 новых в этой интеграции. Off-phase row counter: +5. Точная разбивка active/deferred/dormant — фиксируется агентом `normative-sync` при синке.
|
||||
- **`docs/registry/nodes.yaml`:** 85→90 узлов; PA-namespace для project-agents (после переименования #84→PA-1, #85→PA-2) развязывает конфликт нумерации — подробности в разделе «Узлы реестра и нумерация» выше
|
||||
- **Карта `docs/automation-graph-data.js`:** раздел A10 0→5 узлов + 6 cross-ref-связей (без новых section entries)
|
||||
|
||||
## Sequence of normative changes
|
||||
|
||||
1. **`docs/registry/nodes.yaml`** (новый SoT) — добавить 5 узлов с `subcategory: bi-tooling` + `capabilities` + `triggers` + `boundaries` + `chain_membership` + `attributes.tooling_section`. Параллельно — перенумеровать project-agents normative-sync/prod-deploy-validator в PA-1/PA-2 namespace.
|
||||
2. **`tools/registry-load.test.mjs` fixtures** — `expectedNodeCount` 85→90, `expectedSubcategories` +1 (`bi-tooling`).
|
||||
3. **ADR-017** — `docs/adr/ADR-017-bi-tooling.md` — границы BI1-BI8, обоснование, риски, alternatives considered.
|
||||
4. **Tooling Прил. Н v2.23 → v2.24:**
|
||||
- §0 счётчик 83→88 + 19-я подкатегория
|
||||
- §4.59-§4.63 — 5 attribute-блоков по 9-attribute template
|
||||
- §0 cross-ref Pravila v1.42 / PSR_v1 v3.22 / CLAUDE.md v2.28 → новые версии
|
||||
5. **Pravila v1.42 → v1.43:**
|
||||
- §13.2 +абзац «Off-phase bi-tooling» (#84-88, 19-я подкатегория)
|
||||
- Шапка «Что изменилось в v1.43 относительно v1.42»
|
||||
6. **PSR_v1 v3.22 → v3.23:**
|
||||
- R10.1 Блок 1 +2 строки (Data plugin Anthropic; DuckDB Skills Anthropic)
|
||||
- R10.1 Блок 1 note +3 self-authored skills
|
||||
- R15.6 +bi-tooling (19-я off-phase подкатегория, не UI → вне R6.0/R6.1/R14)
|
||||
7. **CLAUDE.md v2.28 → v2.29:**
|
||||
- §3.3 +5 строк #84-88
|
||||
- §3.3 footer count 83→88 + 19-я подкатегория
|
||||
- §1 priority chain row 2b counter
|
||||
- §6 +абзац фазы «2026-05-26 A10 bi-tooling integration»
|
||||
- §9 +запись v2.29
|
||||
- §0 cross-refs обновить
|
||||
8. **`docs/routing-off-phase.md`** — добавить связки L17+ (например, «BI exploration chain»: Data plugin → DuckDB Skills → analytics-patterns; «Dashboard authoring chain»: Frontend Design → analytics-patterns → dashboard-design-review)
|
||||
9. **`docs/router-procedure.md`** — sync если меняется механика (вероятно нет — общая 5-шаговая процедура одна и та же)
|
||||
10. **`docs/automation-graph-data.js`** — добавить 5 узлов в A10 секцию + 6 cross-ref-связей (NODE_SECTION_SECONDARY), browser-smoke test
|
||||
11. **Self-authored skills** в `.claude/skills/{analytics-patterns,dashboard-design-review,bi-cohort-analyst}/` + evals
|
||||
12. **`docs/observer/notes/2026-05-NN-a10-integration.md`** — note об интеграции для brain-retro
|
||||
|
||||
## Coverage discipline (новое — post-§17)
|
||||
|
||||
Каждый turn реализации интеграции должен носить **coverage announcement** по §17.7 Pravila v1.42:
|
||||
|
||||
- `coverage: skill:writing-plans` — при написании плана реализации
|
||||
- `coverage: skill:subagent-driven-development` — при делегировании подзадач Sonnet-агентам
|
||||
- `coverage: agent:normative-sync` — при делегации синка 4 нормативных файлов (предположительно когда Pravila+CLAUDE.md+Tooling+PSR_v1 одновременно)
|
||||
- `coverage: skill:writing-skills` — при создании 3 self-authored skills
|
||||
- `coverage: skill:verification-before-completion` — перед коммитом регрессии
|
||||
- `coverage: chain:bi-skill-authoring` — потенциально новая цепочка, объединяющая создание 3 skills
|
||||
|
||||
## Альтернативы рассмотрено
|
||||
|
||||
### Альтернатива 1: подход Big-bang (10+ позиций) — отвергнут
|
||||
|
||||
В brainstorming-сессии 26.05.2026 рассмотрен «Heavy» подход (8 install + 2 deferred): добавление **MCP Toolbox for Databases** (googleapis, 15.3k звёзд) + **McKinsey-style visualization** vendored skill. Отвергнут из-за:
|
||||
|
||||
- googleapis/mcp-toolbox дублирует `#10 Boost` для базового SQL-доступа (BI2)
|
||||
- McKinsey-style viz оптимизирован под presentation decks / PDF-отчёты, не embed dashboards; не ложится на Forest-эстетику портала
|
||||
|
||||
### Альтернатива 2: подход Minimum (2 позиции) — отвергнут
|
||||
|
||||
Только Data plugin + 1 self-authored. Не покрывает «анализ информации в широком смысле» — методология (bi-cohort-analyst) и дизайн-критика (dashboard-design-review) пропущены.
|
||||
|
||||
### Альтернатива 3: подход Hybrid с DEFERRED — модифицирован
|
||||
|
||||
Изначально предложено: 5 install + 3 DEFERRED (Amplitude / Metabase MCP / Superset MCP). Заказчик 26.05.2026 явно сказал «убери эти 3 DEFERRED». Финальный design — 5 install + 0 DEFERRED. Если в будущем потребуется embeddable BI (Metabase/Superset) — отдельный ADR и spec.
|
||||
|
||||
### Альтернатива 4: embeddable BI как замена части аналитики — отвергнут на уровне Approach question
|
||||
|
||||
В brainstorming-сессии заказчик выбрал Вариант А+ (помогают писать + анализ в широком смысле), **не Вариант В** (заменить часть аналитики готовым BI). Это архитектурное решение зафиксировано в `docs/observer/episodes-2026-05.jsonl` соответствующим эпизодом 26.05.2026.
|
||||
|
||||
## Риски
|
||||
|
||||
1. **Авторская работа 3 self-authored skills.** Объём ~8-10 часов написания + ~2-3 часа evals. Это нормально (`billing-audit` / `pdn-152fz-audit` / `marketing-ru` — такая же стоимость), но не нулевая. Митигация: subagent-driven-development через Sonnet, делегация по одному skill за раз.
|
||||
2. **Data plugin Python-only.** Не генерирует Vue+ApexCharts production-код. Митигация: чёткое разделение в analytics-patterns (узел 3) — Data plugin для ad-hoc анализа, Frontend Design + analytics-patterns для production-кода. Зафиксировано в BI7.
|
||||
3. **bi-cohort-analyst риск академизма.** Методологический skill может стать «учебником статистики» вместо инструмента. Митигация: evals на **реальных** вопросах заказчика из истории сессий («почему конверсия упала», «достаточно ли данных», и т.д.), а не из теоретических примеров.
|
||||
4. **Conflict-нумерация project-agents vs bi-tooling.** Project-agents `#84/#85` (CLAUDE.md v2.28) формально не в Tooling каноне, но в `nodes.yaml` занимают ID-слоты. Митигация: rename project-agents в PA-1/PA-2 namespace на шаге 1 sequencing.
|
||||
5. **Бирка coverage на 12+ turns реализации.** Каждый turn потребует coverage-аннотации (per §17.7). Risk = пропуск метки. Митигация: classifier-вывод (Sonnet 4.6) подскажет coverage; C5 controller surface отсутствие в STATUS.md.
|
||||
6. **Параллельные сессии.** Если параллельная Claude-сессия правит Pravila/CLAUDE.md/Tooling/PSR_v1 одновременно — конфликт. Митигация: §15.2 pre-flight sync `git fetch && git log HEAD..origin/main --oneline` перед каждым правкой нормативки.
|
||||
|
||||
## Out of scope
|
||||
|
||||
1. **Установка Metabase или Superset** как embeddable BI engine — отдельный ADR + миграция, не часть этой интеграции
|
||||
2. **Amplitude integration** — отложено до Б-1 / возможной потребности product-analytics на tenant-уровне
|
||||
3. **Реализация конкретных дашбордов** (`/dashboard`, `/analytics/advanced`, `/analytics/cohorts`) — это работа фазы 1-2 портала, использует узлы A10 как инструменты, но не часть spec'а интеграции
|
||||
4. **Изменения в `report_jobs` schema** — текущая схема `db/schema.sql` достаточна; analytics-patterns кодифицирует паттерн использования, не меняет таблицу
|
||||
5. **Партиционирование `activity_log` под аналитику** — отдельная задача; analytics-patterns awareness о partitioning, но не вводит новые партиции
|
||||
|
||||
## Definition of done
|
||||
|
||||
Интеграция считается завершённой когда:
|
||||
|
||||
- [ ] 5 узлов в `docs/registry/nodes.yaml` с полным attribute-набором (capabilities/triggers/boundaries/chain_membership)
|
||||
- [ ] ADR-017 написан и в Status: Accepted
|
||||
- [ ] Tooling Прил. Н v2.24 опубликован с §4.59-63 + §0 счётчик 88
|
||||
- [ ] Pravila v1.43 опубликован с §13.2 +абзац bi-tooling
|
||||
- [ ] PSR_v1 v3.23 опубликован с R10.1 + R15.6 обновлёнными
|
||||
- [ ] CLAUDE.md v2.29 опубликован с §3.3 +5 строк
|
||||
- [ ] 3 self-authored skills в `.claude/skills/` с прохожденными evals (20+/15+/20+ задач)
|
||||
- [ ] `docs/automation-graph-data.js` показывает 5 узлов A10 + 6 cross-ref-связей, browser-smoke 0 JS errors
|
||||
- [ ] Классификатор (LLM Layer 2) корректно маршрутизирует тестовые запросы про BI на правильные узлы (например, «напиши SQL для funnel chart» → analytics-patterns + Data plugin)
|
||||
- [ ] missed-activation детектор не флагует false-positive на новые узлы (triggers подобраны корректно)
|
||||
- [ ] coverage-аннотации проставлены на всех turn'ах реализации (C5 controller GREEN)
|
||||
- [ ] Регрессия: markdownlint 0, gitleaks 0, lychee 0 на новой нормативке, cross-ref-checker C2 0 drift
|
||||
|
||||
## Resolved questions (brainstorming-сессия 26.05.2026)
|
||||
|
||||
Все 6 (по факту 5 после объединения Q2+Q3) предварительных вопросов сняты заказчиком перед планированием:
|
||||
|
||||
1. **Где делать работу.** ✅ **Отдельная ветка `feat/a10-bi-tooling`** (паттерн A8 / C1). Worktree не нужен — параллельных сессий правки нормативки сейчас нет.
|
||||
2/3. **Установка Data plugin + DuckDB Skills.** ✅ **`~/.claude/settings.json`** (общая user-level настройка Claude Code) — тот же файл, где сейчас находятся marketing-плагины (`marketing`, `brand-voice`) и `finance`. Сложившийся паттерн для Anthropic-marketplace плагинов.
|
||||
2. **Конфликт нумерации с project-agents.** ✅ **Переименовать `normative-sync` и `prod-deploy-validator` в namespace PA-1 / PA-2** в `docs/registry/nodes.yaml`. Tooling-нумерация остаётся непрерывной: #1…#83 (текущее), #84-#88 (новые BI-узлы). PA-namespace соответствует Pravila §2.4 v1.40 «project-agents не входят в Tooling канон». Sync: CLAUDE.md §3.9 ссылается на agent-файлы без явного ID — переименование в `nodes.yaml` ничего не ломает в §3.9.
|
||||
3. **Evals для self-authored skills.** ✅ **Гибрид** — основная масса синтетические по ТЗ §12-§13 (быстро добираем до 20/15/20), плюс 3-5 «якорных» из реальной истории сессий (`docs/observer/episodes-2026-05.jsonl`). Как делали для `marketing-ru` и `billing-audit`.
|
||||
4. **Цепочки L17+ в `routing-off-phase.md`.** ✅ **3 цепочки** (даже с учётом, что LLM-classifier post-overhaul частично делает их избыточными — они остаются как документация + подсказка классификатору при неоднозначности + аудит-baseline):
|
||||
- **L17 «BI exploration»**: Data plugin → DuckDB Skills → analytics-patterns
|
||||
- **L18 «Dashboard authoring»**: Frontend Design → analytics-patterns → dashboard-design-review
|
||||
- **L19 «Cohort analysis»**: bi-cohort-analyst → Data plugin → Data Scientist (#49 cross-ref)
|
||||
|
||||
**Все ответы заказчика — на «recommended» опции в каждом вопросе** (вариант А во всех случаях), что упрощает план: design следует наиболее изученному паттерну прошлых интеграций.
|
||||
@@ -201,6 +201,27 @@ export function buildEpisode({ state = null, transcriptText = null, ctx = {} } =
|
||||
return base;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the user prompt for downstream consumers (self-assessment API,
|
||||
* embedding). Bug fix 2026-05-26: Claude Code's Stop-event stdin contract is
|
||||
* { session_id, transcript_path, stop_hook_active, hook_event_name } — it
|
||||
* never includes `prompt`. The real text lives in the transcript file. Prior
|
||||
* code blindly read `ctx.prompt`, so self-assessment always received "(пусто)"
|
||||
* and embedding was silently skipped. This helper prefers `ctx.prompt` (test
|
||||
* convenience) and falls back to extracting the last user message from the
|
||||
* transcript. Returns null when neither source has content.
|
||||
*/
|
||||
export function derivePrompt(ctx, transcriptText) {
|
||||
if (ctx && typeof ctx.prompt === 'string' && ctx.prompt.length > 0) {
|
||||
return ctx.prompt;
|
||||
}
|
||||
if (typeof transcriptText === 'string' && transcriptText.length > 0) {
|
||||
const text = extractLastUserPromptText(transcriptText);
|
||||
return text || null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a self_assessment block (spec §4.5, Phase 3 Task 17). Pure.
|
||||
*
|
||||
@@ -372,6 +393,11 @@ if (process.argv[1] && process.argv[1].replace(/\\/g, '/').endsWith('/observer-s
|
||||
try {
|
||||
const ep = buildEpisodeFromContext(ctx, transcriptText);
|
||||
|
||||
// Bug fix 2026-05-26: resolve the real user prompt before calling
|
||||
// downstream consumers. ctx.prompt is never set by Stop-event stdin —
|
||||
// the prompt lives in the transcript. derivePrompt unifies the fallback.
|
||||
const userPrompt = derivePrompt(ctx, transcriptText);
|
||||
|
||||
// Step 3.5: self-assessment API call (fail-quiet).
|
||||
// Only runs when the runtime flag is 'on' and ROUTER_LLM_KEY is set.
|
||||
const saMode = readRuntimeFlag('self-assessment-mode');
|
||||
@@ -379,7 +405,7 @@ if (process.argv[1] && process.argv[1].replace(/\\/g, '/').endsWith('/observer-s
|
||||
if (saMode === 'on' && saApiKey) {
|
||||
const rat = ep.primary_rationale ?? {};
|
||||
const apiResult = await callSelfAssessmentApi({
|
||||
prompt: ctx.prompt || null,
|
||||
prompt: userPrompt,
|
||||
recommendedNode: rat.recommended_node || null,
|
||||
actualNode: rat.node_chosen || null,
|
||||
chainExecuted: rat.chain_executed || [],
|
||||
@@ -391,7 +417,7 @@ if (process.argv[1] && process.argv[1].replace(/\\/g, '/').endsWith('/observer-s
|
||||
// Step 3.6: embedding async wiring (fail-quiet, 2s timeout).
|
||||
// Trivial task types skipped via shouldEmbed. Mirrors Step 3.5 pattern.
|
||||
const embMode = readRuntimeFlag('embedding-mode');
|
||||
await computeEmbeddingForEpisode(ep, ctx, { embedMode: embMode });
|
||||
await computeEmbeddingForEpisode(ep, { ...ctx, prompt: userPrompt }, { embedMode: embMode });
|
||||
|
||||
// Always write the episode first — exit-0-safe (spec §5.1 step 1).
|
||||
appendEpisode(ep);
|
||||
|
||||
@@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
||||
import { writeFileSync, readFileSync, existsSync, mkdtempSync, rmSync, mkdirSync, readdirSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
import { tmpdir } from 'os';
|
||||
import { appendEpisode, buildEpisodeFromContext, buildObserverError, routingGateDecision, buildExecutionTrace, buildEpisode, buildSelfAssessment, computeEmbeddingForEpisode } from './observer-stop-hook.mjs';
|
||||
import { appendEpisode, buildEpisodeFromContext, buildObserverError, routingGateDecision, buildExecutionTrace, buildEpisode, buildSelfAssessment, computeEmbeddingForEpisode, derivePrompt } from './observer-stop-hook.mjs';
|
||||
|
||||
let workdir;
|
||||
|
||||
@@ -366,3 +366,49 @@ describe('Step 3.6 embedding async wiring', () => {
|
||||
expect(ep.environment.embedding_unavailable).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// derivePrompt — Bug fix 2026-05-26: ctx.prompt is never set by Claude Code Stop
|
||||
// stdin (only session_id / transcript_path / stop_hook_active are sent). The
|
||||
// real user prompt lives in the transcript file. Self-assessment and embedding
|
||||
// both consumed ctx.prompt blindly → empty string passed to Sonnet ("(пусто)")
|
||||
// and embedding was silently skipped. derivePrompt unifies the fallback: prefer
|
||||
// ctx.prompt when present (e.g. tests), otherwise extract last user message
|
||||
// from transcriptText.
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
describe('derivePrompt — Stop-event prompt resolution', () => {
|
||||
const minimalTranscript = (text) =>
|
||||
JSON.stringify({
|
||||
type: 'user',
|
||||
sessionId: 's1',
|
||||
timestamp: '2026-05-26T03:00:00Z',
|
||||
message: { role: 'user', content: text },
|
||||
}) + '\n';
|
||||
|
||||
it('returns ctx.prompt when explicitly provided (test path)', () => {
|
||||
expect(derivePrompt({ prompt: 'explicit' }, null)).toBe('explicit');
|
||||
});
|
||||
|
||||
it('extracts last user prompt from transcript when ctx.prompt missing (real Stop-event path)', () => {
|
||||
const transcript = minimalTranscript('реальный длинный запрос от заказчика');
|
||||
expect(derivePrompt({}, transcript)).toBe('реальный длинный запрос от заказчика');
|
||||
});
|
||||
|
||||
it('returns null when both ctx.prompt and transcriptText absent', () => {
|
||||
expect(derivePrompt({}, null)).toBeNull();
|
||||
expect(derivePrompt({}, '')).toBeNull();
|
||||
});
|
||||
|
||||
it('prefers ctx.prompt over transcript when both present', () => {
|
||||
const transcript = minimalTranscript('from transcript');
|
||||
expect(derivePrompt({ prompt: 'from ctx' }, transcript)).toBe('from ctx');
|
||||
});
|
||||
|
||||
it('handles ctx=null/undefined gracefully', () => {
|
||||
const transcript = minimalTranscript('из транскрипта');
|
||||
expect(derivePrompt(null, transcript)).toBe('из транскрипта');
|
||||
expect(derivePrompt(undefined, transcript)).toBe('из транскрипта');
|
||||
expect(derivePrompt(null, null)).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi
|
||||
describe('registry-load', () => {
|
||||
beforeEach(() => clearCache());
|
||||
|
||||
it('loads registry (85 nodes after #84/#85 project-agents added 24.05.2026)', () => {
|
||||
it('loads registry (90 nodes after #84-#88 BI-tooling added 26.05.2026, project-agents renamed to PA-1/PA-2)', () => {
|
||||
const r = loadRegistry();
|
||||
expect(r.nodes).toHaveLength(85);
|
||||
expect(r.nodes).toHaveLength(90);
|
||||
expect(r.version).toBe('0.1.0');
|
||||
});
|
||||
|
||||
@@ -46,11 +46,15 @@ describe('registry-load', () => {
|
||||
it('findActiveNodes excludes non-active', () => {
|
||||
const r = loadRegistry();
|
||||
const active = findActiveNodes(r);
|
||||
// 85 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred,
|
||||
// #84/#85 (project-agents added 24.05.2026) are active → 75 + 2 = 77 active
|
||||
expect(active).toHaveLength(77);
|
||||
// 90 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred,
|
||||
// PA-1/PA-2 (project-agents renamed from #84/#85 on 26.05.2026) are active,
|
||||
// #84-#88 (BI-tooling added 26.05.2026) are all active → 75 + 2 + 5 = 82 active
|
||||
expect(active).toHaveLength(82);
|
||||
expect(active.map(n => n.id)).toContain('#18');
|
||||
expect(active.map(n => n.id)).toContain('#19');
|
||||
expect(active.map(n => n.id)).toContain('#84');
|
||||
expect(active.map(n => n.id)).toContain('#88');
|
||||
expect(active.map(n => n.id)).toContain('PA-1');
|
||||
expect(active.map(n => n.id)).not.toContain('#1');
|
||||
expect(active.map(n => n.id)).not.toContain('#17');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user