feat: разворачивание комка brand-voice — 3 навыка (роутер-реестр)

Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик brand-voice развёрнут
в 3 карточки-навыка + 3 под-узла #76a..#76c.

- 3 карточки: brand-voice-enforcement, discover-brand, guideline-generation
- nodes.yaml: узел #76 → #76a..#76c; триггеры (тон/голос бренда → enforcement,
  brand guidelines → guideline-generation); ADR-015 MKT6 на enforcement
- зонтик убран; registry-load.test: 147 узлов / 139 active

Этап 1 (разворачивание): 10/12 комков готовы. Остались развилки владельцу:
hookify (slug hookify:hookify кривой) и ui-ux-pro-max (требует правки PSR).

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

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-18 23:42:15 +03:00
parent 4a25302ac9
commit 396ec5f851
7 changed files with 129 additions and 25 deletions
@@ -1,12 +0,0 @@
{
"skill": "brand-voice",
"kind": "external",
"needs": ["текст/коммуникация для проверки голоса бренда"],
"produces": ["вербальные brand guidelines / проверка тональности"],
"constraints": ["вербальный бренд (ADR-015 MKT6) НЕ Brandbook визуальный", "взаимодополняют"],
"preview-form": "outline",
"defaults": ["единый тон коммуникации Лидерры"],
"key-decisions": ["тональность под канал/аудиторию"],
"acceptance-criteria": ["текст соответствует голосу бренда"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,29 @@
{
"skill": "brand-voice:brand-voice-enforcement",
"kind": "external",
"needs": [
"контент для применения brand-гайдов"
],
"produces": [
"контент, выровненный по голосу бренда (email/pitch/LinkedIn/Slack/proposal)"
],
"constraints": [
"под-навык зонтика brand-voice (вербальный бренд)",
"ADR-015 MKT6: вербальный бренд vs визуальный (Brandbook v2)"
],
"preview-form": "outline",
"defaults": [
"brand-voice-enforcement — применение гайдов к генерации"
],
"key-decisions": [
"какие brand-ограничения применить"
],
"acceptance-criteria": [
"контент соответствует голосу бренда"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "brand-voice:discover-brand",
"kind": "external",
"needs": [
"потребность найти разрозненные brand-материалы"
],
"produces": [
"discovery-отчёт: найденные материалы (Notion/Confluence/Drive/Box/Figma/Gong/Slack)"
],
"constraints": [
"под-навык зонтика brand-voice (вербальный бренд)",
"ADR-015 MKT6: вербальный бренд vs визуальный (Brandbook v2)"
],
"preview-form": "outline",
"defaults": [
"discover-brand — автономный поиск brand-материалов по платформам"
],
"key-decisions": [
"где искать материалы"
],
"acceptance-criteria": [
"материалы найдены и категоризированы"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "brand-voice:guideline-generation",
"kind": "external",
"needs": [
"исходные материалы (docs/transcripts/recordings)"
],
"produces": [
"brand voice guidelines из материалов"
],
"constraints": [
"под-навык зонтика brand-voice (вербальный бренд)",
"ADR-015 MKT6: вербальный бренд vs визуальный (Brandbook v2)"
],
"preview-form": "outline",
"defaults": [
"guideline-generation — генерация гайдов из материалов"
],
"key-decisions": [
"какие атрибуты голоса"
],
"acceptance-criteria": [
"гайды полны и без открытых вопросов"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
+33 -5
View File
@@ -2270,18 +2270,17 @@ nodes:
attributes:
tooling_section: "§4.50 #75"
- id: "#76"
name: "brand-voice"
slug: "brand-voice"
- id: "#76a"
name: "brand-voice-enforcement"
slug: "brand-voice:brand-voice-enforcement"
category: "off-phase"
subcategory: "marketing-tooling"
status: "active"
dormancy_reason: null
capabilities: лагин для разработки и проверки голоса бренда: создание вербальных brand guidelines, проверка тональности текстов, обеспечение единого стиля коммуникации Лидерры."
capabilities: рименение brand-гайдов к генерации контента (email/pitch/LinkedIn/Slack/proposal): выравнивание по голосу бренда."
triggers:
- {keyword: "тон бренда", weight: 1.0}
- {keyword: "голос бренда", weight: 1.0}
- {keyword: "brand guidelines для текстов", weight: 1.0}
- {keyword: "тон копирайта", weight: 1.0}
- {keyword: "voice", weight: 1.0}
- {keyword: "тональность", weight: 1.0}
@@ -2293,6 +2292,35 @@ nodes:
attributes:
tooling_section: "§4.51 #76"
- id: "#76b"
name: "brand-voice-discover-brand"
slug: "brand-voice:discover-brand"
category: "off-phase"
subcategory: "marketing-tooling"
status: "active"
dormancy_reason: null
capabilities: "Автономный поиск разрозненных brand-материалов по платформам (Notion/Confluence/Drive/Box/Figma/Gong/Slack) → discovery-отчёт."
triggers: []
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.51 #76"
- id: "#76c"
name: "brand-voice-guideline-generation"
slug: "brand-voice:guideline-generation"
category: "off-phase"
subcategory: "marketing-tooling"
status: "active"
dormancy_reason: null
capabilities: "Генерация brand voice guidelines из исходных материалов (docs/transcripts/recordings)."
triggers:
- {keyword: "brand guidelines для текстов", weight: 1.0}
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.51 #76"
- id: "#77"
name: "marketing-ru"
slug: "marketing-ru"
+4 -3
View File
@@ -119,9 +119,10 @@
| design-plugin (7) | ✅ DONE | bf3d557 (committed, push deferred — observer-race) |
| marketing-plugin (8) | ✅ DONE | committed (push deferred) |
| operations (9: +process-doc узел) | ✅ DONE | committed (push deferred) |
| finance-plugin (8, journal ×2 оставлены) | ✅ DONE | этот коммит (push deferred) |
| brand-voice (3) | ⬜ | |
| ui-ux-pro-max (7, +правка PSR) | ⬜ | |
| finance-plugin (8, journal ×2 оставлены) | ✅ DONE | committed (push deferred) |
| brand-voice (3) | ✅ DONE | этот коммит (push deferred) |
| hookify (1–2) | ⏸ развилка владельцу | — |
| ui-ux-pro-max (7, +правка PSR) | ⏸ развилка владельцу | — |
### Доп-каскады, выявленные на superpowers (учесть для крупных комков)
+5 -5
View File
@@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi
describe('registry-load', () => {
beforeEach(() => clearCache());
it('loads registry (145 nodes: разворачивание #33/#19/#57/#36/#42/#46/#74/#51/#61 комков 18.06.2026)', () => {
it('loads registry (147 nodes: разворачивание 9 комков #33/#19/#57/#36/#42/#46/#74/#51/#61/#76 18.06.2026)', () => {
const r = loadRegistry();
expect(r.nodes).toHaveLength(145);
expect(r.nodes).toHaveLength(147);
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);
// 145 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
// развёрнуты: ...,#51→9,#61 finance→8 (+7) → 137 active
expect(active).toHaveLength(137);
// 147 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
// развёрнуты: ...,#61→8,#76 brand-voice→3 (+2) → 139 active
expect(active).toHaveLength(139);
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');