feat: разворачивание комка product-management — 8 навыков (роутер-реестр)

Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик product-management развёрнут
в 8 карточек-навыков + 8 под-узлов #42a..#42h.

- 8 карточек: write-spec, roadmap-update, metrics-review, product-brainstorming,
  sprint-planning, stakeholder-update, synthesize-research, competitive-brief
- nodes.yaml: узел #42 → #42a..#42h; триггеры (planning/prd→write-spec,
  роадмап→roadmap-update, метрики→metrics-review); ссылка L9 обновлена
- product-management:competitive-brief отличён от marketing:competitive-brief
  (та самая коллизия имён, ради которой имя файла несёт плагин)
- зонтик убран; registry-load.test: 117 узлов / 109 active

Регрессия (без 5 pre-existing node:test файлов): 4361 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-18 23:13:44 +03:00
parent f01f5b8bbc
commit 0258b9d2a7
12 changed files with 345 additions and 27 deletions
@@ -1,12 +0,0 @@
{
"skill": "product-management",
"kind": "external",
"needs": ["продуктовая церемония (спека / роадмап / метрики)"],
"produces": ["спецификация / роадмап / анализ метрик / конкурентный бриф"],
"constraints": ["продуктовые церемонии (write-spec/roadmap/metrics)", "НЕ dev-issues (CCPM)"],
"preview-form": "outline",
"defaults": ["/write-spec, /roadmap-update, /metrics-review"],
"key-decisions": ["какая церемония под запрос"],
"acceptance-criteria": ["артефакт церемонии готов и обоснован"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,29 @@
{
"skill": "product-management:competitive-brief",
"kind": "external",
"needs": [
"конкурент(ы)/область для анализа"
],
"produces": [
"конкурентный бриф: позиционирование, gap, угрозы"
],
"constraints": [
"под-навык зонтика product-management (продуктовые церемонии)",
"НЕ dev-issues (CCPM); конкурентный бриф ≠ marketing:competitive-brief"
],
"preview-form": "outline",
"defaults": [
"competitive-brief — продуктовый конкурентный анализ"
],
"key-decisions": [
"где дифференцироваться vs паритет"
],
"acceptance-criteria": [
"бриф покрывает позиционирование и gaps"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "product-management:metrics-review",
"kind": "external",
"needs": [
"набор продуктовых метрик для анализа"
],
"produces": [
"разбор трендов + scorecard + рекомендации"
],
"constraints": [
"под-навык зонтика product-management (продуктовые церемонии)",
"НЕ dev-issues (CCPM); конкурентный бриф ≠ marketing:competitive-brief"
],
"preview-form": "outline",
"defaults": [
"metrics-review — анализ метрик и трендов"
],
"key-decisions": [
"какие метрики и пороги"
],
"acceptance-criteria": [
"метрики разобраны, действия предложены"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "product-management:product-brainstorming",
"kind": "external",
"needs": [
"продуктовая проблема/возможность для проработки"
],
"produces": [
"проработанные идеи и направления (sparring-partner)"
],
"constraints": [
"под-навык зонтика product-management (продуктовые церемонии)",
"НЕ dev-issues (CCPM); конкурентный бриф ≠ marketing:competitive-brief"
],
"preview-form": "outline",
"defaults": [
"product-brainstorming — открытая проработка идей"
],
"key-decisions": [
"какое направление развивать"
],
"acceptance-criteria": [
"идеи стресс-тестированы"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "product-management:roadmap-update",
"kind": "external",
"needs": [
"изменение приоритетов/новая инициатива"
],
"produces": [
"обновлённый роадмап (Now/Next/Later)"
],
"constraints": [
"под-навык зонтика product-management (продуктовые церемонии)",
"НЕ dev-issues (CCPM); конкурентный бриф ≠ marketing:competitive-brief"
],
"preview-form": "outline",
"defaults": [
"roadmap-update — переприоритизация дорожной карты"
],
"key-decisions": [
"что движется ради чего"
],
"acceptance-criteria": [
"роадмап отражает новые приоритеты"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "product-management:sprint-planning",
"kind": "external",
"needs": [
"бэклог + ёмкость команды на спринт"
],
"produces": [
"план спринта: scope, оценки, цели, P0 vs stretch"
],
"constraints": [
"под-навык зонтика product-management (продуктовые церемонии)",
"НЕ dev-issues (CCPM); конкурентный бриф ≠ marketing:competitive-brief"
],
"preview-form": "outline",
"defaults": [
"sprint-planning — планирование спринта под ёмкость"
],
"key-decisions": [
"что P0, что stretch"
],
"acceptance-criteria": [
"спринт спланирован под capacity"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "product-management:stakeholder-update",
"kind": "external",
"needs": [
"прогресс для коммуникации стейкхолдерам"
],
"produces": [
"апдейт под аудиторию (exec/eng/customer)"
],
"constraints": [
"под-навык зонтика product-management (продуктовые церемонии)",
"НЕ dev-issues (CCPM); конкурентный бриф ≠ marketing:competitive-brief"
],
"preview-form": "outline",
"defaults": [
"stakeholder-update — статус под аудиторию и cadence"
],
"key-decisions": [
"аудитория и уровень детализации"
],
"acceptance-criteria": [
"апдейт таргетирован под аудиторию"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "product-management:synthesize-research",
"kind": "external",
"needs": [
"сырые интервью/опросы/тикеты"
],
"produces": [
"структурированные инсайты + темы + рекомендации"
],
"constraints": [
"под-навык зонтика product-management (продуктовые церемонии)",
"НЕ dev-issues (CCPM); конкурентный бриф ≠ marketing:competitive-brief"
],
"preview-form": "outline",
"defaults": [
"synthesize-research — синтез research в инсайты"
],
"key-decisions": [
"какие темы доминируют"
],
"acceptance-criteria": [
"инсайты ранжированы по частоте/влиянию"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "product-management:write-spec",
"kind": "external",
"needs": [
"проблема/идея фичи для оформления в спеку/PRD"
],
"produces": [
"функциональная спецификация с goals/non-goals/метриками"
],
"constraints": [
"под-навык зонтика product-management (продуктовые церемонии)",
"НЕ dev-issues (CCPM); конкурентный бриф ≠ marketing:competitive-brief"
],
"preview-form": "outline",
"defaults": [
"write-spec — для оформления требований в структурный документ"
],
"key-decisions": [
"scope: goals и non-goals"
],
"acceptance-criteria": [
"спека структурна и измерима"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
+105 -7
View File
@@ -975,18 +975,16 @@ nodes:
tooling_section: "§4.16 #41"
install: "vendored в .claude/skills/ccpm/"
- id: "#42"
name: "product-management"
slug: "product-management"
- id: "#42a"
name: "write-spec"
slug: "product-management:write-spec"
category: "off-phase"
subcategory: "project-management"
status: "active"
dormancy_reason: null
capabilities: "Плагин для продуктовых церемоний: написание спецификаций (`/write-spec`), обновление роадмапа (`/roadmap-update`), анализ метрик (`/metrics-review`), конкурентные брифы."
capabilities: "Функциональная спецификация/PRD из проблемы: goals/non-goals/метрики. Входная точка продуктовых церемоний."
triggers:
- {keyword: "prd", weight: 1.0}
- {keyword: "роадмап", weight: 1.0}
- {keyword: "метрики", weight: 1.0}
- {keyword: "продуктовые церемонии", weight: 1.0}
- {classification: "planning", weight: 1.0}
boundaries: []
@@ -995,6 +993,106 @@ nodes:
tooling_section: "§4.17 #42"
install: "claude plugin install product-management@knowledge-work-plugins"
- id: "#42b"
name: "roadmap-update"
slug: "product-management:roadmap-update"
category: "off-phase"
subcategory: "project-management"
status: "active"
dormancy_reason: null
capabilities: "Обновление дорожной карты (Now/Next/Later), переприоритизация инициатив."
triggers:
- {keyword: "роадмап", weight: 1.0}
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.17 #42"
- id: "#42c"
name: "metrics-review"
slug: "product-management:metrics-review"
category: "off-phase"
subcategory: "project-management"
status: "active"
dormancy_reason: null
capabilities: "Разбор продуктовых метрик: тренды, scorecard, рекомендации."
triggers:
- {keyword: "метрики", weight: 1.0}
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.17 #42"
- id: "#42d"
name: "product-brainstorming"
slug: "product-management:product-brainstorming"
category: "off-phase"
subcategory: "project-management"
status: "active"
dormancy_reason: null
capabilities: "Открытая проработка продуктовых идей и направлений (sparring-partner)."
triggers: []
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.17 #42"
- id: "#42e"
name: "sprint-planning"
slug: "product-management:sprint-planning"
category: "off-phase"
subcategory: "project-management"
status: "active"
dormancy_reason: null
capabilities: "План спринта под ёмкость команды: scope, оценки, цели, P0 vs stretch."
triggers: []
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.17 #42"
- id: "#42f"
name: "stakeholder-update"
slug: "product-management:stakeholder-update"
category: "off-phase"
subcategory: "project-management"
status: "active"
dormancy_reason: null
capabilities: "Апдейт стейкхолдерам под аудиторию (exec/eng/customer) и cadence."
triggers: []
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.17 #42"
- id: "#42g"
name: "synthesize-research"
slug: "product-management:synthesize-research"
category: "off-phase"
subcategory: "project-management"
status: "active"
dormancy_reason: null
capabilities: "Синтез сырого research (интервью/опросы/тикеты) в структурированные инсайты и рекомендации."
triggers: []
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.17 #42"
- id: "#42h"
name: "product-competitive-brief"
slug: "product-management:competitive-brief"
category: "off-phase"
subcategory: "project-management"
status: "active"
dormancy_reason: null
capabilities: "Продуктовый конкурентный бриф: позиционирование, gap, угрозы. (Не путать с marketing:competitive-brief.)"
triggers: []
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.17 #42"
- id: "#43"
name: "deptrac"
slug: "deptrac"
@@ -2167,7 +2265,7 @@ chains:
name: "project management chain"
sequence:
- "#41"
- "#42"
- "product-management:write-spec"
- "#3"
L10:
+3 -3
View File
@@ -113,9 +113,9 @@
| claude-md-management (2) | ✅ DONE | e98ba1e (pushed) |
| superpowers (14) | ✅ DONE | 5a7c5c2 (pushed) |
| plugin-dev (7) | ✅ DONE | ded5372 (pushed) |
| adr-kit (2: adr, judge) | ✅ DONE | этот коммит |
| hookify (12) | | |
| product-management (8) | ⬜ | |
| adr-kit (2: adr, judge) | ✅ DONE | f01f5b8 (pushed) |
| hookify (12) | ⏸ развилка владельцу (slug hookify:hookify кривой) | |
| product-management (8) | ✅ DONE | этот коммит |
| design-plugin (7) | ⬜ | |
| marketing-plugin (8) | ⬜ | |
| operations (8) | ⬜ | |
+5 -5
View File
@@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi
describe('registry-load', () => {
beforeEach(() => clearCache());
it('loads registry (110 nodes: разворачивание #33/#19/#57/#36 комков 18.06.2026)', () => {
it('loads registry (117 nodes: разворачивание #33/#19/#57/#36/#42 комков 18.06.2026)', () => {
const r = loadRegistry();
expect(r.nodes).toHaveLength(110);
expect(r.nodes).toHaveLength(117);
expect(r.version).toBe('0.1.0');
});
@@ -46,9 +46,9 @@ describe('registry-load', () => {
it('findActiveNodes excludes non-active (nodes.yaml registry)', () => {
const r = loadRegistry();
const active = findActiveNodes(r);
// 110 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
// развёрнуты комки: #33→2, #19→14, #57→7, #36 adr-kit→2 (active +1+13+6+1) → 102 active
expect(active).toHaveLength(102);
// 117 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
// развёрнуты комки: #33→2, #19→14, #57→7, #36→2, #42 pm→8 (active +1+13+6+1+7) → 109 active
expect(active).toHaveLength(109);
expect(active.map(n => n.id)).toContain('#18');
expect(active.map(n => n.id)).toContain('#19a');
expect(active.map(n => n.id)).not.toContain('#1');