From 65224b268c05d3e74343a67dde21e28e9102c83d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 18 Jun 2026 23:37:05 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=80=D0=B0=D0=B7=D0=B2=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BA=D0=B0=20operations=20=E2=80=94=209=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B2=D1=8B=D0=BA=D0=BE=D0=B2=20(=D1=80=D0=BE=D1=83=D1=82?= =?UTF-8?q?=D0=B5=D1=80-=D1=80=D0=B5=D0=B5=D1=81=D1=82=D1=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик operations развёрнут в 9 под-узлов #51a..#51i. process-doc уже был вынесен карточкой (operations-process-doc.contract.json) — ей заведён узел #51d. - 8 новых карточек: capacity-plan, change-request, compliance-tracking, process-optimization, risk-assessment, runbook, status-report, vendor-review - process-doc — узел #51d на существующую карточку operations:process-doc - nodes.yaml: узел #51 → #51a..#51i; триггеры распределены; ссылка L4 → operations:runbook - зонтик убран; registry-load.test: 138 узлов / 130 active Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../contracts/operations.contract.json | 12 -- .../operations__capacity-plan.contract.json | 28 ++++ .../operations__change-request.contract.json | 28 ++++ ...rations__compliance-tracking.contract.json | 28 ++++ ...ations__process-optimization.contract.json | 28 ++++ .../operations__risk-assessment.contract.json | 28 ++++ .../operations__runbook.contract.json | 28 ++++ .../operations__status-report.contract.json | 28 ++++ .../operations__vendor-review.contract.json | 28 ++++ docs/registry/nodes.yaml | 128 ++++++++++++++++-- docs/registry/splitting-inventory.md | 4 +- tools/registry-load.test.mjs | 10 +- 12 files changed, 351 insertions(+), 27 deletions(-) delete mode 100644 docs/registry/contracts/operations.contract.json create mode 100644 docs/registry/contracts/operations__capacity-plan.contract.json create mode 100644 docs/registry/contracts/operations__change-request.contract.json create mode 100644 docs/registry/contracts/operations__compliance-tracking.contract.json create mode 100644 docs/registry/contracts/operations__process-optimization.contract.json create mode 100644 docs/registry/contracts/operations__risk-assessment.contract.json create mode 100644 docs/registry/contracts/operations__runbook.contract.json create mode 100644 docs/registry/contracts/operations__status-report.contract.json create mode 100644 docs/registry/contracts/operations__vendor-review.contract.json diff --git a/docs/registry/contracts/operations.contract.json b/docs/registry/contracts/operations.contract.json deleted file mode 100644 index 41c5d8c..0000000 --- a/docs/registry/contracts/operations.contract.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "skill": "operations", - "kind": "external", - "needs": ["задача по бизнес-процессу (документ/runbook/риск/capacity)"], - "produces": ["процессный артефакт (process-doc/runbook/risk/capacity/...)"], - "constraints": ["зонтик 9 скилов, 0 lifecycle-хуков", "process-doc → Mermaid-исходник рендерит mermaid (#37)", "НЕ as-is анализ из кода (process-analysis)"], - "preview-form": "outline", - "defaults": ["скил под тип артефакта"], - "key-decisions": ["какой из 9 скилов под задачу"], - "acceptance-criteria": ["процессный артефакт полон (шаги/владельцы)"], - "source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" } -} diff --git a/docs/registry/contracts/operations__capacity-plan.contract.json b/docs/registry/contracts/operations__capacity-plan.contract.json new file mode 100644 index 0000000..e51eeab --- /dev/null +++ b/docs/registry/contracts/operations__capacity-plan.contract.json @@ -0,0 +1,28 @@ +{ + "skill": "operations:capacity-plan", + "kind": "external", + "needs": [ + "workload/ресурсы для анализа ёмкости" + ], + "produces": [ + "прогноз utilization + рекомендации hire/deprioritize" + ], + "constraints": [ + "под-навык зонтика operations (бизнес-процессы)" + ], + "preview-form": "outline", + "defaults": [ + "capacity-plan — планирование ёмкости ресурсов" + ], + "key-decisions": [ + "узкие места по ресурсам" + ], + "acceptance-criteria": [ + "ёмкость спрогнозирована" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/operations__change-request.contract.json b/docs/registry/contracts/operations__change-request.contract.json new file mode 100644 index 0000000..d8c655c --- /dev/null +++ b/docs/registry/contracts/operations__change-request.contract.json @@ -0,0 +1,28 @@ +{ + "skill": "operations:change-request", + "kind": "external", + "needs": [ + "предлагаемое изменение системы/процесса" + ], + "produces": [ + "change request: impact-анализ + rollback-план" + ], + "constraints": [ + "под-навык зонтика operations (бизнес-процессы)" + ], + "preview-form": "outline", + "defaults": [ + "change-request — управление изменениями (CAB)" + ], + "key-decisions": [ + "риск и rollback" + ], + "acceptance-criteria": [ + "change задокументирован с rollback" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/operations__compliance-tracking.contract.json b/docs/registry/contracts/operations__compliance-tracking.contract.json new file mode 100644 index 0000000..a66ea87 --- /dev/null +++ b/docs/registry/contracts/operations__compliance-tracking.contract.json @@ -0,0 +1,28 @@ +{ + "skill": "operations:compliance-tracking", + "kind": "external", + "needs": [ + "требование комплаенса для отслеживания" + ], + "produces": [ + "трекинг комплаенса + audit-readiness (SOC2/ISO/GDPR)" + ], + "constraints": [ + "под-навык зонтика operations (бизнес-процессы)" + ], + "preview-form": "outline", + "defaults": [ + "compliance-tracking — отслеживание требований" + ], + "key-decisions": [ + "какие требования и сроки" + ], + "acceptance-criteria": [ + "комплаенс отслеживается" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/operations__process-optimization.contract.json b/docs/registry/contracts/operations__process-optimization.contract.json new file mode 100644 index 0000000..8965e7a --- /dev/null +++ b/docs/registry/contracts/operations__process-optimization.contract.json @@ -0,0 +1,28 @@ +{ + "skill": "operations:process-optimization", + "kind": "external", + "needs": [ + "неэффективный процесс для улучшения" + ], + "produces": [ + "оптимизация: устранение узких мест/лишних шагов" + ], + "constraints": [ + "под-навык зонтика operations (бизнес-процессы)" + ], + "preview-form": "outline", + "defaults": [ + "process-optimization — улучшение процессов" + ], + "key-decisions": [ + "где bottleneck" + ], + "acceptance-criteria": [ + "процесс оптимизирован" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/operations__risk-assessment.contract.json b/docs/registry/contracts/operations__risk-assessment.contract.json new file mode 100644 index 0000000..ca4f11f --- /dev/null +++ b/docs/registry/contracts/operations__risk-assessment.contract.json @@ -0,0 +1,28 @@ +{ + "skill": "operations:risk-assessment", + "kind": "external", + "needs": [ + "проект/вендор/процесс для оценки рисков" + ], + "produces": [ + "risk register: идентификация, оценка, митигация" + ], + "constraints": [ + "под-навык зонтика operations (бизнес-процессы)" + ], + "preview-form": "outline", + "defaults": [ + "risk-assessment — оценка операционных рисков" + ], + "key-decisions": [ + "какие риски критичны" + ], + "acceptance-criteria": [ + "риски оценены и митигированы" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/operations__runbook.contract.json b/docs/registry/contracts/operations__runbook.contract.json new file mode 100644 index 0000000..6279531 --- /dev/null +++ b/docs/registry/contracts/operations__runbook.contract.json @@ -0,0 +1,28 @@ +{ + "skill": "operations:runbook", + "kind": "external", + "needs": [ + "повторяемая операционная задача" + ], + "produces": [ + "runbook: пошаговые команды, troubleshooting, rollback, эскалация" + ], + "constraints": [ + "под-навык зонтика operations (бизнес-процессы)" + ], + "preview-form": "outline", + "defaults": [ + "runbook — операционный пошаговый гайд" + ], + "key-decisions": [ + "шаги и эскалация" + ], + "acceptance-criteria": [ + "runbook повторяемо исполним" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/operations__status-report.contract.json b/docs/registry/contracts/operations__status-report.contract.json new file mode 100644 index 0000000..2bd1b42 --- /dev/null +++ b/docs/registry/contracts/operations__status-report.contract.json @@ -0,0 +1,28 @@ +{ + "skill": "operations:status-report", + "kind": "external", + "needs": [ + "данные проекта для статус-отчёта" + ], + "produces": [ + "статус: KPI, риски, action items (green/yellow/red)" + ], + "constraints": [ + "под-навык зонтика operations (бизнес-процессы)" + ], + "preview-form": "outline", + "defaults": [ + "status-report — отчёт о статусе" + ], + "key-decisions": [ + "что эскалировать" + ], + "acceptance-criteria": [ + "статус-отчёт читаем и actionable" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/operations__vendor-review.contract.json b/docs/registry/contracts/operations__vendor-review.contract.json new file mode 100644 index 0000000..cd731e8 --- /dev/null +++ b/docs/registry/contracts/operations__vendor-review.contract.json @@ -0,0 +1,28 @@ +{ + "skill": "operations:vendor-review", + "kind": "external", + "needs": [ + "вендор для оценки" + ], + "produces": [ + "оценка вендора: TCO, риски, рекомендация" + ], + "constraints": [ + "под-навык зонтика operations (бизнес-процессы)" + ], + "preview-form": "outline", + "defaults": [ + "vendor-review — оценка вендора" + ], + "key-decisions": [ + "renew vs replace" + ], + "acceptance-criteria": [ + "вендор оценён с TCO" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/nodes.yaml b/docs/registry/nodes.yaml index 3873491..a12478a 100644 --- a/docs/registry/nodes.yaml +++ b/docs/registry/nodes.yaml @@ -1327,26 +1327,138 @@ nodes: attributes: tooling_section: "§4.25 #50" - - id: "#51" - name: "operations" - slug: "operations" + - id: "#51a" + name: "operations-capacity-plan" + slug: "operations:capacity-plan" category: "off-phase" subcategory: "business-process" status: "active" dormancy_reason: null - capabilities: "Плагин с 9 скилами для документирования и оптимизации бизнес-процессов: process-doc, runbook, capacity-plan, risk-assessment, compliance-tracking, change-request, vendor-review, status-report." + capabilities: "Анализ ёмкости ресурсов + прогноз utilization (hire/deprioritize)." + triggers: + - {keyword: "capacity plan", weight: 1.0} + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.26 #51" + + - id: "#51b" + name: "operations-change-request" + slug: "operations:change-request" + category: "off-phase" + subcategory: "business-process" + status: "active" + dormancy_reason: null + capabilities: "Change request: impact-анализ + rollback-план (CAB)." + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.26 #51" + + - id: "#51c" + name: "operations-compliance-tracking" + slug: "operations:compliance-tracking" + category: "off-phase" + subcategory: "business-process" + status: "active" + dormancy_reason: null + capabilities: "Отслеживание комплаенса + audit-readiness (SOC2/ISO/GDPR)." + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.26 #51" + + - id: "#51d" + name: "operations-process-doc" + slug: "operations:process-doc" + category: "off-phase" + subcategory: "business-process" + status: "active" + dormancy_reason: null + capabilities: "Структурированная документация бизнес-процесса (flowchart, RACI, SOP)." + triggers: + - {keyword: "бизнес-процесс документ", weight: 1.0} + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.26 #51" + + - id: "#51e" + name: "operations-process-optimization" + slug: "operations:process-optimization" + category: "off-phase" + subcategory: "business-process" + status: "active" + dormancy_reason: null + capabilities: "Оптимизация процесса: устранение узких мест и лишних шагов." triggers: - {keyword: "документирование/оптимизация бизнес-процессов", weight: 1.0} - - {keyword: "бизнес-процесс документ", weight: 1.0} - - {keyword: "runbook", weight: 1.0} - - {keyword: "capacity plan", weight: 1.0} + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.26 #51" + + - id: "#51f" + name: "operations-risk-assessment" + slug: "operations:risk-assessment" + category: "off-phase" + subcategory: "business-process" + status: "active" + dormancy_reason: null + capabilities: "Оценка операционных рисков: risk register (идентификация, оценка, митигация)." + triggers: - {keyword: "risk assessment", weight: 1.0} boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.26 #51" + + - id: "#51g" + name: "operations-runbook" + slug: "operations:runbook" + category: "off-phase" + subcategory: "business-process" + status: "active" + dormancy_reason: null + capabilities: "Операционный runbook: пошаговые команды, troubleshooting, rollback, эскалация." + triggers: + - {keyword: "runbook", weight: 1.0} + boundaries: [] chain_membership: ["L4"] attributes: tooling_section: "§4.26 #51" install: "claude plugin install operations@knowledge-work-plugins" + - id: "#51h" + name: "operations-status-report" + slug: "operations:status-report" + category: "off-phase" + subcategory: "business-process" + status: "active" + dormancy_reason: null + capabilities: "Статус-отчёт: KPI, риски, action items (green/yellow/red)." + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.26 #51" + + - id: "#51i" + name: "operations-vendor-review" + slug: "operations:vendor-review" + category: "off-phase" + subcategory: "business-process" + status: "active" + dormancy_reason: null + capabilities: "Оценка вендора: TCO, риски, рекомендация (renew vs replace)." + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.26 #51" + - id: "#52" name: "process-modeling" slug: "process-modeling" @@ -2408,7 +2520,7 @@ chains: sequence: - "adr-kit:adr" - "#37" - - "#51" + - "operations:runbook" - "#52" L5: diff --git a/docs/registry/splitting-inventory.md b/docs/registry/splitting-inventory.md index 93bb3dc..502b272 100644 --- a/docs/registry/splitting-inventory.md +++ b/docs/registry/splitting-inventory.md @@ -117,8 +117,8 @@ | hookify (1–2) | ⏸ развилка владельцу (slug hookify:hookify кривой) | | | product-management (8) | ✅ DONE | 0258b9d (pushed) | | design-plugin (7) | ✅ DONE | bf3d557 (committed, push deferred — observer-race) | -| marketing-plugin (8) | ✅ DONE | этот коммит (push deferred) | -| operations (8) | ⬜ | | +| marketing-plugin (8) | ✅ DONE | committed (push deferred) | +| operations (9: +process-doc узел) | ✅ DONE | этот коммит (push deferred) | | finance-plugin (7–8) | ⬜ | | | brand-voice (3) | ⬜ | | | ui-ux-pro-max (7, +правка PSR) | ⬜ | | diff --git a/tools/registry-load.test.mjs b/tools/registry-load.test.mjs index e688eaf..7ef68f9 100644 --- a/tools/registry-load.test.mjs +++ b/tools/registry-load.test.mjs @@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi describe('registry-load', () => { beforeEach(() => clearCache()); - it('loads registry (130 nodes: разворачивание #33/#19/#57/#36/#42/#46/#74 комков 18.06.2026)', () => { + it('loads registry (138 nodes: разворачивание #33/#19/#57/#36/#42/#46/#74/#51 комков 18.06.2026)', () => { const r = loadRegistry(); - expect(r.nodes).toHaveLength(130); + expect(r.nodes).toHaveLength(138); 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); - // 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); + // 138 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→8,#51 operations→9 (+8) → 130 active + expect(active).toHaveLength(130); 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');