## НЕ расщеплять (атомарные / материал / оркестратор)
- **ui-ux-pro-max** — физически 7 навыков (banner-design, brand, design, design-system, slides, ui-styling, ui-ux-pro-max), НО по нормативке (CLAUDE.md §5.5, PSR R10.1/R11.5/R14.3) это **резерв-библиотека-материал, не решатель** — как marketingskills. Оставляем атомарным маркером-материалом. (Развилка C — подтвердить.)
- **marketingskills** — библиотека 40 фреймворков-материалов (ADR-015 MKT3). Атомарный.
- **security-go-live** — НЕ комок, а композитный оркестратор (needs 5 выходов owasp-zap/nuclei/ward/pdn-152fz/threat-model). Уже правильный. Не трогать.
## Аномалии и недопокрытия (отдельно от расщепления)
- **semgrep** — представляет 1 из 3 навыков плагина static-analysis (есть ещё codeql, sarif-parsing). Это НЕДОПОКРЫТИЕ охвата, не расщепление. Решить отдельно: заводить ли codeql/sarif-parsing.
- **operations-process-doc** — уже вынесенный под-навык operations (name `operations:process-doc`). При расщеплении operations — не плодить дубль, переиспользовать.
- **design-plugin** — контракт описывает 3 из 7 реальных навыков (рассогласование «контракт ↔ плагин»).
- **finance journal-entry vs journal-entry-prep** — похожие описания, проверить на дубль.
- **trail-of-bits пакет** — в кэше 8 security-плагинов (static-analysis×3, differential-review, audit-context-building, variant-analysis, supply-chain-risk-auditor, insecure-defaults, sharp-edges, agentic-actions-auditor). У нас контракт только trail-of-bits (атомарный) + semgrep. Вопрос охвата, не расщепления.
## Подсчёт «91 → ~150»
- Комков: **11** (если ui-ux-pro-max оставить материалом).
- Под-навыков в комках: ≈ 14+7+8+2+2+8+7+8+9+8+3 = **76** (с adr-kit полным) или ≈ **70** (adr-kit только adr/judge).
- Уже вынесено: 2 (writing-plans, operations-process-doc).
- Итог реестра: 91 − 11 зонтиков + ~76 под-навыков ≈ **156** (или ~150 при урезании служебных adr-kit).
- **A. Зонтик-контракт → УБРАТЬ** (по спеке v2 §2: растворяется в под-навыки). После разворачивания удаляем `superpowers.contract.json`, `product-management.contract.json` и т.п.
- **B. adr-kit → только `adr` + `judge`** (содержательные «решатели», роутер их подбирает). Служебные init/install-hooks/lint/migrate/setup/upgrade — инфра-команды разовой настройки, в реестр НЕ тащим (роутеру нечего подбирать). *(Принято по логике «что произойдёт при вызове»; если владелец захочет иначе — поправить.)*
- **C. ui-ux-pro-max → РАЗВЕРНУТЬ на 7 с пометкой роли + правка PSR (путь 2).** По сути под-навыки (banner/slides/design-system/ui-styling…) — разные задачи, роутер подберёт точнее. НО в каждом под-контракте `constraints` фиксируют роль: «материал/решение по UI; стек приводить к Vue+Vuetify (R6.0); финальный код — Frontend Design (paired-stack)». Разворачивание UPM **тянет правку PSR** (сейчас PSR говорит «UPM — материал, не разворачивать») — отдельный аккуратный шаг нормативного синхрона.
- **D. Мелочь:** finance journal-entry vs journal-entry-prep — проверить на дубль при разворачивании (свести или оставить оба с разными визитками); semgrep-недопокрытие (codeql/sarif-parsing) — отдельной задачей охвата, не в этом разворачивании.
## Итоговый список к разворачиванию (12 комков)
| # | Комок | Новых под-навыков | Примечание |
|---|---|---|---|
| 1 | superpowers | 13 | writing-plans уже есть |
| 2 | plugin-dev | 7 | |
| 3 | adr-kit | 2 | только adr, judge |
| 4 | claude-md-management | 2 | |
| 5 | hookify | 1–2 | writing-rules (+hookify); команды не навыки |
| 6 | product-management | 8 | |
| 7 | design-plugin | 7 | контракт покрывал 3 из 7 |
| 8 | marketing-plugin | 8 | |
| 9 | operations | 8 | process-doc уже вынесен |
| 10 | finance-plugin | 7–8 | journal дубль? |
| 11 | brand-voice | 3 | |
| 12 | ui-ux-pro-max | 7 | + правка PSR |
Сумма ≈ **73–75** новых под-навыков. Реестр: 91 − 12 зонтиков + ~75 ≈ **~154**. Сходится с «~150».
## Инженерные заметки для плана (решить в плане)
- **Имя файла vs поле skill.** Поле `skill` = `плагин:навык` (с двоеточием, спека §2). НО двоеточие в имени файла на Windows запрещено → имя файла без двоеточия. Прецеденты: `writing-plans.contract.json` (просто slug), `operations-process-doc.contract.json` (дефис). **Коллизия:**`competitive-brief` есть И у product-management, И у marketing — значит имя файла ОБЯЗАНО нести плагин. Предлагаемая конвенция: `<плагин>__<навык>.contract.json` (двойное подчёркивание), поле `skill` внутри = `<плагин>:<навык>`.
- **needs/produces** на этапе разворачивания — временно прозой/скелетом; токены словаря надеваем на этапе графа (порядок «расщепить → потом граф»). Замок словаря опционален → регрессию не ломает.
- **Контент полей** под-контракта (визитка, constraints, defaults, key-decisions, acceptance) — из frontmatter `name:`/`description:` + тела SKILL.md плагина; для own-навыков — из наших источников.
Пилот `claude-md-management` (2 навыка) прошёл зелёным (полная регрессия 4361 passed, 0 failed). Подтверждённый рецепт для остальных 11 комков — разворачивание трогает **ДВА файла + схему + один тест-счётчик**:
1.**Карточка**`docs/registry/contracts/<плагин>__<навык>.contract.json` (двойное подчёркивание в имени; двоеточие в имени файла Windows не держит). Поле `skill: "<плагин>:<навык>"`. `kind:external` + `source{version:"n/a", hash:<64 нуля>, path:""}` (G4 инертен). needs/produces пока краткой прозой.
3.**Схема**`docs/registry/schema.json`: паттерн `id` расширен на `^#\d+[a-z]?$` (допускает дочерний суффикс) — **уже сделано пилотом, для всех комков работает**. `slug` паттерн `^[a-z0-9-]+(:[a-z0-9-]+)*$` двоеточие уже допускал.
4.**Зонтик удаляется** в ОБОИХ местах: карточка (`<плагин>.contract.json`) + узел `#NN`. Карточку удалять скриптом-файлом (`node tools/_del.mjs`с`unlinkSync`) — пол режет `rm`.
5.**Цепочки L** (`chain_membership` + ссылки на `#NN` в `chains:`): трогать минимально (заменить ссылку `#NN` на slug под-узла). **Полный снос L1-L17 — отдельный эпик** (спека §2): затрагивает `registry-load.mjs` (`chains`/`findChainsByNode`), `node-graph.mjs` (`relatedByChain`), `schema.json` (`chains` в `required`), их тесты. НЕ смешивать с разворачиванием.
6.**Счётчик узлов:**`tools/registry-load.test.mjs` хардкодит число узлов (`toHaveLength(N)`) и активных — обновлять на каждый комок (разворачивание `#NN`→k под-узлов даёт +(k−1) узлов и активных).
7.**Инвариант-сторож**`tools/m3e-card-coverage-invariants.test.mjs` ловит рассинхрон «узел↔карточка» — НЕ глушить, а синхронизировать оба места.
### Доп-каскады, выявленные на superpowers (учесть для крупных комков)
- **Классификации-триггеры зонтика** (`classification: feature/planning/bugfix/refactor` + `keyword`) надо РАСПРЕДЕЛИТЬ по под-узлам, иначе роутер теряет подбор по классу. На superpowers: feature→brainstorming(#19a), planning→writing-plans(#19c), tdd→TDD(#19b), debug/bugfix→debugging(#19d), refactor→TDD. Каскад на `registry-load.test` (`findByClassification('feature')[0].node.id`) + потенциально `router-classifier.test`.
- **Хардкод-образцы в тестах.** `m3a-contract-invariants` (own-образец) и `m3c-coverage-invariants` (контракты 3-A) читали `writing-plans.contract.json` по имени → миграция сломала; обновлены на `marketing-ru` (own) и `superpowers__writing-plans`. При разворачивании других комков — грепать имя контракта по тестам ПЕРЕД удалением.
- **Частично-вынесенные карточки** (как `writing-plans` без префикса/узла, kind own) — привести к конвенции: skill `<плагин>:<навык>`, файл `<плагин>__<навык>`, kind external, завести узел.
- **Генератор карточек** (`tools/_gen-<плагин>.mjs`, самоудаляемый, данные внутри) — рабочий приём для комков с многими навыками: пишет N JSON + удаляет зонтик/кривые карточки. Узлы YAML — отдельным Edit-блоком.