docs(spec): automation-graph iter5 — ruflo factual recollage design

Design spec for reworking the ruflo cluster on docs/automation-graph.html
to reflect factual runtime state (live MCP + filesystem inspection)
instead of the normative declaration: 7 fictional swarm roles removed;
real footprint added as summary nodes (100-agent catalog, 88 slash
commands, recall hook, "0 plugins / 0 skills" node); broken daemon
(spawn claude ENOENT) and idle hive (0 tasks) made explicit; fictional
delegation edges dropped. Map 85->83 nodes / 96->90 edges / 11 conflicts.

cspell-words.txt: +10 terms (Russian inflections + ENOENT).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-05-15 17:35:59 +03:00
parent 1f9b9ab788
commit efd588f661
2 changed files with 334 additions and 0 deletions
+12
View File
@@ -1225,3 +1225,15 @@ dlopen
ctx
детектит
одноаргументный
# Automation Graph iter5 — ruflo factual recollage spec (2026-05-15) — Russian inflections + ENOENT
реколлаж
руфло
хаб
воркерам
ENOENT
промптом
инжект
задействуются
двусторонне
аргументный
@@ -0,0 +1,322 @@
# Карта автоматизации — 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 48 (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 48** карты (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 (методология iter1iter4).
- **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 |