# Карта автоматизации — iter5: фактический реколлаж блока ruflo

**Дата:** 2026-05-15
**Статус:** дизайн утверждён заказчиком («ок экономия 0%» после brainstorming — подход B + 2 сводных узла)
**Артефакт:** `docs/automation-graph.html` — интерактивный граф системы автоматизации Лидерры (vis.js Network 9.1.9)
**Предыдущая итерация:** iter4 «слияние ruflo big-bang» (`docs/superpowers/specs/2026-05-15-automation-graph-iter4-ruflo-design.md`, на origin/main `0f94c21`)

---

## 1. Контекст и проблема

«Карта» (`docs/automation-graph.html`) — единственный канонический артефакт визуализации системы автоматизации Лидерры. iter4 (2026-05-15) влил в карту ruflo big-bang: добавил группу `ruflo` и 11 узлов — ruflo Queen + 9 именованных swarm-ролей (Architect / Coder / Security / RLS-reviewer / QA / Tester / Reviewer / Memory-keeper / Daemon-worker) + ruflo MCP, рёбра делегирования в legacy-узлы (Кодер → Pest, Безопасность → RLS, RLS → скил rls-check), Queen → 4 узла-правила «перенял sub-policy».

**iter4 строился на нормативке и memory-описаниях — ДО фактической инспекции живого рантайма.** Заказчик 2026-05-15 поставил задачу: «распиши на схеме блок руфло кто какие плагины и скилы он использует, но не по документации, а фактически».

Проведена прямая инспекция рантайма ruflo: опрос MCP-сервера ruflo (`agent_list`, `hive-mind_status`, `swarm_status`, `system_status`, `hooks_list`, `mcp_status`, `memory_stats`, `config_list`, `agent_pool`), файловая система (`.claude/agents/`, `.claude/commands/`, `.claude/skills/`, `.claude-flow/`), журналы демона (`.claude-flow/logs/headless/`, `.claude-flow/daemon-state.json`), состояние hive-mind (`.claude-flow/hive-mind/state.json`, `.claude-flow/agents.json`).

### 1.1. Документ против факта (инспекция 2026-05-15)

| Что нарисовано на карте (iter4) | Что фактически | Источник факта |
|---|---|---|
| ruflo Queen + 9 именованных специализированных ролей | Queen + **10 одинаковых generic-воркеров** (`agentType: worker`, `hiveRole: worker`), все `idle`, у каждого `taskCount: 0` | `agent_list`, `hive-mind_status`, `.claude-flow/agents.json` |
| Рой делегирует задачи (Кодер → Pest и т.п.) | **0 задач, 0 раундов консенсуса, 0 общей памяти** за всё время; последний рой запущен с тестовой задачей «ответь словом READY и ничего не меняй» | `hive-mind_status` (`totalTasks:0`, `consensusRounds:0`, `sharedMemory:{}`), `.hive-mind/sessions/*.txt` |
| Демон ruflo «5 workers в local-fallback» | Демон работает, но воркеры `audit`/`optimize`/`testgaps` **на каждом запуске падают `spawn claude ENOENT`** — результат пустой (audit 29 запусков, optimize 19, testgaps 14 — все пустые). Журнал демона при этом помечает их «успешными» | `.claude-flow/logs/headless/*_result.log`, `.claude-flow/daemon-state.json` |
| ruflo MCP «~210 инструментов» (под Queen) | Верно: MCP-сервер живой (отдельный процесс, stdio). Но это **отдельный процесс**, не «под Queen» | `mcp_status` (pid, transport stdio) |
| Память ruflo «HNSW + реальные embeddings 384-dim» | Хранилище есть, но **0 записей** (MCP репортит `totalEntries:0`); в базе 2 тестовых «призрака» от alpha-бага HNSW #1122 | `memory_stats`, recall этой сессии |
| (не показано) Плагины ruflo | **0 установлено.** Папки `.claude-flow/plugins/` не существует; `ruflo plugins list` зависает на IPFS-discovery (реестр недоступен). ~20 плагинов — только *доступны* в реестре, не *установлены* | `Test-Path .claude-flow/plugins` → False, `ruflo plugins list` |
| (не показано) Скилы ruflo | **0.** В `.claude/skills/` только 2 проектных скила (`rls-check`, `q-item-add`) — оба были до ruflo | `Get-ChildItem .claude/skills` |
| (не показано) Что ruflo высыпал в проект | **100 файлов-определений агентов** в `.claude/agents/` (23 категории; 98 от ruflo + 2 проектных) + **88 slash-команд** в `.claude/commands/` — статичные файлы, рой их не использует | `Get-ChildItem` подсчёт |
| (не показано) Хуки ruflo в сессии | **1.** В `.claude/settings.json` вшит один хук ruflo — `UserPromptSubmit` → `tools/ruflo-recall-hook.mjs`. Внутренних хуков у ruflo 26-27, но в сессию Claude Code они не вшиты | `.claude/settings.json`, `hooks_list` |

**Вывод.** Карта рисует ruflo как стройную Queen-led иерархию из 9 специализированных агентов, делегирующих работу проектным инструментам. Фактически: 0 установленных плагинов, 0 привнесённых скилов, рой из 10 простаивающих безымянных воркеров (ни одной задачи), сломанный демон, почти пустая память. Реально работают только MCP-сервер (опционально вызываемый) и recall-хук. Делегирующие рёбра (Кодер → Pest и т.п.) изображают то, чего никогда не происходило.

## 2. Цель

Блок ruflo на `docs/automation-graph.html` отражает **фактическое состояние рантайма**, а не нормативную/документную декларацию. Топология сама сообщает правду: 0 установленных плагинов, 0 привнесённых скилов, рой простаивает, демон сломан, реально работают только MCP-сервер и recall-хук. 7 фиктивных ролей убраны; добавлено то, что ruflo реально притащил (каталог агентов, slash-команды, recall-хук) сводными узлами.

**Вне цели:** чинить сам сломанный демон, добавлять LLM-ключи, менять рантайм ruflo. iter5 — только карта: она фиксирует факт, а не исправляет его. Починка демона — отдельная задача при желании заказчика.

## 3. Решения brainstorming (утверждены заказчиком)

| # | Вопрос | Решение |
|---|---|---|
| Q1 | Как перерисовать блок ruflo под фактическое состояние? | **Подход B — фактический реколлаж.** Убрать 9 фиктивных ролей; перестроить кластер так, чтобы топология сама отражала реальность (рой из 10 idle-воркеров одним узлом, реальный след — каталог/команды/хук, демон с маркером поломки, бейдж «0 плагинов / 0 скилов»). Убрать фиктивные делегирующие рёбра. |
| Q2 | Насколько подробно показывать то, что ruflo высыпал в проект (100 агентов + 88 команд)? | **2 сводных узла** — `каталог агентов ruflo (100 определений)` + `slash-команды ruflo (88)`; разбивка по категориям — в поле «Что делает» / «Ограничения». |

Отклонены: подход A «точечная честная правка» (структура карты продолжала бы выглядеть как 9-ролевой рой — врёт топологией, даже если tooltip'ы честные); подход C «двухслойный декларация vs факт» (почти удваивает кластер до ~18-20 узлов на и так плотной карте; разрыв «декларация ≠ факт» уже несёт 🔴-конфликт `ruflo_queen ↔ pravila`).

## 4. Подход

**Правка `automation-graph.html` на месте**, iter5 поверх iter4. Затрагивается только блок ruflo (узлы группы `ruflo`, ребра ruflo, их `NODE_DETAILS`/`EDGE_DETAILS`) + 3 точечных правки в legacy-узлах ради корректного двустороннего отображения конфликтов (§6). Радиальный layout 73 legacy-узлов, SECTION 4–8 (vis-init, легенда, тулбар, resize, подсветка), нормативные документы — не трогаются.

Группа `ruflo` (оранжевая) и `CATEGORY_LABELS.ruflo`, пункт `cat-legend` `group:ruflo` — уже есть с iter4, остаются без изменений (узлов в группе станет 9 вместо 11).

## 5. Детальный дизайн

### 5.1. Узлы — было 11 (группа `ruflo`) → станет 9

**Убираются 7 узлов** (фиктивные роли — таких ролей в рантайме нет): `ruflo_architect`, `ruflo_coder`, `ruflo_security`, `ruflo_rls`, `ruflo_qa`, `ruflo_tester`, `ruflo_reviewer`. Их `NODE_DETAILS` удаляются.

**Сохраняются 4 узла** (id остаются, содержание переписывается под факт): `ruflo_queen`, `ruflo_daemon`, `ruflo_mcp`, `ruflo_memory` (id `ruflo_memory` переиспользуется: был «Memory-keeper агент» → станет «хранилище памяти ruflo»).

**Добавляются 5 узлов** группы `ruflo`: `ruflo_workers`, `ruflo_recall_hook`, `ruflo_agents_catalog`, `ruflo_commands`, `ruflo_plugins`.

`mem_ruflo` (группа `memory`) — остаётся; id и группа без изменений, координаты корректируются (см. ниже — старая позиция `-1700, -470` пересекалась бы с новым `ruflo_recall_hook`), `NODE_DETAILS` слегка освежается.

**Итоговый набор 9 узлов группы `ruflo`** — кластер в верхнем-левом углу вне радиального layout (фиксированные `x`/`y`, не `pos()`). Координаты выбраны так, чтобы все узлы кластера были при `x ≤ -1110` и `y ≤ -400` — это гарантирует зазор ≥150 px от ближайшего legacy-узла радиального кольца 6 в W-секторе (`mem_state` ≈ `-955, -694`):

| id | label (через `\n`) | x | y | size |
|---|---|---|---|---|
| `ruflo_queen` | `ruflo Queen\n(hive-mind)` | -1340 | -700 | 44 |
| `ruflo_plugins` | `плагины ruflo\n0 из 20 · скилов 0` | -1340 | -880 | 20 |
| `ruflo_workers` | `10 воркеров\nhive-mind (idle)` | -1160 | -800 | 26 |
| `ruflo_agents_catalog` | `каталог агентов ruflo\n(100 определений)` | -1530 | -830 | 24 |
| `ruflo_commands` | `slash-команды\nruflo (88)` | -1140 | -630 | 22 |
| `ruflo_daemon` | `демон ruflo\n(воркеры падают)` | -1560 | -650 | 24 |
| `ruflo_memory` | `память ruflo\n(~0 записей)` | -1380 | -500 | 24 |
| `ruflo_mcp` | `ruflo MCP\n(~210 инструментов)` | -1190 | -460 | 26 |
| `ruflo_recall_hook` | `хук recall\n(UserPromptSubmit)` | -1570 | -470 | 22 |

`mem_ruflo` (группа `memory`, без изменений по сути) — координаты сдвигаются к `-1740, -620`, size 14, чтобы не пересечься с обновлённым кластером.

Финальные позиции корректируются по visual smoke при перекрытии (§8). Координаты группы `ruflo` все за пределами радиуса 1180 (радиальный граф) — пересечения с legacy-графом нет.

Узел `ruflo_recall_hook` помещается в группу `ruflo` (оранжевую), а не `hooks`: задача iter5 — расписать блок ruflo цельно, а recall-хук это ключевая (и единственная) реальная точка интеграции ruflo в сессию Claude Code. Категорийный бейдж в легенде покажет «ruflo (оркестратор)»; то, что это хук типа `UserPromptSubmit`, раскрыто в поле «Что делает». Следствие выбора: фильтр нижней легенды `group:hooks` не подсветит recall-хук, `group:ruflo` — подсветит (это осознанный компромисс в пользу цельности кластера).

Итог по группам: rules 4, plugins 5, skills_sp 14, skills_proj 2, hooks 5, agents 11, mcp 7, lefthook 10, memory 16, **ruflo 9** = **83 узла** (было 85).

### 5.2. Рёбра — было 22 (ruflo) → станет 16

**Удаляются все 22 рёбра ruflo iter4** (9 Queen→роль, Queen→mcp, 4 Queen→правила, 4 swarm→legacy, mem_ruflo→Queen, 3 конфликта) вместе с их `EDGE_DETAILS`.

**Добавляются 16 рёбер:**

| # | Ребро | label | примечание |
|---|---|---|---|
| 1 | `ruflo_queen` → `ruflo_workers` | `координирует\n(0 задач)` | внутри hive-mind |
| 2 | `ruflo_queen` → `ruflo_agents_catalog` | `ruflo init высыпал\n(не задействовано)` | артефакт установки |
| 3 | `ruflo_queen` → `ruflo_commands` | `ruflo init высыпал\n(не задействовано)` | артефакт установки |
| 4 | `ruflo_queen` → `ruflo_plugins` | `плагинов ruflo:\n0 установлено` | артефакт установки |
| 5 | `ruflo_mcp` → `ruflo_memory` | `читает/пишет\nпамять` | инструменты `memory_*` |
| 6 | `ruflo_recall_hook` → `ruflo_memory` | `запускает\nruflo memory search` | реальная интеграция |
| 7 | `ruflo_daemon` → `ruflo_memory` | `воркер consolidate\nобращается к памяти` | локальный воркер демона |
| 8 | `ruflo_mcp` → `ruflo_queen` | `инструменты\nуправления роем` | MCP экспонирует `hive-mind_*`/`agent_*` — связывает две половины кластера |
| 9 | `ruflo_queen` → `pravila` | `перенял\nsub-policy` | нормативная декларация уровня −1 |
| 10 | `ruflo_queen` → `claude_md` | `перенял\nsub-policy` | нормативная декларация |
| 11 | `ruflo_queen` → `psr_v1` | `перенял\nsub-policy` | нормативная декларация |
| 12 | `ruflo_queen` → `tooling` | `перенял\nsub-policy` | нормативная декларация |
| 13 | `mem_ruflo` → `ruflo_queen` | `документирует\nинтеграцию` | по образцу `mem_archive→claude_md` |
| 14 | `CONFLICT(ruflo_queen, pravila, …, RED)` | 🔴 | см. §5.3 |
| 15 | `CONFLICT(ruflo_memory, mem_state, …, BLACK)` | ⚫ | см. §5.3 |
| 16 | `CONFLICT(ruflo_daemon, ag_pest, …, BLACK)` | ⚫ | см. §5.3 |

**Удаляются и не переносятся** 3 фиктивных делегирующих ребра (`ruflo_coder→ag_pest`, `ruflo_security→ag_rls`, `ruflo_rls→sk_rls`) — делегирование никогда не исполнялось; узлы-роли удалены.

Ребро `ruflo_queen→pravila` существует в двух формах — обычное «перенял sub-policy» (#9) и конфликт (#14): тот же приём «диагностического приоритета», что в iter2/iter4 (`EDGE_DETAILS` индексируется одним ключом `edgeKey(from,to)`, под который кладётся запись конфликта). Ребро `ruflo_mcp→ruflo_queen` (#8) связывает два иначе несвязных подграфа кластера (Queen-поддерево и memory-хаб) — честно: MCP-сервер экспонирует инструменты `hive-mind_*`/`agent_*`/`swarm_*`, наблюдающие за роем.

Итог по рёбрам: 96 − 22 + 16 = **90 рёбер** (79 обычных + 11 конфликтов).

### 5.3. Конфликты — 3 ruflo (общий счёт карты 11 — без изменений)

**8 legacy-конфликтов** (`sk_rls↔ag_rls` 🔴, `hookify_plugin↔hk_pre_claude` 🔴, `mcp_pw↔sk_parallel` ⚫, `ag_pest↔mcp_redis` ⚫, `psr_v1↔claude_md` 🟢, `upm↔fd_plugin` 🟢, `mcp_21st↔fd_plugin` 🟢, `hk_economy↔superpowers` 🟢) — без изменений.

**3 ruflo-конфликта** (было 3 в iter4 — `ruflo_queen↔pravila`, `ruflo_daemon↔mem_state`, `ruflo_daemon↔ag_pest`; станет 3 — один перенацелен):

| Пара | Тип | Описание (поле `title` ребра и `desc` в `NODE_DETAILS`) |
|---|---|---|
| `ruflo_queen` ↔ `pravila` | 🔴 | «Нормативка (Pravila §0/§12, CLAUDE.md §1, PSR_v1 R0) декларирует ruflo Queen-led routing уровнем −1 — overlord над всей иерархией. Фактическая инспекция рантайма 15.05.2026: рой hive-mind — Queen + 10 generic-воркеров, 0 задач и 0 раундов консенсуса за всё время; Клод работает напрямую. Декларация ≠ рантайм, механизма enforcement нет.» (сохранён из iter4, текст освежён фактами инспекции) |
| `ruflo_memory` ↔ `mem_state` | ⚫ | «Два хранилища памяти не синхронизированы: проектные `memory/*.md` (16 файлов) и база ruflo `.swarm/memory.db`. Фактически память ruflo почти пуста — MCP-сервер репортит 0 записей (+2 тестовых призрака от alpha-бага HNSW #1122). Recall-хук срабатывает на каждый промпт, но извлекать ему почти нечего.» (перенацелен с `ruflo_daemon` на `ruflo_memory` — правильный носитель проблемы; alpha-баг H7 «memory store не персистит» исправлен в Session 4, формулировка обновлена) |
| `ruflo_daemon` ↔ `ag_pest` | ⚫ | «Фоновый демон ruflo (PM2) worker-jitter'ом усиливает частоту Pest --parallel квирка 72 (гонка в Redis). ruflo не трогает Redis :6379 — лишь timing-amplifier. На baseline-регрессии — `pm2 stop ruflo-daemon` (квирк #93).» (сохранён из iter4) |

**Сломанный демон** (`spawn claude ENOENT` 100% воркеров `audit`/`optimize`/`testgaps`) **не оформляется отдельным конфликт-ребром** — конфликт по семантике карты это напряжение двух сторон, а односторонняя поломка подсистемы это свойство узла. Факт поломки — громко в `label` узла («демон ruflo (воркеры падают)»), `desc` и `limits` узла `ruflo_daemon`.

**3-color баланс после:** 🔴3 / ⚫4 / 🟢4 = 11 конфликтов — как было. Сортировка и подсветка (rank 1/2/3) авто-подхватываются SECTION 8.

### 5.4. Содержание `NODE_DETAILS` — 9 узлов ruflo + `mem_ruflo` (пишутся заново)

Стиль — по Style Guide v2 карты: простой русский, без узловых id (`ruflo_*`/`ag_*`) в тексте — «(узел X)»/«(агент Y)»; аббревиатуры в скобках с расшифровкой; английские тех-термины переведены или с пояснением; фазы раскрыты. 7 полей `nd(desc, when, limits, reportsTo, manages, together, conflicts)`.

**`ruflo_queen`**

- desc: «Queen оркестратора ruflo v3.7.0-alpha.38 — стратегическая „королева“ роя hive-mind (топология hierarchical-mesh, консенсус byzantine). По нормативке (CLAUDE.md §1) — entry-point уровня −1 для всех задач Клода.»
- when: «По нормативке — первичная классификация любой задачи и маршрутизация. Фактически рой ни разу не запускался на реальную задачу — Клод работает напрямую.»
- limits: «Фактическая инспекция рантайма 15.05.2026: Queen активна (term 1, нагрузка 0), но за всё время — 0 задач, 0 раундов консенсуса, 0 общей памяти. ruflo НЕ перехватывает рабочий процесс Claude Code. „Queen-led routing уровня −1“ — нормативная декларация, не рантайм. Alpha-версия, LLM API-ключей нет.»
- reportsTo: `[]` (по нормативке — верх иерархии)
- manages: `10 воркеров hive-mind` — «координирует рой — все 10 простаивают»; `каталог агентов ruflo` — «ruflo init высыпал в .claude/agents/ — не задействовано»; `slash-команды ruflo` — «ruflo init высыпал в .claude/commands/ — не задействовано»; `плагины ruflo` — «установлено 0 из ~20 в реестре»
- together: `memory: project_ruflo_integration` — «memory-файл документирует интеграцию»; `ruflo MCP` — «MCP-сервер экспонирует инструменты управления роем»
- conflicts: 🔴 с `Pravila` (текст — §5.3)

**`ruflo_workers`**

- desc: «Рабочие агенты роя hive-mind ruflo — 10 штук. Все одного типа (generic worker), без специализации. На карте до iter5 рисовались 9 „ролей“ (Архитектор/Кодер/…) — таких ролей в рантайме не существует.»
- when: «По задумке — Queen раздаёт воркерам подзадачи. Фактически — ни разу.»
- limits: «Инспекция рантайма 15.05.2026: 10 воркеров, все в статусе „простаивает“ (idle), у каждого 0 выполненных задач. LLM API-ключей нет → реальная агентская работа невозможна. Последний рой запущен с тестовой задачей „ответь словом READY и ничего не меняй“.»
- reportsTo: `ruflo Queen` — «подчинены — Queen-led иерархия hive-mind»
- manages: `[]`; together: `[]`; conflicts: `[]`

**`ruflo_daemon`**

- desc: «Фоновый демон ruflo под управлением PM2 (процесс `ruflo-daemon`). По расписанию запускает 5 воркеров: map (каждые 15 мин), audit (10 мин), optimize (15 мин), consolidate (30 мин), testgaps (20 мин). Переживает перезагрузку через планировщик задач Windows.»
- when: «Работает постоянно в фоне.»
- limits: «Инспекция рантайма 15.05.2026: воркеры audit / optimize / testgaps пытаются запустить `claude` и КАЖДЫЙ РАЗ падают с ошибкой „файл не найден“ (spawn claude ENOENT) — результат пустой (за сутки: audit 29 запусков, optimize 19, testgaps 14 — все пустые). Журнал демона при этом помечает их „успешными“ — расхождение метрики и факта. Локально работают только воркеры map и consolidate (без вызова `claude`). Worker-jitter усиливает частоту Pest-квирка 72 — на baseline-регрессии нужно `pm2 stop ruflo-daemon`.»
- reportsTo: `[]` (отдельный процесс PM2, не под Queen)
- manages: `[]`
- together: `память ruflo` — «воркер consolidate обращается к хранилищу»
- conflicts: ⚫ с `агент pest-parallel-debugger` (текст — §5.3)

**`ruflo_mcp`**

- desc: «MCP-сервер ruflo (внешний сервис-инструмент Клода) — отдельный процесс `ruflo mcp start`, режим stdio, 7-й сервер в `.mcp.json`. Экспонирует ~210 инструментов (агенты / память / рой / хуки / нейросеть и др.).»
- when: «Инструменты доступны Клоду постоянно. Это единственная по-настоящему рабочая точка интеграции ruflo — через неё и собрана фактическая инспекция 15.05.2026.»
- limits: «Клод НЕ обязан вызывать ruflo-инструменты — отсюда статус ruflo как параллельной подсистемы, а не overlord. Память, опрашиваемая через MCP, почти пуста (0 записей). Alpha-версия.»
- reportsTo: `[]` (отдельный процесс, не под Queen)
- manages: `[]`
- together: `ruflo Queen` — «экспонирует инструменты управления роем»; `память ruflo` — «читает/пишет через инструменты memory_*»
- conflicts: `[]`

**`ruflo_memory`**

- desc: «Хранилище памяти ruflo — файл базы `.swarm/memory.db` (SQLite через sql.js) + векторный индекс HNSW с реальными embeddings Xenova/all-MiniLM-L6-v2 (384 измерения).»
- when: «Должно накапливать факты между сессиями; recall-хук и MCP-инструменты обращаются к нему.»
- limits: «Инспекция рантайма 15.05.2026: MCP-сервер репортит 0 записей. В базе — 2 тестовых „призрака“ (h7-fixed-verify, hook-e2e) от alpha-бага HNSW #1122 (`memory delete` убирает строку, но не вектор). Проектные `memory/*.md` (16 файлов) в неё не проиндексированы. Наполняется только вручную через `ruflo memory store`.»
- reportsTo: `[]`
- manages: `[]`
- together: `ruflo MCP` — «MCP читает/пишет через инструменты memory_*»; `хук recall` — «recall-хук запускает поиск по памяти»; `демон ruflo` — «воркер consolidate обращается к памяти»
- conflicts: ⚫ с `memory: project_state` (текст — §5.3)

**`ruflo_recall_hook`**

- desc: «Хук типа UserPromptSubmit, зарегистрирован в `.claude/settings.json` — скрипт `tools/ruflo-recall-hook.mjs`. На каждый промпт пользователя запускает `ruflo memory search` и подмешивает топ-3 найденных записи в контекст. Единственный хук ruflo, реально вшитый в сессию Claude Code.»
- when: «Перед каждым промптом пользователя.»
- limits: «Срабатывает «мягко» (fail-open): при ошибке/таймауте — пустой инжект, промпт не блокируется. Хук работает (виден в системных напоминаниях этой сессии), но память ruflo почти пуста — извлекать почти нечего (recall возвращает 2 тестовых призрака). У самого ruflo есть 26-27 внутренних хуков, но в `.claude/settings.json` вшит только этот один.»
- reportsTo: `[]`
- manages: `[]`
- together: `память ruflo` — «запускает поиск по памяти ruflo»
- conflicts: `[]`

**`ruflo_agents_catalog`**

- desc: «Каталог определений агентов, который `ruflo init` высыпал в `.claude/agents/` — 100 файлов в 23 категориях (core, consensus, sparc, github, v3, flow-nexus, optimization, sublinear, templates и др.). Из них 98 — от ruflo, 2 — проектные (rls-reviewer, pest-parallel-debugger).»
- when: «Определения видны Claude Code как доступные типы суб-агентов.»
- limits: «Статичные файлы-заготовки. „ruflo использует каталог“ — нет: воркеры роя безымянные generic, у демона свой набор воркеров. Каталог просто лежит.»
- reportsTo: `ruflo Queen` — «высыпан установкой ruflo init»
- manages: `[]`; together: `[]`; conflicts: `[]`

**`ruflo_commands`**

- desc: «Slash-команды, которые `ruflo init` высыпал в `.claude/commands/` — 88 файлов (категории sparc, github, hooks, analysis, automation, optimization, monitoring).»
- when: «Доступны как slash-команды Claude Code.»
- limits: «Статичные файлы. Это ближайший аналог „скилов“ у ruflo — но НЕ Claude Code скилы; в `.claude/skills/` ruflo не положил ничего (там только 2 проектных скила). Команды лежат, в работе проекта не задействуются.»
- reportsTo: `ruflo Queen` — «высыпаны установкой ruflo init»
- manages: `[]`; together: `[]`; conflicts: `[]`

**`ruflo_plugins`**

- desc: «Плагины ruflo. В IPFS-реестре оркестратора заявлено ~20 плагинов. Установлено — 0.»
- when: «Никогда — ни один плагин не подключён.»
- limits: «Фактически: папки `.claude-flow/plugins/` не существует, ни один плагин не установлен. `ruflo plugins list` зависает на IPFS-discovery (реестр недоступен — Pinata/Cloudflare не отвечают). Отдельно: Claude Code скилов ruflo не привнёс — в `.claude/skills/` только 2 проектных (rls-check, q-item-add). Прямой ответ на вопрос „какие плагины и скилы использует ruflo“: ноль и ноль.»
- reportsTo: `ruflo Queen` — «часть установки ruflo»
- manages: `[]`; together: `[]`; conflicts: `[]`

**`mem_ruflo`** (освежение, не пересоздание)

- desc: «Memory-файл `project_ruflo_integration` — история ruflo big-bang (установка, нормативная инверсия, активация рантайма) и alpha-баги.»
- when: «При работе с ruflo — для контекста интеграции и известных alpha-багов.»
- limits: «Снимок на 15.05.2026. iter5 карты опирается на фактическую инспекцию рантайма, а не только на этот файл.»
- reportsTo: `[]`; manages: `[]`
- together: `ruflo Queen` — «документирует ruflo-интеграцию»
- conflicts: `[]`

### 5.5. Содержание `EDGE_DETAILS` — 15 уникальных ключей (пишутся заново)

Удаляется 21 запись `EDGE_DETAILS` iter4. Добавляется 15 (16 рёбер; `ruflo_queen→pravila` — обычное и конфликт под одним ключом, кладётся запись конфликта). 5 полей `type / when / transfers / mandatory / rule`:

| Ключ | type | when | transfers | mandatory | rule |
|---|---|---|---|---|---|
| `ruflo_queen->ruflo_workers` | подчиняет | hive-mind активен, но рой ни разу не получал задач | контроль | опционально (рой idle) | Tooling §4.10 |
| `ruflo_queen->ruflo_agents_catalog` | артефакт | `ruflo init` высыпал каталог в `.claude/agents/` | ничего (файлы лежат) | не задействовано | артефакт установки ruflo |
| `ruflo_queen->ruflo_commands` | артефакт | `ruflo init` высыпал команды в `.claude/commands/` | ничего (файлы лежат) | не задействовано | артефакт установки ruflo |
| `ruflo_queen->ruflo_plugins` | артефакт | плагины ruflo — 0 установлено из ~20 в реестре | ничего | не задействовано | артефакт установки ruflo |
| `ruflo_mcp->ruflo_memory` | читает | MCP-инструменты `memory_*` обращаются к хранилищу | данные | опционально | Tooling §4.10 |
| `ruflo_recall_hook->ruflo_memory` | читает | recall-хук на каждый промпт запускает `ruflo memory search` | данные | «мягко» (fail-open) | `.claude/settings.json` (UserPromptSubmit) |
| `ruflo_daemon->ruflo_memory` | читает | воркер consolidate демона обращается к памяти | данные | опционально | `.claude-flow` daemon |
| `ruflo_mcp->ruflo_queen` | экспонирует | MCP-сервер отдаёт инструменты `hive-mind_*`/`agent_*`/`swarm_*` | инструменты | опционально | Tooling §4.10 |
| `ruflo_queen->pravila` | конфликт | нормативка декларирует уровень −1, фактически parallel subsystem | контроль | декларативно | нет регламента enforcement (Pravila §0/§12, CLAUDE.md §1, PSR_v1 R0) |
| `ruflo_queen->claude_md` | перенял sub-policy | нормативная декларация уровня −1 (entry-point) | контроль (декларативно) | декларативно — без enforcement | CLAUDE.md §1 priority chain (уровень −1) |
| `ruflo_queen->psr_v1` | перенял sub-policy | нормативная декларация уровня −1 | контроль (декларативно) | декларативно — без enforcement | PSR_v1 R0 (sub-policy delegation pattern) |
| `ruflo_queen->tooling` | перенял sub-policy | нормативная декларация уровня −1 | контроль (декларативно) | декларативно — без enforcement | Tooling §4.10 (orchestration layer) |
| `mem_ruflo->ruflo_queen` | документирует | memory-файл хранит историю ruflo-интеграции | данные | рекомендуется | `memory/project_ruflo_integration.md` |
| `ruflo_memory->mem_state` | конфликт | два хранилища памяти не синхронизированы; память ruflo почти пуста | coverage | опционально | нет регламента синхронизации (alpha-баг HNSW #1122) |
| `ruflo_daemon->ag_pest` | конфликт | daemon worker-jitter усиливает частоту Pest-квирка 72 | coverage | опционально | memory feedback_environment квирк #93 |

### 5.6. Точечные правки legacy-узлов — двустороннее отображение конфликтов (3 узла)

Конфликты на карте отображаются двусторонне: оба узла-эндпоинта перечисляют конфликт в своём `NODE_DETAILS.conflicts` (так у всех 8 legacy-конфликтов). iter4 для ruflo-конфликтов это нарушил — конфликты `daemon↔mem_state` и `daemon↔ag_pest` были записаны только на стороне `ruflo_daemon`. iter5 исправляет:

| Узел | Правка |
|---|---|
| `pravila` | В `conflicts` (запись про `ruflo Queen`) — освежить `desc` фактами инспекции (10 idle-воркеров, 0 задач). Это та же запись, что добавлена iter4 — только текст. |
| `mem_state` | Вызов `nd()` сейчас 6-аргументный (без `conflicts`). Добавить 7-й аргумент `conflicts: [{ name: 'память ruflo', desc: '<текст §5.3>', type: 'BLACK' }]`. |
| `ag_pest` | В существующий массив `conflicts` (там 1 запись — про `MCP-сервер redis`) добавить 2-ю: `{ name: 'демон ruflo', desc: '<текст §5.3>', type: 'BLACK' }`. |

Других правок legacy-узлов нет.

### 5.7. Правки комментариев-счётчиков

- `SECTION 1: NODES`, комментарий-заголовок блока ruflo: `// ── RUFLO ОРКЕСТРАТОР (11) — кластер …` → `(9)`; текст комментария при необходимости освежить.
- `SECTION 2: EDGES`, комментарий-заголовок блока ruflo (`// RUFLO ОРКЕСТРАТОР — наслой ruflo big-bang …`) — переписать под iter5 (фактический реколлаж).
- `SECTION 3.5: EDGE DETAILS`, комментарий-заголовок блока ruflo — аналогично.
- Прочие комментарии-счётчики (`АГЕНТЫ (11)`, `MCP-СЕРВЕРЫ (7)`, `MEMORY FILES (15)` и др.) — не меняются (эти группы не затронуты; `MEMORY FILES` остаётся 15 + `mem_ruflo` отдельной строкой-комментарием `MEMORY +1`).

## 6. Что НЕ трогаем (границы scope)

- **SECTION 4–8** карты (vis-init, легенда-панель, тулбар, resize-handle, highlighting). Подсветка (SECTION 8) авто-выводит индексы `NEIGHBOURS`/`CONFLICT_ENDPOINTS` из `edgesDS` и dashed-рёбер по цвету; фильтр `group:ruflo` авто-работает через `data-filter-key`. Изменения не нужны.
- **Радиальный layout 73 legacy-узлов** — координаты `pos()` без изменений.
- **4 узла-правила** (`pravila`/`claude_md`/`psr_v1`/`tooling`) — iter4 уже освежил их под нормативку v1.14/v2.0/v3.0/v2.0; iter5 их НЕ трогает, кроме одной правки текста в `pravila.conflicts` (§5.6).
- **§12/sub-policy формулировки** в `superpowers`/`hk_economy`/`mem_sp` — iter4 уже освежил; iter5 не трогает.
- **Legacy-узлы** — кроме 3 точечных правок `conflicts` (§5.6: `pravila`, `mem_state`, `ag_pest`) для корректного двустороннего отображения конфликтов. Других правок legacy нет.
- **Сам рантайм ruflo** — iter5 фиксирует факт поломки демона/простоя роя НА КАРТЕ; демон не чинится, LLM-ключи не добавляются. Починка — отдельная задача при желании заказчика.
- **Нормативка** (CLAUDE.md / Pravila / PSR_v1 / Tooling) — не трогаем: карта — doc-артефакт, не входит в priority chain.
- **iter4-бэклог** (`project_automation_map.md`: мёртвая переменная `highlightedNode`, foot-gun `state.selectedNode !== null`, rAF-throttle) — вне scope.

## 7. Затрагиваемые файлы

| Файл | Действие |
|---|---|
| `docs/automation-graph.html` | Правка: −7 узлов, +5 узлов, −22 ребра, +16 рёбер, переписаны 4 + написаны 5 `NODE_DETAILS` ruflo + освежён `mem_ruflo`, удалён 21 + добавлено 15 `EDGE_DETAILS`, 3 точечных правки `conflicts` legacy-узлов (`pravila`/`mem_state`/`ag_pest`), правки комментариев-счётчиков. |
| `docs/superpowers/specs/2026-05-15-automation-graph-iter5-ruflo-factual-design.md` | Этот документ. |
| `docs/superpowers/plans/2026-05-15-automation-graph-iter5-ruflo-factual.md` | План реализации (создаётся через writing-plans). |
| `cspell-words.txt` | При необходимости — новые валидные слова (например «реколлаж»), если cspell заблокирует коммит spec/plan. |
| `memory/project_automation_map.md` | После завершения — освежить (iter5, фактический реколлаж, метрики 83/90/11). |
| `memory/project_ruflo_integration.md` | После завершения — добавить ноту про iter5 (карта приведена к фактическому состоянию). |

## 8. Верификация

- **Визуальный smoke через Playwright MCP** — открыть обновлённую карту локально (`python -m http.server`, т.к. Playwright отвергает `file://` — квирк #90), проверить: (а) 83 узла рендерятся, ruflo-кластер виден в верхнем-левом углу 9 оранжевыми узлами + `mem_ruflo` серым рядом; (б) клик по каждому из 9 ruflo-узлов открывает заполненную панель легенды (7 секций, без «—» в обязательных полях); (в) клик по 16 ruflo-рёбрам открывает edge-легенду (5 полей, не «Регламент не задокументирован»); (г) фильтр `group:ruflo` в нижней легенде подсвечивает ровно 9 узлов; (д) 3 ruflo-конфликта видны (dashed-рёбра 🔴/⚫/⚫), фильтры 🔴/⚫/🟢 их подхватывают; (е) клик по `mem_state` и `ag_pest` показывает ruflo-конфликт в секции «⚡ Конфликты» (двусторонность §5.6); (ж) нет JS-ошибок в консоли; (з) нет узлов-сирот от удалённых id (`ruflo_architect`/`coder`/`security`/`rls`/`qa`/`tester`/`reviewer`) — ни в `NODES`, ни в `EDGES`, ни в `NODE_DETAILS`/`EDGE_DETAILS`.
- **Проверка отсутствия «висячих ссылок»**: каждый `from`/`to` всех рёбер существует в `NODES`; каждый ключ `EDGE_DETAILS` соответствует существующему ребру; в `NODE_DETAILS` нет записей для удалённых id.
- **Заказчик проверяет карту визуально в браузере Edge сам** перед production-use (методология iter1–iter4).
- **gitleaks** (pre-commit + pre-push), **lychee** (pre-push, на `.md` — spec/plan/memory), **cspell/markdownlint** (на `.md`) — стандартно.
- Карта — единственный HTML без сборки; Pest/Vitest/vue-tsc/Larastan не затрагиваются (карта вне `app/`).

## 9. Риски

| # | Риск | Митигация |
|---|---|---|
| 1 | Перекрытие нового кластера с legacy-узлами кольца 6 (W-сектор, `mem_state` ≈ `-955,-694`) | Координаты выбраны при `x ≤ -1110`, `y ≤ -400` — зазор ≥150 px; проверяется в smoke (п. «а»). |
| 2 | Висячая ссылка на удалённый id (`ruflo_architect` и др.) в забытом ребре/детали | Чеклист §8 «отсутствие висячих ссылок» + smoke п. «з»; план реализации удаляет узлы/рёбра/детали единым согласованным шагом. |
| 3 | `ruflo_queen→pravila` — дубль пары from/to (обычное ребро + конфликт) | Известный приём (iter2/iter4, 3 legacy-пары так же); `EDGE_DETAILS['ruflo_queen->pravila']` = запись конфликта (диагностический приоритет). План фиксирует явно. |
| 4 | Кластер распадается на два несвязных подграфа (Queen-поддерево и memory-хаб) | Ребро `ruflo_mcp→ruflo_queen` (#8) связывает половины — честная связь (MCP экспонирует инструменты управления роем). |
| 5 | `mem_state` — переход `nd()` с 6 на 7 аргументов | Сигнатура `nd()` поддерживает 7-й аргумент `conflicts` (опционален, по умолчанию `[]`); добавление безопасно. Проверяется smoke п. «е». |
| 6 | Заказчик не вычитал spec | User Review Gate перед writing-plans. |

## 10. Метрики после обновления (для memory)

| Метрика | iter4 | iter5 |
|---|---|---|
| Узлы | 85 | 83 (−7 фиктивных ролей, +5 фактических) |
| Рёбра | 96 | 90 (−22 ruflo, +16 ruflo) |
| Конфликты | 11 (🔴3 / ⚫4 / 🟢4) | 11 (🔴3 / ⚫4 / 🟢4) — без изменений |
| Группы | 10 | 10 — без изменений |
| Узлы группы `ruflo` | 11 | 9 |
| Карты в `docs/` | 1 | 1 |
