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

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

- 8 карточек: brand-review, campaign-plan, competitive-brief, content-creation,
  draft-content, email-sequence, performance-report, seo-audit
- nodes.yaml: узел #74 → #74a..#74h; триггеры распределены (классификация
  marketing + маркетинговый контент → content-creation как resolver C1);
  ADR-015 boundary на content-creation; ссылка L16 обновлена
- marketing-plugin:competitive-brief отличён от product-management:competitive-brief
- зонтик убран; registry-load.test: 130 узлов / 122 active

Регрессия (без 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:33:54 +03:00
parent b365ebe567
commit 08c951a4b8
12 changed files with 349 additions and 31 deletions
+5 -5
View File
@@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi
describe('registry-load', () => {
beforeEach(() => clearCache());
it('loads registry (123 nodes: разворачивание #33/#19/#57/#36/#42/#46 комков 18.06.2026)', () => {
it('loads registry (130 nodes: разворачивание #33/#19/#57/#36/#42/#46/#74 комков 18.06.2026)', () => {
const r = loadRegistry();
expect(r.nodes).toHaveLength(123);
expect(r.nodes).toHaveLength(130);
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);
// 123 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
// развёрнуты: #33→2, #19→14, #57→7, #36→2, #42→8, #46 design→7 (active +...+6) → 115 active
expect(active).toHaveLength(115);
// 130 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
// развёрнуты: #33→2, #19→14, #57→7, #36→2, #42→8, #46→7, #74 marketing→8 (+7) → 122 active
expect(active).toHaveLength(122);
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');