# §VII Plugin Regroup + §X Russian/Hierarchy — 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:** Перегруппировать §VII Skills с функциональных категорий на 5 plugin-based групп + локализовать §X UI на русский + добавить иерархическую структуру sidebar (governance vs info flow) + edge-click sidebar с описаниями.

**Architecture:** Точечные правки одного файла `hooks-skills-plugins-map.html` (2983 строки). HTML text edits для локализации, секционная перепись для §VII, JS refactor sidebar logic + новые mapping constants + edge-click handler.

**Tech Stack:** HTML + CSS variables + vanilla JS + D3.js v7. Никаких новых dependencies, никаких новых файлов.

**Spec reference:** [`2026-05-10-section-VII-X-russian-hierarchy-design.md`](../specs/2026-05-10-section-VII-X-russian-hierarchy-design.md) (10 секций, ~460 строк).

---

## File Structure

### Модифицируется

| File | Что меняется |
|---|---|
| `docs/visualizations/hooks-skills-plugins-map.html` (2983 строки) | §VII перепись (~180/+185), §X HTML 24 правки, §X JS +~100/-25, §X CSS +~25. Итого ~3050 строк после изменений. |

### Не создаётся / не удаляется

Никаких новых файлов. Никаких удалений.

---

## Tasks

### Task 1: §VII — Section title + lede update

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:2117-2123`

- [ ] **Step 1: Edit title from "по назначению" to "по плагинам"**

Use Edit tool. Найти:

```html
      <div class="section-num display-i">VII</div>
      <h2 class="section-title">Скилы по&nbsp;назначению</h2>
```

Заменить на:

```html
      <div class="section-num display-i">VII</div>
      <h2 class="section-title">Скилы по&nbsp;плагинам</h2>
```

- [ ] **Step 2: Update section lede**

Use Edit tool. Найти:

```html
      <p class="section-lede">
        Все доступные скилы (~22 штуки), сгруппированные по тому, какую задачу решают.
        Большинство — внутри плагина superpowers; остальные приходят отдельно.
      </p>
```

Заменить на:

```html
      <p class="section-lede">
        Все 28 скилов сгруппированы по родительскому плагину. 18 принадлежат
        одному из 4 установленных плагинов, 10 — &laquo;standalone / встроенные&raquo;
        (не доставляются плагином, идут с Claude Code как часть базовой системы).
      </p>
```

- [ ] **Step 3: Verify в браузере**

Refresh, scroll к §VII. Expected: заголовок «Скилы по плагинам», новый лид-параграф.

---

### Task 2: §VII — Group 1 (superpowers, 14 skills)

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:2125-2192` (одна `<div class="sp-row">` группа)

- [ ] **Step 1: Replace 'Процесс работы' group with 'superpowers' group**

Use Edit tool. Найти первую sp-row для «Процесс работы»:

```html
        <div class="sp-row">
          <div class="sp-cat">
            <div class="sp-cat-symbol">§</div>
            <div class="sp-cat-name">Процесс работы</div>
            <div class="sp-cat-meta">14&nbsp;skills · superpowers</div>
          </div>
```

Заменить на:

```html
        <div class="sp-row">
          <div class="sp-cat">
            <div class="sp-cat-symbol">⚡</div>
            <div class="sp-cat-name">superpowers</div>
            <div class="sp-cat-meta">14&nbsp;skills · obra/superpowers v5.1.0</div>
          </div>
```

Остальная часть sp-row (с 14 sp-skill-row) остаётся без изменений — этих 14 скилов и так уже в данной группе.

- [ ] **Step 2: Verify**

Refresh. §VII первая группа — теперь «superpowers ⚡» с метой «14 skills · obra/superpowers v5.1.0», 14 скилов с описаниями ниже.

---

### Task 3: §VII — Group 2 (claude-md-management, 2 skills)

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:2193-2210`

- [ ] **Step 1: Replace 'Документация' header**

Use Edit tool. Найти:

```html
          <div class="sp-cat">
            <div class="sp-cat-symbol">¶</div>
            <div class="sp-cat-name">Документация</div>
            <div class="sp-cat-meta">2&nbsp;skills · claude-md-management</div>
          </div>
```

Заменить на:

```html
          <div class="sp-cat">
            <div class="sp-cat-symbol">¶</div>
            <div class="sp-cat-name">claude-md-management</div>
            <div class="sp-cat-meta">2&nbsp;skills · anthropic · claude-plugins-official</div>
          </div>
```

- [ ] **Step 2: Verify**

Refresh. Вторая группа: «claude-md-management ¶», правильная мета.

---

### Task 4: §VII — Group 3+4 (frontend-design + ui-ux-pro-max separately)

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:2211-2228`

Текущая группа «UI / Дизайн» содержит 2 скила вместе (frontend-design + ui-ux-pro-max). Нужно разделить на 2 отдельные группы.

- [ ] **Step 1: Replace 'UI / Дизайн' single group with 'frontend-design' + 'ui-ux-pro-max' separate groups**

Use Edit tool. Найти:

```html
        <div class="sp-row">
          <div class="sp-cat">
            <div class="sp-cat-symbol">◊</div>
            <div class="sp-cat-name">UI / Дизайн</div>
            <div class="sp-cat-meta">2&nbsp;skills · paired stack</div>
          </div>
          <div class="sp-skills-detail">
            <div class="sp-skill-row">
              <div class="sp-skill-key">frontend-design</div>
              <div class="sp-skill-what"><em>Создание distinctive UI.</em> Избегает generic AI-aesthetics. Distinctive fonts, bold direction, осознанные дизайн-выборы. Эта страница построена через него.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">ui-ux-pro-max</div>
              <div class="sp-skill-what"><em>Резерв-библиотека UI/UX.</em> 50+ стилей, 161 палитра, 57 пар шрифтов, 99 UX guidelines, 25 типов графиков для 10 стеков. Активируется через PSR_v1 R14 pipeline.</div>
            </div>
          </div>
        </div>
```

Заменить на:

```html
        <div class="sp-row">
          <div class="sp-cat">
            <div class="sp-cat-symbol">◊</div>
            <div class="sp-cat-name">frontend-design</div>
            <div class="sp-cat-meta">1&nbsp;skill · anthropic · claude-plugins-official</div>
          </div>
          <div class="sp-skills-detail">
            <div class="sp-skill-row">
              <div class="sp-skill-key">frontend-design</div>
              <div class="sp-skill-what"><em>Создание distinctive UI.</em> Избегает generic AI-aesthetics. Distinctive fonts, bold direction, осознанные дизайн-выборы. Эта страница построена через него.</div>
            </div>
          </div>
        </div>

        <div class="sp-row">
          <div class="sp-cat">
            <div class="sp-cat-symbol">△</div>
            <div class="sp-cat-name">ui-ux-pro-max</div>
            <div class="sp-cat-meta">1&nbsp;skill · nextlevelbuilder · ui-ux-pro-max-skill</div>
          </div>
          <div class="sp-skills-detail">
            <div class="sp-skill-row">
              <div class="sp-skill-key">ui-ux-pro-max</div>
              <div class="sp-skill-what"><em>Резерв-библиотека UI/UX.</em> 50+ стилей, 161 палитра, 57 пар шрифтов, 99 UX guidelines, 25 типов графиков для 10 стеков. Активируется через PSR_v1 R14 pipeline.</div>
            </div>
          </div>
        </div>
```

- [ ] **Step 2: Verify**

Refresh. Теперь 2 отдельные группы: «frontend-design ◊» (1 skill) и «ui-ux-pro-max △» (1 skill).

---

### Task 5: §VII — Merge Config/Auto/Review into single 'Standalone' group (10 skills)

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:2229-2293` (текущие 3 группы Config/Auto/Review)

Текущие 3 группы (Конфигурация 6 / Автоматизация 2 / Code review 2) — все standalone скилы (не в плагине). Объединить в одну «Standalone / встроенные» с 10 skills.

- [ ] **Step 1: Replace 3 groups with single 'Standalone' group**

Use Edit tool. Найти:

```html
        <div class="sp-row">
          <div class="sp-cat">
            <div class="sp-cat-symbol">⚙</div>
            <div class="sp-cat-name">Конфигурация и инфраструктура</div>
            <div class="sp-cat-meta">~6&nbsp;skills · стандартные</div>
          </div>
          <div class="sp-skills-detail">
            <div class="sp-skill-row">
              <div class="sp-skill-key">update-config</div>
              <div class="sp-skill-what"><em>Правки settings.json.</em> Хуки, permissions, env vars, MCP servers, plugins. Любая автоматизация behaviour'а — через этот skill.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">keybindings-help</div>
              <div class="sp-skill-what"><em>Клавиатурные сокращения.</em> Настройка `~/.claude/keybindings.json` — chord-bindings, rebind keys.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">simplify</div>
              <div class="sp-skill-what"><em>Review недавнего кода.</em> Reuse / quality / efficiency. Находит дубли, over-engineering, dead code — потом фиксит.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">fewer-permission-prompts</div>
              <div class="sp-skill-what"><em>Снижение шума permission prompts.</em> Сканирует transcript'ы, добавляет allowlist в settings.json для частых read-only действий.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">init</div>
              <div class="sp-skill-what"><em>Новый проект → новый CLAUDE.md.</em> Инициализация документации для нового codebase с анализом структуры.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">claude-api</div>
              <div class="sp-skill-what"><em>Claude API / Anthropic SDK apps.</em> Build / debug / optimize. Также миграция между версиями моделей (4.5 → 4.6 → 4.7).</div>
            </div>
          </div>
        </div>

        <div class="sp-row">
          <div class="sp-cat">
            <div class="sp-cat-symbol">↻</div>
            <div class="sp-cat-name">Автоматизация и циклы</div>
            <div class="sp-cat-meta">2&nbsp;skills · scheduling</div>
          </div>
          <div class="sp-skills-detail">
            <div class="sp-skill-row">
              <div class="sp-skill-key">loop</div>
              <div class="sp-skill-what"><em>Запуск prompt'а на recurring interval.</em> Например `/loop 5m /foo` — каждые 5 мин. Или self-paced если без интервала. Для polling, мониторинга.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">schedule</div>
              <div class="sp-skill-what"><em>Cron-расписания для агентов.</em> Создание / управление scheduled remote routines. Также one-time scheduled запуски («сделай это завтра в 15:00»).</div>
            </div>
          </div>
        </div>

        <div class="sp-row">
          <div class="sp-cat">
            <div class="sp-cat-symbol">⌖</div>
            <div class="sp-cat-name">Code review</div>
            <div class="sp-cat-meta">2&nbsp;skills · final pass</div>
          </div>
          <div class="sp-skills-detail">
            <div class="sp-skill-row">
              <div class="sp-skill-key">review</div>
              <div class="sp-skill-what"><em>Review текущего PR на GitHub.</em> Чтение diff'а, замечания по логике, стилю, тестам. Подготовка к merge.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">security-review</div>
              <div class="sp-skill-what"><em>Security audit pending changes.</em> Полный security review текущей ветки: OWASP top 10, secrets, RLS, injection vectors.</div>
            </div>
          </div>
        </div>
```

Заменить на:

```html
        <div class="sp-row">
          <div class="sp-cat">
            <div class="sp-cat-symbol">⌖</div>
            <div class="sp-cat-name">Standalone / встроенные</div>
            <div class="sp-cat-meta">10&nbsp;skills · без плагина (часть базовой системы Claude Code)</div>
          </div>
          <div class="sp-skills-detail">
            <div class="sp-skill-row">
              <div class="sp-skill-key">update-config</div>
              <div class="sp-skill-what"><em>Правки settings.json.</em> Хуки, permissions, env vars, MCP servers, plugins. Любая автоматизация behaviour'а — через этот skill.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">keybindings-help</div>
              <div class="sp-skill-what"><em>Клавиатурные сокращения.</em> Настройка `~/.claude/keybindings.json` — chord-bindings, rebind keys.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">simplify</div>
              <div class="sp-skill-what"><em>Review недавнего кода.</em> Reuse / quality / efficiency. Находит дубли, over-engineering, dead code — потом фиксит.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">fewer-permission-prompts</div>
              <div class="sp-skill-what"><em>Снижение шума permission prompts.</em> Сканирует transcript'ы, добавляет allowlist в settings.json для частых read-only действий.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">init</div>
              <div class="sp-skill-what"><em>Новый проект → новый CLAUDE.md.</em> Инициализация документации для нового codebase с анализом структуры.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">claude-api</div>
              <div class="sp-skill-what"><em>Claude API / Anthropic SDK apps.</em> Build / debug / optimize. Также миграция между версиями моделей (4.5 → 4.6 → 4.7).</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">loop</div>
              <div class="sp-skill-what"><em>Запуск prompt'а на recurring interval.</em> Например `/loop 5m /foo` — каждые 5 мин. Или self-paced если без интервала. Для polling, мониторинга.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">schedule</div>
              <div class="sp-skill-what"><em>Cron-расписания для агентов.</em> Создание / управление scheduled remote routines. Также one-time scheduled запуски («сделай это завтра в 15:00»).</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">review</div>
              <div class="sp-skill-what"><em>Review текущего PR на GitHub.</em> Чтение diff'а, замечания по логике, стилю, тестам. Подготовка к merge.</div>
            </div>
            <div class="sp-skill-row">
              <div class="sp-skill-key">security-review</div>
              <div class="sp-skill-what"><em>Security audit pending changes.</em> Полный security review текущей ветки: OWASP top 10, secrets, RLS, injection vectors.</div>
            </div>
          </div>
        </div>
```

- [ ] **Step 2: Verify §VII has 5 groups**

```bash
grep -c "<div class=\"sp-row\">" "c:/моя/проекты/портал crm/Документация/docs/visualizations/hooks-skills-plugins-map.html"
```

Expected: 5 (был 6).

- [ ] **Step 3: Verify all 28 skills present**

```bash
grep -c "class=\"sp-skill-key\"" "c:/моя/проекты/портал crm/Документация/docs/visualizations/hooks-skills-plugins-map.html"
```

Expected: 28 (без изменений — все скилы переехали, никаких потерь).

---

### Task 6: §X HTML — title + reset button Russian

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:2433` (title) и `:2454` (reset button)

- [ ] **Step 1: Title to Russian**

Use Edit tool. Найти:

```html
      <h2 class="section-title">Связи &mdash; interactive map</h2>
```

Заменить на:

```html
      <h2 class="section-title">Связи &mdash; интерактивная карта</h2>
```

- [ ] **Step 2: Reset button to Russian**

Use Edit tool. Найти:

```html
        <button class="graph-reset">Reset layout</button>
```

Заменить на:

```html
        <button class="graph-reset">Сбросить расположение</button>
```

---

### Task 7: §X HTML — Filter chips Russian (7 chips)

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:2442-2448`

- [ ] **Step 1: Replace all 7 chip labels**

Use Edit tool. Найти:

```html
        <div class="graph-filters">
          <button class="graph-filter active" data-type="plugin">Plugins</button>
          <button class="graph-filter active" data-type="skill">Skills</button>
          <button class="graph-filter active" data-type="script">Scripts</button>
          <button class="graph-filter active" data-type="event">Events</button>
          <button class="graph-filter active" data-type="state">State</button>
          <button class="graph-filter active" data-type="perm">Perms</button>
          <button class="graph-filter active" data-type="rule">Rules</button>
        </div>
```

Заменить на:

```html
        <div class="graph-filters">
          <button class="graph-filter active" data-type="plugin">Плагины</button>
          <button class="graph-filter active" data-type="skill">Скилы</button>
          <button class="graph-filter active" data-type="script">Скрипты</button>
          <button class="graph-filter active" data-type="event">События</button>
          <button class="graph-filter active" data-type="state">Состояние</button>
          <button class="graph-filter active" data-type="perm">Права</button>
          <button class="graph-filter active" data-type="rule">Правила</button>
        </div>
```

**Важно:** `data-type` атрибуты остаются английскими — это data model, не label.

---

### Task 8: §X HTML — Legend node labels Russian (7)

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:2467-2473`

- [ ] **Step 1: Replace 7 node legend items**

Use Edit tool. Найти:

```html
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--rust); border-radius:50%;"></span>Plugin (4)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--blueprint); border-radius:50%;"></span>Skill (28)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--amber); border-radius:50%;"></span>Hook script (7)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--sage);"></span>Hook event (5)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--rust); transform:rotate(45deg);"></span>State file (1)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--ink-fade);"></span>Permission (3)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--ink); border-color:var(--rust);"></span>Rule (2)</div>
```

Заменить на:

```html
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--rust); border-radius:50%;"></span>Плагин (4)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--blueprint); border-radius:50%;"></span>Скил (28)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--amber); border-radius:50%;"></span>Скрипт хука (7)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--sage);"></span>Событие хука (5)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--rust); transform:rotate(45deg);"></span>Файл состояния (1)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--ink-fade);"></span>Права (3)</div>
          <div class="graph-legend-item"><span class="graph-legend-swatch" style="background:var(--ink); border-color:var(--rust);"></span>Правило (2)</div>
```

---

### Task 9: §X HTML — Legend edge labels Russian (8)

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:2477-2484`

- [ ] **Step 1: Replace 8 edge legend items**

Use Edit tool. Найти:

```html
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--blueprint);"></span>contains</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--sage); border-width:2px;"></span>triggers</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--amber); border-width:2px;"></span>writes</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--amber); border-style:dashed;"></span>reads</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--rust); border-width:3px;"></span>mandates</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--ink-fade); border-style:dotted;"></span>references</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--rust); border-style:dashed;"></span>blocks</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--rust); border-style:dashed; border-width:2px;"></span>denies</div>
```

Заменить на:

```html
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--blueprint);"></span>содержит</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--sage); border-width:2px;"></span>запускает</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--amber); border-width:2px;"></span>пишет</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--amber); border-style:dashed;"></span>читает</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--rust); border-width:3px;"></span>обязывает</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--ink-fade); border-style:dotted;"></span>ссылается</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--rust); border-style:dashed;"></span>блокирует</div>
          <div class="graph-legend-item"><span class="graph-legend-line" style="border-color:var(--rust); border-style:dashed; border-width:2px;"></span>запрещает</div>
```

---

### Task 10: §X JS — Add Russian mapping constants + governance types + edge descriptions

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:~2700-2710` (после GRAPH_LINKS, перед DOMContentLoaded handler)

- [ ] **Step 1: Insert 4 new constants после GRAPH_LINKS console.log**

Use Edit tool. Найти:

```js
console.log('GRAPH_LINKS:', GRAPH_LINKS.length, '(expected 52)');

// ============================================================
// D3 SIMULATION + RENDER + INTERACTIVITY
// ============================================================
```

Заменить на:

```js
console.log('GRAPH_LINKS:', GRAPH_LINKS.length, '(expected 52)');

// ============================================================
// RUSSIAN LABEL MAPPINGS + CLASSIFICATION
// ============================================================
const EDGE_TYPE_RU = {
  contains: 'содержит',
  triggers: 'запускает',
  writes: 'пишет',
  reads: 'читает',
  mandates: 'обязывает',
  references: 'ссылается',
  blocks: 'блокирует',
  denies: 'запрещает'
};

const NODE_TYPE_RU = {
  plugin: 'Плагин',
  skill: 'Скил',
  script: 'Скрипт',
  event: 'Событие',
  state: 'Состояние',
  perm: 'Права',
  rule: 'Правило'
};

const EDGE_DESC = {
  contains: 'Плагин упаковывает скил и доставляет его в систему как часть marketplace-пакета.',
  triggers: 'Hook event запускает скрипт автоматически в момент события (SessionStart, PreToolUse, Stop, etc.).',
  writes: 'Скрипт записывает данные в общий state-файл $TEMP/claude-economy-<session_id>.json для других хуков той же сессии.',
  reads: 'Скрипт читает данные из state-файла, чтобы знать активный уровень экономии и применять правила.',
  mandates: 'Pravila §12 hard rule обязывает использовать этот skill для подходящих задач — §9 «Отступления» НЕ применяется.',
  references: 'Документ ссылается на другой как часть приоритетной цепочки правил (CLAUDE.md §1). При конфликте — приоритет у верхнего уровня.',
  blocks: 'permissions.ask требует явный approve пользователя перед Edit/Write этого файла. Защита от tampering.',
  denies: 'permissions.deny полностью запрещает Bash-операции (rm/mv/cp) над защищёнными файлами — обхода нет.'
};

const GOVERNANCE_TYPES = ['contains', 'mandates', 'triggers', 'blocks', 'denies'];

// ============================================================
// D3 SIMULATION + RENDER + INTERACTIVITY
// ============================================================
```

- [ ] **Step 2: Verify in browser console**

Refresh, F12 → Console. Type `EDGE_TYPE_RU.contains` — Expected: `"содержит"`.

---

### Task 11: §X JS — Refactor showSidebar для новой иерархии

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:~2811-2845` (function showSidebar)

- [ ] **Step 1: Replace showSidebar function**

Use Edit tool. Найти:

```js
  function showSidebar(node) {
    const outgoing = GRAPH_LINKS.filter(l =>
      (typeof l.source === 'object' ? l.source.id : l.source) === node.id);
    const incoming = GRAPH_LINKS.filter(l =>
      (typeof l.target === 'object' ? l.target.id : l.target) === node.id);

    const out = outgoing.map(l => {
      const tgtId = typeof l.target === 'object' ? l.target.id : l.target;
      const tgt = GRAPH_NODES.find(n => n.id === tgtId);
      return `<li><b>${l.type}</b> → ${tgt ? tgt.label : tgtId}</li>`;
    }).join('');
    const inc = incoming.map(l => {
      const srcId = typeof l.source === 'object' ? l.source.id : l.source;
      const src = GRAPH_NODES.find(n => n.id === srcId);
      return `<li>${src ? src.label : srcId} <b>← ${l.type}</b></li>`;
    }).join('');

    sidebar.innerHTML = `
      <button class="graph-close" aria-label="Close">×</button>
      <div class="graph-sidebar-title">${node.label}</div>
      <div class="graph-sidebar-badge">${node.type}</div>
      <div style="font-size:0.85rem; color: var(--ink-soft); line-height: 1.5;">${node.desc}</div>
      ${outgoing.length ? `
      <div class="graph-sidebar-section">
        <div class="graph-sidebar-section-label">Исходящие (${outgoing.length})</div>
        <ul class="graph-conn-list">${out}</ul>
      </div>` : ''}
      ${incoming.length ? `
      <div class="graph-sidebar-section">
        <div class="graph-sidebar-section-label">Входящие (${incoming.length})</div>
        <ul class="graph-conn-list">${inc}</ul>
      </div>` : ''}
    `;
    sidebar.querySelector('.graph-close').addEventListener('click', clearHighlight);
  }
```

Заменить на:

```js
  function showSidebar(node) {
    const incoming = GRAPH_LINKS.filter(l =>
      (typeof l.target === 'object' ? l.target.id : l.target) === node.id);
    const outgoing = GRAPH_LINKS.filter(l =>
      (typeof l.source === 'object' ? l.source.id : l.source) === node.id);

    const governedBy = incoming.filter(l => GOVERNANCE_TYPES.includes(l.type));
    const governing  = outgoing.filter(l => GOVERNANCE_TYPES.includes(l.type));
    const infoFlow   = [...incoming, ...outgoing].filter(l => !GOVERNANCE_TYPES.includes(l.type));

    const fmtIncoming = list => list.map(l => {
      const srcId = typeof l.source === 'object' ? l.source.id : l.source;
      const src = GRAPH_NODES.find(n => n.id === srcId);
      return `<li>${src ? src.label : srcId} <b>${EDGE_TYPE_RU[l.type] ?? l.type}</b></li>`;
    }).join('');
    const fmtOutgoing = list => list.map(l => {
      const tgtId = typeof l.target === 'object' ? l.target.id : l.target;
      const tgt = GRAPH_NODES.find(n => n.id === tgtId);
      return `<li><b>${EDGE_TYPE_RU[l.type] ?? l.type}</b> → ${tgt ? tgt.label : tgtId}</li>`;
    }).join('');
    const fmtInfoFlow = list => list.map(l => {
      const sId = typeof l.source === 'object' ? l.source.id : l.source;
      const tId = typeof l.target === 'object' ? l.target.id : l.target;
      const isIncoming = tId === node.id;
      if (isIncoming) {
        const src = GRAPH_NODES.find(n => n.id === sId);
        return `<li>${src ? src.label : sId} <b>${EDGE_TYPE_RU[l.type] ?? l.type}</b></li>`;
      } else {
        const tgt = GRAPH_NODES.find(n => n.id === tId);
        return `<li><b>${EDGE_TYPE_RU[l.type] ?? l.type}</b> → ${tgt ? tgt.label : tId}</li>`;
      }
    }).join('');

    const typeLabel = NODE_TYPE_RU[node.type] ?? node.type;

    sidebar.innerHTML = `
      <button class="graph-close" aria-label="Close">×</button>
      <div class="graph-sidebar-title">${node.label}</div>
      <div class="graph-sidebar-badge">${typeLabel}</div>
      <div class="graph-sidebar-section">
        <div class="graph-sidebar-section-label">За что отвечает</div>
        <div style="font-size:0.85rem; color: var(--ink-soft); line-height: 1.5;">${node.desc}</div>
      </div>
      ${governedBy.length ? `
      <div class="graph-sidebar-section governance">
        <div class="graph-sidebar-section-label">Кто руководит (${governedBy.length})</div>
        <ul class="graph-conn-list">${fmtIncoming(governedBy)}</ul>
      </div>` : ''}
      ${governing.length ? `
      <div class="graph-sidebar-section governance">
        <div class="graph-sidebar-section-label">Кем руководит (${governing.length})</div>
        <ul class="graph-conn-list">${fmtOutgoing(governing)}</ul>
      </div>` : ''}
      ${infoFlow.length ? `
      <div class="graph-sidebar-section">
        <div class="graph-sidebar-section-label">Связи — info flow (${infoFlow.length})</div>
        <ul class="graph-conn-list">${fmtInfoFlow(infoFlow)}</ul>
      </div>` : ''}
    `;
    sidebar.querySelector('.graph-close').addEventListener('click', clearHighlight);
  }
```

- [ ] **Step 2: Verify in browser**

Refresh. Click на plugin узел (superpowers) — expected sidebar секции:

- За что отвечает (desc)
- Кем руководит (14): «содержит → brainstorming», etc.

Click на skill (brainstorming) — expected:

- За что отвечает
- Кто руководит (2): «superpowers содержит», «Pravila §12 обязывает»

Click на state-file — expected:

- За что отвечает
- Кто руководит (1): «permissions.deny запрещает»
- Связи — info flow (4): writes/reads edges

---

### Task 12: §X JS — Add showEdgeSidebar function

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:~2870` (после clearHighlight)

- [ ] **Step 1: Insert showEdgeSidebar after clearHighlight function**

Use Edit tool. Найти:

```js
  function clearHighlight() {
    activeId = null;
    nodeSel.classed('dimmed', false);
    linkSel.classed('dimmed', false);
    sidebar.innerHTML = '<div class="graph-sidebar-empty">Кликни на узел чтобы увидеть его связи…</div>';
  }

  nodeSel.on('click', (event, d) => {
```

Заменить на:

```js
  function clearHighlight() {
    activeId = null;
    nodeSel.classed('dimmed', false);
    linkSel.classed('dimmed', false);
    sidebar.innerHTML = '<div class="graph-sidebar-empty">Кликни на узел или связь чтобы увидеть детали…</div>';
  }

  function showEdgeSidebar(edge) {
    const sId = typeof edge.source === 'object' ? edge.source.id : edge.source;
    const tId = typeof edge.target === 'object' ? edge.target.id : edge.target;
    const src = GRAPH_NODES.find(n => n.id === sId);
    const tgt = GRAPH_NODES.find(n => n.id === tId);
    const ruLabel = EDGE_TYPE_RU[edge.type] ?? edge.type;
    const desc = EDGE_DESC[edge.type] ?? '';
    const srcType = NODE_TYPE_RU[src?.type] ?? '';
    const tgtType = NODE_TYPE_RU[tgt?.type] ?? '';

    sidebar.innerHTML = `
      <button class="graph-close" aria-label="Close">×</button>
      <div class="graph-sidebar-title">${ruLabel}</div>
      <div class="graph-sidebar-badge">Связь</div>
      <div class="graph-sidebar-section">
        <div class="graph-sidebar-section-label">Что это значит</div>
        <div style="font-size:0.85rem; color: var(--ink-soft); line-height: 1.5;">${desc}</div>
      </div>
      <div class="graph-sidebar-section">
        <div class="graph-sidebar-section-label">Источник — ${srcType}</div>
        <div style="font-family: 'Fraunces', serif; font-weight: 500; font-size: 1rem;">${src?.label ?? sId}</div>
        <div style="font-size:0.82rem; color: var(--ink-soft); line-height: 1.45; margin-top: 4px;">${src?.desc ?? ''}</div>
        <button class="graph-sidebar-navlink" data-nav-to="${sId}">Перейти к узлу →</button>
      </div>
      <div class="graph-sidebar-section">
        <div class="graph-sidebar-section-label">Цель — ${tgtType}</div>
        <div style="font-family: 'Fraunces', serif; font-weight: 500; font-size: 1rem;">${tgt?.label ?? tId}</div>
        <div style="font-size:0.82rem; color: var(--ink-soft); line-height: 1.45; margin-top: 4px;">${tgt?.desc ?? ''}</div>
        <button class="graph-sidebar-navlink" data-nav-to="${tId}">Перейти к узлу →</button>
      </div>
    `;
    sidebar.querySelector('.graph-close').addEventListener('click', clearHighlight);
    sidebar.querySelectorAll('.graph-sidebar-navlink').forEach(btn => {
      btn.addEventListener('click', () => {
        const targetId = btn.dataset.navTo;
        const targetNode = GRAPH_NODES.find(n => n.id === targetId);
        if (targetNode) highlightNode(targetNode);
      });
    });
  }

  function highlightEdge(edge) {
    activeId = `edge:${edge.source.id ?? edge.source}->${edge.target.id ?? edge.target}`;
    const sId = typeof edge.source === 'object' ? edge.source.id : edge.source;
    const tId = typeof edge.target === 'object' ? edge.target.id : edge.target;
    nodeSel.classed('dimmed', d => d.id !== sId && d.id !== tId);
    linkSel.classed('dimmed', l => l !== edge);
    showEdgeSidebar(edge);
  }

  nodeSel.on('click', (event, d) => {
```

---

### Task 13: §X JS — Add linkSel.on('click', ...) handler

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:~2890` (после linkSel.on('mouseout',...))

- [ ] **Step 1: Add click handler after mouseout**

Use Edit tool. Найти:

```js
  linkSel.on('mouseout', function() {
    tooltip.style('display', 'none');
    d3.select(this).style('stroke-width', null);
  });

  // ============================================================
  // INTERACTIVITY: drag
  // ============================================================
```

Заменить на:

```js
  linkSel.on('mouseout', function() {
    tooltip.style('display', 'none');
    d3.select(this).style('stroke-width', null);
  });

  linkSel.on('click', function(event, l) {
    event.stopPropagation();
    tooltip.style('display', 'none'); // dismiss hover tooltip if visible
    highlightEdge(l);
  });

  // ============================================================
  // INTERACTIVITY: drag
  // ============================================================
```

---

### Task 14: §X JS — Update tooltip text to Russian + applyFilters edge guard

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:~2891-2893` (tooltip html) + `:~2935` (applyFilters)

- [ ] **Step 1: Russian tooltip**

Use Edit tool. Найти:

```js
    tooltip.html(`<b>${l.type}</b>: ${src?.label ?? sId} → ${tgt?.label ?? tId}`)
```

Заменить на:

```js
    tooltip.html(`<b>${EDGE_TYPE_RU[l.type] ?? l.type}</b>: ${src?.label ?? sId} → ${tgt?.label ?? tId}`)
```

- [ ] **Step 2: applyFilters edge guard (clear highlight если active edge скрыт)**

Use Edit tool. Найти:

```js
  function applyFilters() {
    // If currently-selected node's type is being hidden — clear selection
    if (activeId) {
      const activeNode = GRAPH_NODES.find(n => n.id === activeId);
      if (activeNode && hiddenTypes.has(activeNode.type)) clearHighlight();
    }
```

Заменить на:

```js
  function applyFilters() {
    // If currently-selected node's type is being hidden — clear selection
    if (activeId && !activeId.startsWith('edge:')) {
      const activeNode = GRAPH_NODES.find(n => n.id === activeId);
      if (activeNode && hiddenTypes.has(activeNode.type)) clearHighlight();
    }
    // If currently-selected edge has hidden source/target type — clear
    if (activeId && activeId.startsWith('edge:')) {
      const match = activeId.match(/^edge:(.+)->(.+)$/);
      if (match) {
        const sN = GRAPH_NODES.find(n => n.id === match[1]);
        const tN = GRAPH_NODES.find(n => n.id === match[2]);
        if ((sN && hiddenTypes.has(sN.type)) || (tN && hiddenTypes.has(tN.type))) clearHighlight();
      }
    }
```

---

### Task 15: §X CSS — Add governance section + navlink styles

**Files:**

- Modify: `docs/visualizations/hooks-skills-plugins-map.html:~620-650` (existing graph-sidebar styles area)

- [ ] **Step 1: Add new CSS rules after existing .graph-sidebar-section**

Use Edit tool. Найти:

```css
.graph-sidebar-section {
  margin-top: 16px;
  padding-top: 12px;
  border-top: 1px dashed var(--rule);
}
```

Заменить на:

```css
.graph-sidebar-section {
  margin-top: 16px;
  padding-top: 12px;
  border-top: 1px dashed var(--rule);
}

.graph-sidebar-section.governance {
  border-top: 2px solid var(--rust);
  padding-top: 14px;
}

.graph-sidebar-navlink {
  margin-top: 10px;
  padding: 5px 10px;
  border: 1px solid var(--blueprint);
  background: var(--paper);
  color: var(--blueprint-deep);
  font-family: 'JetBrains Mono', monospace;
  font-size: 0.7rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 200ms, color 200ms;
}
.graph-sidebar-navlink:hover { background: var(--blueprint); color: var(--paper); }
```

---

### Task 16: Final verification

**Files:**

- Open: `docs/visualizations/hooks-skills-plugins-map.html` в браузере

- [ ] **Step 1: Open file и manual verification checklist**

Открой файл (F5 если уже открыт). Проверить:

- [ ] §VII: 5 групп (⚡ superpowers / ¶ claude-md / ◊ frontend-design / △ ui-ux-pro-max / ⌖ Standalone)
- [ ] §VII: все 28 skills присутствуют (через grep `sp-skill-key`)
- [ ] §VII title: «Скилы по плагинам»
- [ ] §X title: «Связи — интерактивная карта»
- [ ] §X 7 filter chips: Плагины/Скилы/Скрипты/События/Состояние/Права/Правила
- [ ] §X 7 legend node labels: Плагин/Скил/Скрипт хука/Событие хука/Файл состояния/Права/Правило
- [ ] §X 8 legend edge labels: содержит/запускает/пишет/читает/обязывает/ссылается/блокирует/запрещает
- [ ] §X reset button: «Сбросить расположение»
- [ ] §X click на узел: sidebar с секциями «За что отвечает» / «Кто руководит» / «Кем руководит» / «Связи — info flow»
- [ ] §X click на edge: sidebar с секциями «Что это значит» / Источник / Цель + 2 кнопки «Перейти к узлу →»
- [ ] §X edge click: подсвечивает src+tgt+edge, остальное dimmed
- [ ] §X tooltip: Russian edge labels («содержит: A → B»)
- [ ] §X navigation: click «Перейти к узлу →» переключает sidebar на этот узел
- [ ] §X applyFilters edge guard: спрятать категорию активного edge → sidebar сбрасывается

- [ ] **Step 2: Verify file structure через HTMLParser**

```bash
PYTHONIOENCODING=utf-8 python -c "
from html.parser import HTMLParser
class P(HTMLParser):
    def __init__(self):
        super().__init__()
        self.opened=[]
        self.unmatched=0
    def handle_starttag(self,t,a):
        if t not in ('br','img','input','meta','link','hr','source'):
            self.opened.append(t)
    def handle_endtag(self,t):
        if self.opened and self.opened[-1]==t: self.opened.pop()
        else: self.unmatched+=1
with open(r'c:\моя\проекты\портал crm\Документация\docs\visualizations\hooks-skills-plugins-map.html', encoding='utf-8') as f:
    p=P(); p.feed(f.read())
print('unclosed:', len(p.opened), 'orphans:', p.unmatched)
"
```

Expected: `unclosed: 0 orphans: 0`.

- [ ] **Step 3: Verify file size**

```bash
wc -l "c:/моя/проекты/портал crm/Документация/docs/visualizations/hooks-skills-plugins-map.html"
```

Expected: ~3050 строк (было 2983).

---

## Self-Review

### Spec coverage

| Spec requirement | Plan task |
|---|---|
| §3 §VII regroup: 5 groups | Tasks 2-5 |
| §3.3 title «Скилы по плагинам» | Task 1 step 1 |
| §3.3 5 unique symbols | Tasks 2-5 (⚡/¶/◊/△/⌖) |
| §4 Russian translation: title | Task 6 step 1 |
| §4 reset button | Task 6 step 2 |
| §4 7 filter chips | Task 7 |
| §4 7 legend node labels | Task 8 |
| §4 8 legend edge labels | Task 9 |
| §4 EDGE_TYPE_RU + NODE_TYPE_RU + EDGE_DESC + GOVERNANCE_TYPES | Task 10 |
| §5 Sidebar иерархия (governedBy / governing / infoFlow) | Task 11 |
| §6 Edge click → sidebar (showEdgeSidebar + highlightEdge) | Tasks 12-13 |
| §6.5 navigation buttons | Task 12 (data-nav-to + event listeners) |
| §7.3 risks: tooltip Russian + applyFilters edge guard | Task 14 |
| CSS additions | Task 15 |
| Success criteria verification | Task 16 |

✅ Все spec sections покрыты.

### Placeholder scan

- ✅ Нет TBD/TODO/«fill in details»
- ✅ Полный код в каждом step (все 28 skill rows показаны в Task 5, все CSS classes в Task 15)
- ✅ Exact file paths
- ✅ Exact commands с expected output

### Type consistency

- ✅ `EDGE_TYPE_RU`, `NODE_TYPE_RU`, `EDGE_DESC`, `GOVERNANCE_TYPES` — same names в spec и plan
- ✅ Function names `showSidebar`, `showEdgeSidebar`, `highlightNode`, `highlightEdge`, `clearHighlight` — consistent
- ✅ CSS class `graph-sidebar-section.governance`, `graph-sidebar-navlink` — consistent between Task 11 (use) и Task 15 (definition)
- ✅ Data attributes `data-nav-to` — defined в Task 12, used в Task 12 event listener
- ✅ `activeId` edge-prefix format `edge:src->tgt` — consistent между Task 12 (set) и Task 14 (parse)

---

## Execution Handoff

Plan complete and saved to `docs/superpowers/plans/2026-05-10-section-VII-X-russian-hierarchy.md`.

**Two execution options:**

**1. Subagent-Driven (recommended skill default)** — диспатчу subagent на каждую task, two-stage review. 16 tasks × 3 dispatches = ~48 invocations.

**2. Inline Execution** — выполняю tasks в этой сессии через executing-plans. Один файл, последовательные правки. Учитывая что я в контексте файла — inline эффективнее.

**Какой выбираешь?**
