diff --git a/cspell-words.txt b/cspell-words.txt index b70c87bd..f86070f4 100644 --- a/cspell-words.txt +++ b/cspell-words.txt @@ -1225,3 +1225,15 @@ dlopen ctx детектит одноаргументный + +# Automation Graph iter5 — ruflo factual recollage spec (2026-05-15) — Russian inflections + ENOENT +реколлаж +руфло +хаб +воркерам +ENOENT +промптом +инжект +задействуются +двусторонне +аргументный diff --git a/docs/superpowers/specs/2026-05-15-automation-graph-iter5-ruflo-factual-design.md b/docs/superpowers/specs/2026-05-15-automation-graph-iter5-ruflo-factual-design.md new file mode 100644 index 00000000..38e32394 --- /dev/null +++ b/docs/superpowers/specs/2026-05-15-automation-graph-iter5-ruflo-factual-design.md @@ -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 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 |