From f01f5b8bbc3005b71ff3a1bd2772915490112364 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:09:38 +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=20adr-kit=20=E2=80=94=20adr=20+=20judge=20(?= =?UTF-8?q?=D1=80=D0=BE=D1=83=D1=82=D0=B5=D1=80-=D1=80=D0=B5=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик adr-kit развёрнут в 2 содержательные карточки (служебные init/setup/upgrade/lint/migrate/ install-hooks в реестр не входят — решение владельца 18.06). - 2 карточки: adr-kit__adr (ведение ADR) + adr-kit__judge (сверка vs Accepted ADR) - nodes.yaml: узел #36 → #36a/#36b; триггеры (adr→#36a, enforcement→#36b); ссылки L4/L5 обновлены на adr-kit:adr - зонтик adr-kit убран (карточка + узел) - registry-load.test: 110 узлов / 102 active - m3b-node-graph: резолв известного узла #36 → #36a Регрессия (без 5 pre-existing node:test файлов): 4361 passed, exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/registry/contracts/adr-kit.contract.json | 12 ------- .../contracts/adr-kit__adr.contract.json | 29 +++++++++++++++++ .../contracts/adr-kit__judge.contract.json | 29 +++++++++++++++++ docs/registry/nodes.yaml | 31 ++++++++++++++----- docs/registry/splitting-inventory.md | 4 +-- tools/m3b-node-graph-invariants.test.mjs | 2 +- tools/registry-load.test.mjs | 10 +++--- 7 files changed, 89 insertions(+), 28 deletions(-) delete mode 100644 docs/registry/contracts/adr-kit.contract.json create mode 100644 docs/registry/contracts/adr-kit__adr.contract.json create mode 100644 docs/registry/contracts/adr-kit__judge.contract.json diff --git a/docs/registry/contracts/adr-kit.contract.json b/docs/registry/contracts/adr-kit.contract.json deleted file mode 100644 index 0fd225a..0000000 --- a/docs/registry/contracts/adr-kit.contract.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "skill": "adr-kit", - "kind": "external", - "needs": ["архитектурное решение для фиксации/проверки"], - "produces": ["ADR в docs/adr/ + enforcement через adr-judge"], - "constraints": ["ADR + adr-judge lefthook job 9 (без LLM)", "НЕ диаграммы (mermaid)", "НЕ справочник паттернов (architecture-patterns)"], - "preview-form": "outline", - "defaults": ["adr-judge декларативно, без --llm"], - "key-decisions": ["что фиксировать как ADR; статус решения"], - "acceptance-criteria": ["решение зафиксировано ADR, adr-judge проходит"], - "source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" } -} diff --git a/docs/registry/contracts/adr-kit__adr.contract.json b/docs/registry/contracts/adr-kit__adr.contract.json new file mode 100644 index 0000000..3a23e97 --- /dev/null +++ b/docs/registry/contracts/adr-kit__adr.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "adr-kit:adr", + "kind": "external", + "needs": [ + "намерение принять/записать архитектурное решение" + ], + "produces": [ + "ADR-файл в docs/adr/ + enforcement-гейт" + ], + "constraints": [ + "содержательный навык плагина adr-kit", + "служебные навыки (init/install-hooks/lint/migrate/setup/upgrade) в реестр не входят" + ], + "preview-form": "outline", + "defaults": [ + "adr — для записи и ведения архитектурных решений" + ], + "key-decisions": [ + "какое решение фиксировать" + ], + "acceptance-criteria": [ + "ADR оформлен и enforce-ится" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/adr-kit__judge.contract.json b/docs/registry/contracts/adr-kit__judge.contract.json new file mode 100644 index 0000000..18918f6 --- /dev/null +++ b/docs/registry/contracts/adr-kit__judge.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "adr-kit:judge", + "kind": "external", + "needs": [ + "staged diff для сверки против принятых ADR" + ], + "produces": [ + "вердикт соответствия + пути разрешения нарушения" + ], + "constraints": [ + "содержательный навык плагина adr-kit", + "служебные навыки (init/install-hooks/lint/migrate/setup/upgrade) в реестр не входят" + ], + "preview-form": "outline", + "defaults": [ + "judge — сверка кода против Accepted ADR (lefthook job 9)" + ], + "key-decisions": [ + "что нарушает ADR" + ], + "acceptance-criteria": [ + "дифф сверён с ADR до коммита" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/nodes.yaml b/docs/registry/nodes.yaml index b6b9251..c8a7b90 100644 --- a/docs/registry/nodes.yaml +++ b/docs/registry/nodes.yaml @@ -838,23 +838,38 @@ nodes: attributes: tooling_section: "§4.9 #35" - - id: "#36" - name: "adr-kit" - slug: "adr-kit" + - id: "#36a" + name: "adr-kit-adr" + slug: "adr-kit:adr" category: "off-phase" subcategory: "architecture-tooling" status: "active" dormancy_reason: null - capabilities: "Создаёт и хранит Architecture Decision Records (ADR) в `docs/adr/`; `adr-judge` проверяет соответствие кода решениям в lefthook pre-commit job 9 (без LLM-вызовов)." + capabilities: "Создаёт и ведёт Architecture Decision Records (ADR) в docs/adr/ + enforcement-гейт." triggers: - {keyword: "архитектурные решения", weight: 1.0} - {keyword: "adr", weight: 1.0} - - {keyword: "enforcement", weight: 1.0} - {keyword: "architecture decision record", weight: 1.0} - {keyword: "архитектурное решение", weight: 1.0} + boundaries: [] + chain_membership: ["L4", "L5"] + attributes: + tooling_section: "§4.11 #36" + install: "claude plugin install adr-kit@rvdbreemen-adr-kit" + + - id: "#36b" + name: "adr-kit-judge" + slug: "adr-kit:judge" + category: "off-phase" + subcategory: "architecture-tooling" + status: "active" + dormancy_reason: null + capabilities: "Сверяет staged diff против принятых ADR (lefthook pre-commit job 9, без LLM); вердикт + пути разрешения." + triggers: + - {keyword: "enforcement", weight: 1.0} boundaries: - {relation: "adr-judge lefthook job 9"} - chain_membership: ["L4", "L5"] + chain_membership: [] attributes: tooling_section: "§4.11 #36" install: "claude plugin install adr-kit@rvdbreemen-adr-kit" @@ -2111,7 +2126,7 @@ chains: L4: name: "diagram rendering chain" sequence: - - "#36" + - "adr-kit:adr" - "#37" - "#51" - "#52" @@ -2119,7 +2134,7 @@ chains: L5: name: "architecture triangle chain" sequence: - - "#36" + - "adr-kit:adr" - "#38" - "#43" diff --git a/docs/registry/splitting-inventory.md b/docs/registry/splitting-inventory.md index 52d8ac2..4efe406 100644 --- a/docs/registry/splitting-inventory.md +++ b/docs/registry/splitting-inventory.md @@ -112,8 +112,8 @@ |---|---|---| | claude-md-management (2) | ✅ DONE | e98ba1e (pushed) | | superpowers (14) | ✅ DONE | 5a7c5c2 (pushed) | -| plugin-dev (7) | ✅ DONE | этот коммит | -| adr-kit (2: adr, judge) | ⬜ | | +| plugin-dev (7) | ✅ DONE | ded5372 (pushed) | +| adr-kit (2: adr, judge) | ✅ DONE | этот коммит | | hookify (1–2) | ⬜ | | | product-management (8) | ⬜ | | | design-plugin (7) | ⬜ | | diff --git a/tools/m3b-node-graph-invariants.test.mjs b/tools/m3b-node-graph-invariants.test.mjs index 508d69f..c8a4d75 100644 --- a/tools/m3b-node-graph-invariants.test.mjs +++ b/tools/m3b-node-graph-invariants.test.mjs @@ -14,7 +14,7 @@ describe('Машина 3-B — граф на реальном реестре', ( const reg = loadRegistry({ registryPath, useCache: false }); const g = buildNodeGraph(reg); expect(g.nodes.length).toBeGreaterThan(50); - expect(resolveNode(g, '#36')).not.toBe(null); // adr-kit by id + expect(resolveNode(g, '#36a')).not.toBe(null); // adr-kit:adr by id (#36 развёрнут в #36a/#36b) expect(resolveNode(g, 'mermaid')).not.toBe(null); // by slug expect(resolveNode(g, 'totally-made-up-skill')).toBe(null); // выдумка }); diff --git a/tools/registry-load.test.mjs b/tools/registry-load.test.mjs index eb527a8..e642366 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 (109 nodes: разворачивание #33/#19/#57 комков 18.06.2026)', () => { + it('loads registry (110 nodes: разворачивание #33/#19/#57/#36 комков 18.06.2026)', () => { const r = loadRegistry(); - expect(r.nodes).toHaveLength(109); + expect(r.nodes).toHaveLength(110); 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); - // 109 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred; - // развёрнуты комки: #33→2, #19→14, #57 plugin-dev→7 (active +1+13+6) → 82+13+6 = 101 active - expect(active).toHaveLength(101); + // 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); 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');