feat: разворачивание комка claude-md-management — пилот реестра роутера

Эпик роутер-реестр, спека v2 §2. Развёрнут самый маленький комок-зонтик
в 2 отдельные карточки-навыка ради точного подбора роутером. Пилот выверил
конвенцию для остальных 11 комков.

- 2 карточки: claude-md-management__claude-md-improver + __revise-claude-md;
  поле skill = плагин:навык, kind external, zero-hash source
- nodes.yaml: узел #33 развёрнут в дочерние #33a/#33b; ссылка L12 обновлена
- schema.json: паттерн id расширен на дочерний суффикс #NNa
- registry-load.test: счётчики узлов 89 в 90, active 81 в 82
- splitting-inventory.md: инвентаризация 12 комков + выверенная конвенция
- тест-сторож split-pilot-claude-md + план пилота

Регрессия свода: 4361 passed, 0 failed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-18 22:35:59 +03:00
parent b978738be6
commit e98ba1e527
9 changed files with 320 additions and 23 deletions
@@ -0,0 +1,138 @@
# Пилот разворачивания комка: claude-md-management — Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Развернуть комок `claude-md-management.contract.json` (зонтик плагина) в 2 отдельные карточки-навыка `claude-md-management:claude-md-improver` и `claude-md-management:revise-claude-md`, удалив зонтик — и тем самым **выверить конвенцию разворачивания** для остальных 11 комков эпика.
**Architecture:** Каждый под-навык — отдельный `.contract.json`. Поле `skill` = `<плагин>:<навык>` (двоеточие; валидатор `validateContract` его допускает — проверено). Имя файла двоеточие на Windows не держит → конвенция имени `<плагин>__<навык>.contract.json` (двойное подчёркивание; нужно, т.к. короткий slug коллизирует — `competitive-brief` есть и у product-management, и у marketing). Зонтик-контракт удаляется (спека v2 §2: растворяется в под-навыки). `needs/produces` пока краткой прозой — токены словаря наденем на этапе графа (порядок эпика «расщепить → потом граф»; замок словаря опционален, регрессию не ломает). `kind: external` + `source{version:"n/a", hash:<64 нуля>, path:""}` как у текущего зонтика → G4-страж дрейфа инертен (официальный плагин, версию не сторожим).
**Tech Stack:** Node ESM, vitest, JSON-контракты в `docs/registry/contracts/`, модули `tools/skill-contract.mjs` + `tools/skill-contract-registry.mjs`.
---
## File Structure
- **Create:** `docs/registry/contracts/claude-md-management__claude-md-improver.contract.json` — карточка навыка audit/targeted-updates.
- **Create:** `docs/registry/contracts/claude-md-management__revise-claude-md.contract.json` — карточка навыка захвата learnings.
- **Delete:** `docs/registry/contracts/claude-md-management.contract.json` — зонтик (растворён).
- **Create (test):** `tools/split-pilot-claude-md.test.mjs` — проверяет: оба под-контракта валидны и грузятся реестром; зонтик отсутствует; весь каталог формо-валиден (errors === []).
---
## Цель
Выверить на самом маленьком комке (2 навыка) полную механику разворачивания: имя файла без двоеточия, поле `skill` с двоеточием, удаление зонтика, прохождение валидатора, отсутствие регрессии в реестре/охвате. Конвенция, подтверждённая пилотом, переиспользуется планами кластеров (superpowers, product-management, …). Источник — спека v2 §2 (D2) + реестр `docs/registry/splitting-inventory.md`.
---
### Task 1: Тест пилота (RED)
**Files:**
- Create: `tools/split-pilot-claude-md.test.mjs`
- [ ] **Шаг 1: Написать падающий тест**
```js
import { describe, it, expect } from 'vitest';
import { loadRegistry } from './skill-contract-registry.mjs';
const DIR = 'docs/registry/contracts';
describe('пилот разворачивания claude-md-management', () => {
const reg = loadRegistry({ dir: DIR });
const skills = reg.contracts.map((c) => c.skill);
it('весь каталог контрактов формо-валиден (нет ошибок сборки)', () => {
expect(reg.errors).toEqual([]);
});
it('зонтик claude-md-management удалён', () => {
expect(skills).not.toContain('claude-md-management');
});
it('оба под-навыка заведены с адресацией плагин:навык', () => {
expect(skills).toContain('claude-md-management:claude-md-improver');
expect(skills).toContain('claude-md-management:revise-claude-md');
});
});
```
- [ ] **Шаг 2: Прогнать тест — убедиться, что падает**
Run: `npx vitest run tools/split-pilot-claude-md.test.mjs`
Expected: FAIL — зонтик ещё на месте (`skills` содержит `claude-md-management`), под-навыков ещё нет.
### Task 2: Создать карточку claude-md-improver
**Files:**
- Create: `docs/registry/contracts/claude-md-management__claude-md-improver.contract.json`
- [ ] **Шаг 3: Записать контракт**
```json
{
"skill": "claude-md-management:claude-md-improver",
"kind": "external",
"needs": ["намерение проверить/улучшить CLAUDE.md (audit или точечные правки структуры/правил §5)"],
"produces": ["quality-report по CLAUDE.md (rubric) + targeted-правки файла"],
"constraints": ["один из двух входов плагина claude-md-management", "правка CLAUDE.md — только через этот канал (§5 п.10)", "внутри flow — синхрон Pravila+Tooling (п.7)"],
"preview-form": "none",
"defaults": ["claude-md-improver — для структурных изменений, добавления/удаления секций, правок правил §5 и версии в шапке"],
"key-decisions": ["audit целиком vs точечная правка конкретной секции"],
"acceptance-criteria": ["quality-report выдан ДО правок; правки targeted; нормативка синхронна"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
```
### Task 3: Создать карточку revise-claude-md
**Files:**
- Create: `docs/registry/contracts/claude-md-management__revise-claude-md.contract.json`
- [ ] **Шаг 4: Записать контракт**
```json
{
"skill": "claude-md-management:revise-claude-md",
"kind": "external",
"needs": ["намерение захватить learnings текущей сессии в CLAUDE.md"],
"produces": ["CLAUDE.md дополнен session-learnings (новые quirks/команды/паттерны)"],
"constraints": ["один из двух входов плагина claude-md-management", "правка CLAUDE.md — только через этот канал (§5 п.10)", "внутри flow — синхрон Pravila+Tooling (п.7)"],
"preview-form": "none",
"defaults": ["revise-claude-md — для захвата learnings из текущей сессии"],
"key-decisions": ["что из сессии достойно CLAUDE.md, а что — memory"],
"acceptance-criteria": ["learnings внесены через плагин; нормативка синхронна"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
```
### Task 4: Удалить зонтик
**Files:**
- Delete: `docs/registry/contracts/claude-md-management.contract.json`
- [ ] **Шаг 5: Удалить файл зонтика**
Удалить `docs/registry/contracts/claude-md-management.contract.json` (через файловую операцию; под полом — скриптом-файлом `os.remove`, не `rm`).
### Task 5: Зелёный прогон + регрессия
- [ ] **Шаг 6: Прогнать тест пилота — убедиться, что проходит**
Run: `npx vitest run tools/split-pilot-claude-md.test.mjs`
Expected: PASS — все 3 теста зелёные.
- [ ] **Шаг 7: Полная регрессия реестра/охвата**
Run: `npx vitest run` (полный свод из корня claude-brain — было 118 зелёных)
Expected: PASS — ни один тест не опирался на зонтик `claude-md-management`; число контрактов выросло на 1 (−1 зонтик +2 под-навыка). Если какой-то тест ассертит точное число контрактов или наличие `claude-md-management` — поправить тот тест (ожидаемое следствие разворачивания, зафиксировать в плане кластера).
---
## Само-ревью (по навыку)
- **Покрытие спеки:** план реализует §2 спеки v2 (адресация `плагин:навык`, растворение зонтика) в режиме пилота на 1 комке — для выверки конвенции перед массовой раскаткой (§8 «стадийно»).
- **Плейсхолдеры:** нет — тест-код и оба контракта приведены целиком с реальным контентом из SKILL.md / нашей нормативки.
- **Согласованность типов:** поле `skill` со значением `плагин:навык` проходит `validateContract` (требует лишь non-empty string); `kind:external` требует `source{version,hash}` — заданы (hash 64-hex нулей, как у зонтика); `preview-form:none` — в enum. Имя файла `__` проходит фильтр `loadRegistry` (`.endsWith('.contract.json')`).
- **Регрессия:** Шаг 7 — полный свод; риск только у теста, жёстко завязанного на старый зонтик (поправить точечно).
- **Выход пилота:** подтверждённая конвенция (имя файла `<плагин>__<навык>`, поле `skill:<плагин>:<навык>`, external+zero-hash, удаление зонтика, регрессия зелёная) → переиспользуется планами кластеров.