feat: разворачивание комка adr-kit — adr + judge (роутер-реестр)

Эпик роутер-реестр, спека 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) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-18 23:09:38 +03:00
parent ded5372f4e
commit f01f5b8bbc
7 changed files with 89 additions and 28 deletions
@@ -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": "" }
}
@@ -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": ""
}
}
@@ -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": ""
}
}
+23 -8
View File
@@ -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"
+2 -2
View File
@@ -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 (12) | ⬜ | |
| product-management (8) | ⬜ | |
| design-plugin (7) | ⬜ | |
+1 -1
View File
@@ -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); // выдумка
});
+5 -5
View File
@@ -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');