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

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Привести блок ruflo на канонической карте `docs/automation-graph.html` к фактическому состоянию рантайма (инспекция 15.05.2026): убрать 7 фиктивных swarm-ролей, добавить 5 фактических узлов (рой из 10 idle-воркеров, recall-хук, каталог агентов, slash-команды, плагины «0 из 20»), переписать 4 сохраняемых узла, заменить 22 ребра на 16 (убрать 3 фиктивных делегирующих ребра), перенацелить 1 конфликт, исправить двустороннее отображение 2 конфликтов в legacy-узлах. Метрики: 85→83 узла, 96→90 рёбер, 11 конфликтов без изменений (🔴3/⚫4/🟢4).

**Architecture:** Правка единственного self-contained HTML-файла (vis.js Network 9.1.9, Solarized Dark, без сборки). Затрагивается только блок ruflo в 4 секциях файла (`NODES`, `EDGES`, `NODE_DETAILS`, `EDGE_DETAILS`) + 3 точечных правки legacy-узлов (`pravila`, `mem_state`, `ag_pest`) ради корректного двустороннего отображения конфликтов. `GROUPS.ruflo`, `CATEGORY_LABELS.ruflo`, пункт `cat-legend` `group:ruflo` — уже есть с iter4, остаются без изменений (узлов в группе станет 9 вместо 11). SECTION 4–8 (vis-init, легенда-панель, тулбар, resize, highlighting) и радиальный layout 73 legacy-узлов НЕ трогаются — подсветка авто-выводит `NEIGHBOURS`/`CONFLICT_ENDPOINTS` из рёбер, фильтр `group:ruflo` авто-работает через `data-filter-key`. Один атомарный коммит — реколлаж кластера (файл когерентен только после всех правок секций); затем visual smoke и синхронизация memory.

**Tech Stack:** HTML5, vanilla JS, vis-network 9.1.9 (CDN). Без сборки, без unit-тестов — верификация через структурный grep-подсчёт + visual smoke (Playwright MCP, локальный `python -m http.server`).

**Спек:** `docs/superpowers/specs/2026-05-15-automation-graph-iter5-ruflo-factual-design.md` (коммит `efd588f`).

---

## Структура файла

Единственный затрагиваемый файл реализации — `docs/automation-graph.html`. Номера строк даны по HEAD `c693d03` (= коммит spec `efd588f`); при правке использовать **точное совпадение текста** (Edit по old-string), номера строк — только ориентир. Правки внутри Task 1 сдвигают нумерацию ниже по файлу — каждый шаг ниже идёт по убыванию номеров, поэтому ранние правки не ломают якоря поздних; либо перечитать секцию перед каждым Edit.

| Регион | Действие | Якорь (строки на HEAD `c693d03`) |
|---|---|---|
| SECTION 1 `NODES` — блок ruflo + `mem_ruflo` | заменить целиком | строки 245–259: комментарий `RUFLO ОРКЕСТРАТОР (11)` → узел `mem_ruflo` |
| SECTION 2 `EDGES` — блок ruflo | заменить целиком | строки 395–426: баннер-комментарий → `CONFLICT('ruflo_daemon','ag_pest',...)` |
| SECTION 3 `NODE_DETAILS` — блок ruflo | заменить целиком | строки 1114–1219: комментарий `RUFLO ОРКЕСТРАТОР` → запись `mem_ruflo` |
| SECTION 3 `NODE_DETAILS.pravila` | правка строки `conflicts` | строка 470 (внутри записи `pravila:`, строки 458–471) |
| SECTION 3 `NODE_DETAILS.mem_state` | `nd()` 6-арг → 7-арг (+`conflicts`) | строки 1033–1040 (запись `mem_state:`) |
| SECTION 3 `NODE_DETAILS.ag_pest` | +1 элемент в массив `conflicts` | строки 755–763 (запись `ag_pest:`) |
| SECTION 3.5 `EDGE_DETAILS` — блок ruflo | заменить целиком | строки 1323–1344: комментарий `RUFLO ОРКЕСТРАТОР` → запись `ruflo_daemon->ag_pest` |

**НЕ трогается:** `GROUPS.ruflo`, `CATEGORY_LABELS.ruflo`, пункт `cat-legend` `group:ruflo` (группа существует с iter4, узлов станет 9); SECTION 4–8; радиальный layout legacy-узлов; 4 узла-правила (кроме одной правки `pravila.conflicts`); §12/sub-policy формулировки в `superpowers`/`hk_economy`/`mem_sp`.

Прочие файлы: memory `project_automation_map.md` + `project_ruflo_integration.md` (синхронизация, вне git-репозитория).

---

## Task 1: Фактический реколлаж кластера ruflo

**Files:**

- Modify: `docs/automation-graph.html` (секции `NODES`, `EDGES`, `NODE_DETAILS`, `EDGE_DETAILS`)

Один логический коммит — полный реколлаж блока ruflo. Файл когерентен только после всех 5 правок секций (между шагами 1–5 в рабочей копии возможны висячие ссылки — это нормально, коммит делается после Step 5). Steps 1–5 правят файл; Steps 6–7 верифицируют; Step 8 — коммит.

- [ ] **Step 1: Заменить блок ruflo-узлов в `NODES`**

В массиве `const NODES = [ ... ]` (SECTION 1) заменить **весь блок строк 245–259** — от комментария `// ── RUFLO ОРКЕСТРАТОР (11) …` до узла `mem_ruflo` включительно.

Старый блок (удаляется):

```js
  // ── RUFLO ОРКЕСТРАТОР (11) — кластер вне радиального layout (верх-лево) ──
  { id: 'ruflo_queen',     label: 'ruflo Queen\n(Queen-led routing)', group: 'ruflo', size: 44, x: -1300, y: -700 },
  { id: 'ruflo_architect', label: 'Architect',                       group: 'ruflo', size: 24, x: -1150, y: -870 },
  { id: 'ruflo_coder',     label: 'Coder',                           group: 'ruflo', size: 24, x: -980,  y: -860 },
  { id: 'ruflo_security',  label: 'Security',                        group: 'ruflo', size: 24, x: -880,  y: -740 },
  { id: 'ruflo_rls',       label: 'RLS-reviewer',                    group: 'ruflo', size: 22, x: -880,  y: -580 },
  { id: 'ruflo_qa',        label: 'QA',                              group: 'ruflo', size: 22, x: -980,  y: -490 },
  { id: 'ruflo_tester',    label: 'Tester',                          group: 'ruflo', size: 22, x: -1150, y: -490 },
  { id: 'ruflo_reviewer',  label: 'Reviewer',                        group: 'ruflo', size: 22, x: -1300, y: -490 },
  { id: 'ruflo_memory',    label: 'Memory-keeper\n(HNSW + SONA)',     group: 'ruflo', size: 24, x: -1470, y: -580 },
  { id: 'ruflo_daemon',    label: 'Daemon-worker\n(PM2, 5 задач)',    group: 'ruflo', size: 22, x: -1470, y: -740 },
  { id: 'ruflo_mcp',       label: 'ruflo MCP\n(~210 инструментов)',   group: 'ruflo', size: 24, x: -1100, y: -340 },

  // ── MEMORY +1 (артефакт ruflo big-bang) ──
  { id: 'mem_ruflo',       label: 'memory:\nproject_ruflo_integration', group: 'memory', size: 14, x: -1700, y: -470 },
```

Новый блок (вставляется на его место):

```js
  // ── RUFLO ОРКЕСТРАТОР (9) — фактический реколлаж iter5 — кластер вне радиального layout (верх-лево) ──
  { id: 'ruflo_queen',          label: 'ruflo Queen\n(hive-mind)',                 group: 'ruflo', size: 44, x: -1340, y: -700 },
  { id: 'ruflo_plugins',        label: 'плагины ruflo\n0 из 20 · скилов 0',        group: 'ruflo', size: 20, x: -1340, y: -880 },
  { id: 'ruflo_workers',        label: '10 воркеров\nhive-mind (idle)',            group: 'ruflo', size: 26, x: -1160, y: -800 },
  { id: 'ruflo_agents_catalog', label: 'каталог агентов ruflo\n(100 определений)', group: 'ruflo', size: 24, x: -1530, y: -830 },
  { id: 'ruflo_commands',       label: 'slash-команды\nruflo (88)',                group: 'ruflo', size: 22, x: -1140, y: -630 },
  { id: 'ruflo_daemon',         label: 'демон ruflo\n(воркеры падают)',            group: 'ruflo', size: 24, x: -1560, y: -650 },
  { id: 'ruflo_memory',         label: 'память ruflo\n(~0 записей)',               group: 'ruflo', size: 24, x: -1380, y: -500 },
  { id: 'ruflo_mcp',            label: 'ruflo MCP\n(~210 инструментов)',           group: 'ruflo', size: 26, x: -1190, y: -460 },
  { id: 'ruflo_recall_hook',    label: 'хук recall\n(UserPromptSubmit)',           group: 'ruflo', size: 22, x: -1570, y: -470 },

  // ── MEMORY +1 (артефакт ruflo big-bang) ──
  { id: 'mem_ruflo',            label: 'memory:\nproject_ruflo_integration',       group: 'memory', size: 14, x: -1740, y: -620 },
```

NB: удаляются id `ruflo_architect`, `ruflo_coder`, `ruflo_security`, `ruflo_rls`, `ruflo_qa`, `ruflo_tester`, `ruflo_reviewer`. id `ruflo_memory` переиспользуется (был «Memory-keeper агент» → станет «хранилище памяти ruflo»). `ruflo_recall_hook` сознательно в группе `ruflo` (не `hooks`) — ради цельности кластера (спек §5.1). Координаты — финальная подгонка по visual smoke (Step 7).

- [ ] **Step 2: Заменить блок ruflo-рёбер в `EDGES`**

В массиве `const EDGES = [ ... ]` (SECTION 2) заменить **весь блок строк 395–426** — от баннер-комментария `// ════…  RUFLO ОРКЕСТРАТОР — наслой ruflo big-bang …` до `CONFLICT('ruflo_daemon', 'ag_pest', …)` включительно.

Старый блок (удаляется) — баннер-комментарий + 22 ребра (9 `Queen→роль`, `Queen→mcp`, 4 `Queen→правило`, 4 `swarm→legacy`, `mem_ruflo→Queen`, 3 конфликта). Новый блок (вставляется на его место):

```js
  // ══════════════════════════════════════════════════
  // RUFLO ОРКЕСТРАТОР — фактический реколлаж (iter5, 2026-05-15)
  // ══════════════════════════════════════════════════
  // Queen → артефакты установки ruflo init (рой idle, артефакты не задействованы)
  E('ruflo_queen', 'ruflo_workers',        'координирует\n(0 задач)'),
  E('ruflo_queen', 'ruflo_agents_catalog', 'ruflo init высыпал\n(не задействовано)'),
  E('ruflo_queen', 'ruflo_commands',       'ruflo init высыпал\n(не задействовано)'),
  E('ruflo_queen', 'ruflo_plugins',        'плагинов ruflo:\n0 установлено'),
  // MCP-сервер ruflo — связывает половины кластера + читает/пишет память
  E('ruflo_mcp',   'ruflo_queen',          'инструменты\nуправления роем'),
  E('ruflo_mcp',   'ruflo_memory',         'читает/пишет\nпамять'),
  // память ruflo — recall-хук и воркер consolidate демона
  E('ruflo_recall_hook', 'ruflo_memory',   'запускает\nruflo memory search'),
  E('ruflo_daemon',      'ruflo_memory',   'воркер consolidate\nобращается к памяти'),
  // Queen → 4 узла-правила (нормативная декларация уровня −1)
  E('ruflo_queen', 'pravila',   'перенял\nsub-policy'),
  E('ruflo_queen', 'claude_md', 'перенял\nsub-policy'),
  E('ruflo_queen', 'psr_v1',    'перенял\nsub-policy'),
  E('ruflo_queen', 'tooling',   'перенял\nsub-policy'),
  // memory → ruflo
  E('mem_ruflo',   'ruflo_queen', 'документирует\nинтеграцию'),

  // 3 конфликта ruflo (3-color, iter2 §4)
  CONFLICT('ruflo_queen',  'pravila',   'Нормативка декларирует ruflo уровнем −1 (overlord) — фактически параллельная подсистема: рой из 10 idle-воркеров, 0 задач', 'RED'),
  CONFLICT('ruflo_memory', 'mem_state', 'Два хранилища памяти не синхронизированы; память ruflo почти пуста (0 записей)', 'BLACK'),
  CONFLICT('ruflo_daemon', 'ag_pest',   'Daemon worker-jitter усиливает частоту Pest квирка 72', 'BLACK'),
```

Итого 16 рёбер: 13 обычных (`E`) + 3 конфликта (`CONFLICT`). NB: ребро `E('ruflo_queen','pravila',…)` И `CONFLICT('ruflo_queen','pravila',…)` — два ребра с одной парой from/to (vis.js рисует параллельные рёбра); `EDGE_DETAILS['ruflo_queen->pravila']` — одна запись типа «конфликт» (diagnostic-priority, как 3 legacy-пары normal+conflict). Удалены и НЕ переносятся 3 фиктивных делегирующих ребра (`ruflo_coder→ag_pest`, `ruflo_security→ag_rls`, `ruflo_rls→sk_rls`).

- [ ] **Step 3: Заменить блок ruflo-записей в `NODE_DETAILS`**

В объекте `const NODE_DETAILS = { ... }` (SECTION 3) заменить **весь блок строк 1114–1219** — от комментария `// ── RUFLO ОРКЕСТРАТОР ───…` до записи `mem_ruflo: nd( … ),` включительно.

Старый блок (удаляется) — комментарий + 12 записей iter4 (`ruflo_queen` … `ruflo_mcp` + `mem_ruflo`). Новый блок (вставляется на его место) — комментарий + 9 ruflo-записей + `mem_ruflo`:

```js
  // ── RUFLO ОРКЕСТРАТОР (фактический реколлаж iter5) ──
  ruflo_queen: nd(
    'Queen оркестратора ruflo v3.7.0-alpha.38 — стратегическая «королева» роя hive-mind (топология hierarchical-mesh, консенсус byzantine). По нормативке (CLAUDE.md §1) — entry-point уровня −1 для всех задач Клода.',
    'По нормативке — первичная классификация любой задачи и маршрутизация. Фактически рой ни разу не запускался на реальную задачу — Клод работает напрямую.',
    'Фактическая инспекция рантайма 15.05.2026: Queen активна (term 1, нагрузка 0), но за всё время — 0 задач, 0 раундов консенсуса, 0 общей памяти. ruflo НЕ перехватывает рабочий процесс Claude Code. «Queen-led routing уровня −1» — нормативная декларация, не рантайм. Alpha-версия, LLM API-ключей нет.',
    [],
    [
      { name: '10 воркеров hive-mind', cond: 'координирует рой — все 10 простаивают' },
      { name: 'каталог агентов ruflo', cond: 'ruflo init высыпал в .claude/agents/ — не задействовано' },
      { name: 'slash-команды ruflo', cond: 'ruflo init высыпал в .claude/commands/ — не задействовано' },
      { name: 'плагины ruflo', cond: 'установлено 0 из ~20 в реестре' }
    ],
    [
      { name: 'memory:project_ruflo_integration', cond: 'memory-файл документирует интеграцию' },
      { name: 'ruflo MCP', cond: 'MCP-сервер экспонирует инструменты управления роем' }
    ],
    [{ name: 'Pravila', desc: 'Нормативка (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 нет.', type: 'RED' }]
  ),
  ruflo_workers: nd(
    'Рабочие агенты роя hive-mind ruflo — 10 штук. Все одного типа (generic worker), без специализации. На карте до iter5 рисовались 9 «ролей» (Архитектор/Кодер/…) — таких ролей в рантайме не существует.',
    'По задумке — Queen раздаёт воркерам подзадачи. Фактически — ни разу.',
    'Инспекция рантайма 15.05.2026: 10 воркеров, все в статусе «простаивает» (idle), у каждого 0 выполненных задач. LLM API-ключей нет → реальная агентская работа невозможна. Последний рой запущен с тестовой задачей «ответь словом READY и ничего не меняй».',
    [{ name: 'ruflo Queen', cond: 'подчинены — Queen-led иерархия hive-mind' }],
    [],
    []
  ),
  ruflo_daemon: nd(
    'Фоновый демон ruflo под управлением PM2 (процесс `ruflo-daemon`). По расписанию запускает 5 воркеров: map (каждые 15 мин), audit (10 мин), optimize (15 мин), consolidate (30 мин), testgaps (20 мин). Переживает перезагрузку через планировщик задач Windows.',
    'Работает постоянно в фоне.',
    'Инспекция рантайма 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`.',
    [],
    [],
    [{ name: 'память ruflo', cond: 'воркер consolidate обращается к хранилищу' }],
    [{ name: 'агент pest-parallel-debugger', desc: 'Фоновый демон ruflo (PM2) worker-jitter усиливает частоту Pest --parallel квирка 72 (гонка в Redis). ruflo не трогает Redis :6379 — лишь timing-amplifier. На baseline-регрессии — `pm2 stop ruflo-daemon` (квирк #93).', type: 'BLACK' }]
  ),
  ruflo_mcp: nd(
    'MCP-сервер ruflo (внешний сервис-инструмент Клода) — отдельный процесс `ruflo mcp start`, режим stdio, 7-й сервер в `.mcp.json`. Экспонирует ~210 инструментов (агенты / память / рой / хуки / нейросеть и др.).',
    'Инструменты доступны Клоду постоянно. Это единственная по-настоящему рабочая точка интеграции ruflo — через неё и собрана фактическая инспекция 15.05.2026.',
    'Клод НЕ обязан вызывать ruflo-инструменты — отсюда статус ruflo как параллельной подсистемы, а не overlord. Память, опрашиваемая через MCP, почти пуста (0 записей). Alpha-версия.',
    [],
    [],
    [
      { name: 'ruflo Queen', cond: 'экспонирует инструменты управления роем' },
      { name: 'память ruflo', cond: 'читает/пишет через инструменты memory_*' }
    ]
  ),
  ruflo_memory: nd(
    'Хранилище памяти ruflo — файл базы `.swarm/memory.db` (SQLite через sql.js) + векторный индекс HNSW с реальными embeddings Xenova/all-MiniLM-L6-v2 (384 измерения).',
    'Должно накапливать факты между сессиями; recall-хук и MCP-инструменты обращаются к нему.',
    'Инспекция рантайма 15.05.2026: MCP-сервер репортит 0 записей. В базе — 2 тестовых «призрака» (h7-fixed-verify, hook-e2e) от alpha-бага HNSW #1122 (`memory delete` убирает строку, но не вектор). Проектные `memory/*.md` (16 файлов) в неё не проиндексированы. Наполняется только вручную через `ruflo memory store`.',
    [],
    [],
    [
      { name: 'ruflo MCP', cond: 'MCP читает/пишет через инструменты memory_*' },
      { name: 'хук recall', cond: 'recall-хук запускает поиск по памяти' },
      { name: 'демон ruflo', cond: 'воркер consolidate обращается к памяти' }
    ],
    [{ name: 'memory:project_state', desc: 'Два хранилища памяти не синхронизированы: проектные `memory/*.md` (16 файлов) и база ruflo `.swarm/memory.db`. Фактически память ruflo почти пуста — MCP-сервер репортит 0 записей (+2 тестовых призрака от alpha-бага HNSW #1122). Recall-хук срабатывает на каждый промпт, но извлекать ему почти нечего.', type: 'BLACK' }]
  ),
  ruflo_recall_hook: nd(
    'Хук типа UserPromptSubmit, зарегистрирован в `.claude/settings.json` — скрипт `tools/ruflo-recall-hook.mjs`. На каждый промпт пользователя запускает `ruflo memory search` и подмешивает топ-3 найденных записи в контекст. Единственный хук ruflo, реально вшитый в сессию Claude Code.',
    'Перед каждым промптом пользователя.',
    'Срабатывает «мягко» (fail-open): при ошибке/таймауте — пустой инжект, промпт не блокируется. Хук работает (виден в системных напоминаниях этой сессии), но память ruflo почти пуста — извлекать почти нечего (recall возвращает 2 тестовых призрака). У самого ruflo есть 26-27 внутренних хуков, но в `.claude/settings.json` вшит только этот один.',
    [],
    [],
    [{ name: 'память ruflo', cond: 'запускает поиск по памяти ruflo' }]
  ),
  ruflo_agents_catalog: nd(
    'Каталог определений агентов, который `ruflo init` высыпал в `.claude/agents/` — 100 файлов в 23 категориях (core, consensus, sparc, github, v3, flow-nexus, optimization, sublinear, templates и др.). Из них 98 — от ruflo, 2 — проектные (rls-reviewer, pest-parallel-debugger).',
    'Определения видны Claude Code как доступные типы суб-агентов.',
    'Статичные файлы-заготовки. «ruflo использует каталог» — нет: воркеры роя безымянные generic, у демона свой набор воркеров. Каталог просто лежит.',
    [{ name: 'ruflo Queen', cond: 'высыпан установкой ruflo init' }],
    [],
    []
  ),
  ruflo_commands: nd(
    'Slash-команды, которые `ruflo init` высыпал в `.claude/commands/` — 88 файлов (категории sparc, github, hooks, analysis, automation, optimization, monitoring).',
    'Доступны как slash-команды Claude Code.',
    'Статичные файлы. Это ближайший аналог «скилов» у ruflo — но НЕ Claude Code скилы; в `.claude/skills/` ruflo не положил ничего (там только 2 проектных скила). Команды лежат, в работе проекта не задействуются.',
    [{ name: 'ruflo Queen', cond: 'высыпаны установкой ruflo init' }],
    [],
    []
  ),
  ruflo_plugins: nd(
    'Плагины ruflo. В IPFS-реестре оркестратора заявлено ~20 плагинов. Установлено — 0.',
    'Никогда — ни один плагин не подключён.',
    'Фактически: папки `.claude-flow/plugins/` не существует, ни один плагин не установлен. `ruflo plugins list` зависает на IPFS-discovery (реестр недоступен — Pinata/Cloudflare не отвечают). Отдельно: Claude Code скилов ruflo не привнёс — в `.claude/skills/` только 2 проектных (rls-check, q-item-add). Прямой ответ на вопрос «какие плагины и скилы использует ruflo»: ноль и ноль.',
    [{ name: 'ruflo Queen', cond: 'часть установки ruflo' }],
    [],
    []
  ),
  mem_ruflo: nd(
    'Memory-файл `project_ruflo_integration` — история ruflo big-bang (установка, нормативная инверсия, активация рантайма) и alpha-баги.',
    'При работе с ruflo — для контекста интеграции и известных alpha-багов.',
    'Снимок на 15.05.2026. iter5 карты опирается на фактическую инспекцию рантайма, а не только на этот файл.',
    [],
    [],
    [{ name: 'ruflo Queen', cond: 'документирует ruflo-интеграцию' }]
  ),
```

NB: записи `ruflo_workers`, `ruflo_mcp`, `ruflo_recall_hook`, `ruflo_agents_catalog`, `ruflo_commands`, `ruflo_plugins`, `mem_ruflo` — 6 аргументов `nd()` (без `conflicts`, `nd` подставит `[]`); `ruflo_queen`, `ruflo_daemon`, `ruflo_memory` — 7 аргументов (с `conflicts`). Сигнатура `nd(desc, when, limits, reportsTo, manages, together, conflicts)`.

- [ ] **Step 4: Заменить блок ruflo-записей в `EDGE_DETAILS`**

В объекте `const EDGE_DETAILS = { ... }` (SECTION 3.5) заменить **весь блок строк 1323–1344** — от комментария `// ── RUFLO ОРКЕСТРАТОР (наслой ruflo big-bang 2026-05-15) ──` до записи `'ruflo_daemon->ag_pest': { … },` включительно.

Старый блок (удаляется) — комментарий + 21 запись iter4. Новый блок (вставляется на его место) — комментарий + 15 записей:

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

NB: 15 записей под 16 рёбер — `ruflo_queen->pravila` (обычное + конфликт) индексируется одним ключом, кладётся запись конфликта (diagnostic-priority). Ключи `EDGE_DETAILS` строятся `edgeKey(from,to) = from + '->' + to` — каждый ключ выше соответствует ребру из Step 2.

- [ ] **Step 5: Точечные правки legacy-узлов — двустороннее отображение конфликтов**

Три правки в `NODE_DETAILS` (SECTION 3), чтобы оба эндпоинта каждого ruflo-конфликта перечисляли его в своём `conflicts` (так у всех 8 legacy-конфликтов; iter4 для ruflo это нарушил).

**5a. `pravila` — освежить текст `conflicts`.** В записи `pravila: nd( … )` (строки 458–471) заменить **последнюю строку** (7-й аргумент `conflicts`):

Было:

```js
    [{ name: 'ruflo Queen', desc: 'Нормативка декларирует ruflo Queen-led routing уровнем −1 над Pravila — overlord. Фактически ruflo — параллельная подсистема, Claude работает напрямую; механизма enforcement нет (декларация ≠ runtime).', type: 'RED' }]
```

Стало:

```js
    [{ name: 'ruflo Queen', desc: 'Нормативка (Pravila §0/§12, CLAUDE.md §1, PSR_v1 R0) декларирует ruflo Queen-led routing уровнем −1 над Pravila — overlord. Фактическая инспекция рантайма 15.05.2026: рой hive-mind — Queen + 10 generic-воркеров, 0 задач и 0 раундов консенсуса за всё время; Клод работает напрямую. Декларация ≠ рантайм, механизма enforcement нет.', type: 'RED' }]
```

**5b. `mem_state` — `nd()` 6-арг → 7-арг.** Заменить запись `mem_state: nd( … ),` (строки 1033–1040) целиком:

Было:

```js
  mem_state: nd(
    'Текущее состояние проекта: ветка, тесты (Pest/Vitest), последние коммиты, активные задачи.',
    'Читается при старте сессии — для быстрого контекста; обновляется после крупных вех.',
    'Может устаревать — перечитать при сомнении. Не доверять данным старше 2-3 дней без проверки.',
    [],
    [],
    [{ name: 'SessionStart хук', cond: 'читается при старте для быстрого контекста' }]
  ),
```

Стало:

```js
  mem_state: nd(
    'Текущее состояние проекта: ветка, тесты (Pest/Vitest), последние коммиты, активные задачи.',
    'Читается при старте сессии — для быстрого контекста; обновляется после крупных вех.',
    'Может устаревать — перечитать при сомнении. Не доверять данным старше 2-3 дней без проверки.',
    [],
    [],
    [{ name: 'SessionStart хук', cond: 'читается при старте для быстрого контекста' }],
    [{ name: 'память ruflo', desc: 'Два хранилища памяти не синхронизированы: проектные `memory/*.md` (16 файлов) и база ruflo `.swarm/memory.db`. Фактически память ruflo почти пуста — MCP-сервер репортит 0 записей (+2 тестовых призрака от alpha-бага HNSW #1122). Recall-хук срабатывает на каждый промпт, но извлекать ему почти нечего.', type: 'BLACK' }]
  ),
```

**5c. `ag_pest` — +1 элемент в `conflicts`.** Заменить запись `ag_pest: nd( … ),` (строки 755–763) целиком:

Было:

```js
  ag_pest: nd(
    'Разбирает падения тестов Pest --parallel: отличает настоящую ошибку от одного из пяти известных квирков (72/73/77...).',
    'При падении Pest --parallel ИЛИ при дымовом тесте (быстрой проверке функциональности) только из подкаталога (как в аудите Phase 3 SyncSupplierProjectsJobTest).',
    'READ-ONLY (только чтение — только читает код, ничего не правит). Каждую гипотезу подтверждает реальным запуском, а не «похоже на квирк».',
    [{ name: 'CLAUDE.md §6', cond: 'описывает когда вызывать' }],
    [],
    [{ name: 'MCP-сервер redis', cond: 'читает Redis для отладки квирка 72 (гонка supplier:session)' }],
    [{ name: 'MCP-сервер redis', desc: 'Pest --parallel — гонка (race condition) с кэшем Redis при запуске из подкаталога (квирк 72)', type: 'BLACK' }]
  ),
```

Стало:

```js
  ag_pest: nd(
    'Разбирает падения тестов Pest --parallel: отличает настоящую ошибку от одного из пяти известных квирков (72/73/77...).',
    'При падении Pest --parallel ИЛИ при дымовом тесте (быстрой проверке функциональности) только из подкаталога (как в аудите Phase 3 SyncSupplierProjectsJobTest).',
    'READ-ONLY (только чтение — только читает код, ничего не правит). Каждую гипотезу подтверждает реальным запуском, а не «похоже на квирк».',
    [{ name: 'CLAUDE.md §6', cond: 'описывает когда вызывать' }],
    [],
    [{ name: 'MCP-сервер redis', cond: 'читает Redis для отладки квирка 72 (гонка supplier:session)' }],
    [
      { name: 'MCP-сервер redis', desc: 'Pest --parallel — гонка (race condition) с кэшем Redis при запуске из подкаталога (квирк 72)', type: 'BLACK' },
      { name: 'демон ruflo', desc: 'Фоновый демон ruflo (PM2) worker-jitter усиливает частоту Pest --parallel квирка 72 (гонка в Redis). ruflo не трогает Redis :6379 — лишь timing-amplifier. На baseline-регрессии — `pm2 stop ruflo-daemon` (квирк #93).', type: 'BLACK' }
    ]
  ),
```

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

- [ ] **Step 6: Структурная верификация**

Run:

```bash
cd "c:/моя/проекты/портал crm/Документация"
grep -c "^  { id: '" docs/automation-graph.html
grep -c "^  E('" docs/automation-graph.html
grep -c "^  CONFLICT('" docs/automation-graph.html
grep -c "^  ruflo_" docs/automation-graph.html
grep -n "ruflo_architect\|ruflo_coder\|ruflo_security\|ruflo_rls\|ruflo_qa\|ruflo_tester\|ruflo_reviewer" docs/automation-graph.html
```

Ожидается:

- `^  { id: '` → **83** (было 85: −7 ролей, +5 узлов);
- `^  E('` → **79** (было 85: −19 ruflo `E`, +13 ruflo `E`);
- `^  CONFLICT('` → **11** (8 legacy + 3 ruflo — без изменений);
- `^  ruflo_` → **9** (ключи `NODE_DETAILS`: `ruflo_queen`/`ruflo_workers`/`ruflo_daemon`/`ruflo_mcp`/`ruflo_memory`/`ruflo_recall_hook`/`ruflo_agents_catalog`/`ruflo_commands`/`ruflo_plugins`; `EDGE_DETAILS` ключи в кавычках `'ruflo_…'` не матчатся `^  ruflo_`);
- последний `grep -n` (поиск 7 удалённых id) → **пустой вывод** (0 совпадений — нет узлов-сирот ни в `NODES`, ни в `EDGES`, ни в `NODE_DETAILS`, ни в `EDGE_DETAILS`).

Если любое число не сходится или удалённый id найден — найти и исправить до коммита.

- [ ] **Step 7: Visual smoke через Playwright MCP**

Запустить локальный сервер (квирк #90 — Playwright отвергает `file://`):

```bash
cd "c:/моя/проекты/портал crm/Документация/docs" && python -m http.server 8765
```

Открыть `http://localhost:8765/automation-graph.html`, проверить по спеку §8:

- (а) **83 узла** рендерятся; ruflo-кластер виден в верхнем-левом углу — **9 оранжевых** узлов + `mem_ruflo` (серый) рядом; нет перекрытий узлов между собой и с legacy-графом;
- (б) клик по каждому из 9 ruflo-узлов открывает заполненную панель легенды (7 секций, без «—» в обязательных полях);
- (в) клик по 16 ruflo-рёбрам открывает edge-легенду (5 полей, не «Регламент не задокументирован»);
- (г) фильтр `🌊 ruflo (оркестратор)` в нижней легенде подсвечивает ровно **9 узлов**;
- (д) 3 ruflo-конфликта видны (dashed-рёбра 🔴/⚫/⚫), фильтры 🔴/⚫/🟢 их подхватывают;
- (е) клик по `mem_state` и `ag_pest` показывает ruflo-конфликт в секции «⚡ Конфликты» (двусторонность Step 5);
- (ж) консоль браузера — **0 ошибок** (это же и проверка JS-синтаксиса: ошибка → пустой граф / красная консоль);
- (з) **нет узлов-сирот** от удалённых id (`ruflo_architect`/`coder`/`security`/`rls`/`qa`/`tester`/`reviewer`).

Остановить сервер. При перекрытии узлов кластера — скорректировать `x`/`y` в `NODES` (Step 1) и пересмотреть smoke. При flaky-клике по узким рёбрам — workaround `browser_evaluate('el.click()')` (квирк #91). Если Playwright MCP недоступен — выполнить только структурные grep-проверки (Step 6) и передать визуальную проверку заказчику (Edge); явно отметить это в отчёте.

- [ ] **Step 8: Commit**

Полный pre-commit прогон lefthook (gitleaks, markdownlint/cspell на `.md` — карта `.html`, stylelint на `.html`) проходит штатно. Коммит:

```bash
cd "c:/моя/проекты/портал crm/Документация"
git add docs/automation-graph.html
git commit -m "refactor(graph): ruflo cluster factual recollage — 9 nodes / 16 edges (iter5)

iter4 нарисовал блок ruflo как Queen-led рой из 9 специализированных
ролей — декларация, не рантайм. iter5 приводит блок к фактической
инспекции рантайма 15.05.2026.

- -7 фиктивных ролей (Architect/Coder/Security/RLS/QA/Tester/Reviewer)
- +5 фактических узлов (10 воркеров idle, recall-хук, каталог агентов
  100 определений, slash-команды 88, плагины 0 из 20)
- рёбра 22 -> 16: убраны 3 фиктивных делегирующих ребра
- конфликт daemon<->mem_state перенацелен на memory<->mem_state
- двустороннее отображение конфликтов: правки pravila/mem_state/ag_pest
- метрики: 85->83 узла, 96->90 рёбер, 11 конфликтов без изменений

Spec: docs/superpowers/specs/2026-05-15-automation-graph-iter5-ruflo-factual-design.md (efd588f)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
```

---

## Task 2: Синхронизация memory

**Files:**

- Modify: `project_automation_map.md` (вне git-репозитория — путь `C:\Users\Administrator\.claude\projects\c---------------------crm-------------\memory\`)
- Modify: `project_ruflo_integration.md` (там же)

Memory-файлы вне git-репозитория проекта — правки через Edit, **без коммита**. Выполнять только после успешного Task 1 (Step 8 закоммичен).

- [ ] **Step 1: Обновить `project_automation_map.md`**

Re-Read файл. Обновить секцию о текущем состоянии карты: iter4 → **iter5**; метрики **85 узлов / 96 рёбер → 83 узла / 90 рёбер**; 11 конфликтов (🔴3/⚫4/🟢4) — без изменений; 10 групп — без изменений. Описать реколлаж: блок ruflo из 11 узлов (9 фиктивных ролей) → **9 узлов** (`ruflo_queen`, `ruflo_workers`, `ruflo_daemon`, `ruflo_mcp`, `ruflo_memory`, `ruflo_recall_hook`, `ruflo_agents_catalog`, `ruflo_commands`, `ruflo_plugins`) + `mem_ruflo`; убраны 7 фиктивных ролей и 3 фиктивных делегирующих ребра; топология теперь отражает факт (0 плагинов, 0 скилов, рой idle, сломанный демон). Добавить ссылки на spec iter5 (`docs/superpowers/specs/2026-05-15-automation-graph-iter5-ruflo-factual-design.md`, коммит `efd588f`), plan iter5 (`docs/superpowers/plans/2026-05-15-automation-graph-iter5-ruflo-factual.md`) и коммит реализации Task 1. Обновить строку в `MEMORY.md` при необходимости.

- [ ] **Step 2: Обновить `project_ruflo_integration.md`**

Re-Read файл. Добавить ноту: карта `docs/automation-graph.html` приведена к фактическому состоянию рантайма (iter5, 2026-05-15) — блок ruflo на карте больше НЕ рисует фиктивный Queen-led рой из 9 ролей; отражены 0 установленных плагинов, 0 привнесённых скилов, 10 idle-воркеров, сломанный демон (`spawn claude ENOENT` на воркерах audit/optimize/testgaps), почти пустая память. Это снимок фактической инспекции рантайма для будущих сессий. Обновить строку в `MEMORY.md` при необходимости.

---

## Self-Review (выполнено при написании плана)

**Spec coverage:** §5.1 узлы (−7/+5, переименование) → Task 1 Step 1; §5.2 рёбра (22→16) → Task 1 Step 2; §5.3 конфликты (3 ruflo, перенацелен 1) → Task 1 Step 2 (`CONFLICT(…)`) + Step 3 (`conflicts` в `NODE_DETAILS`) + Step 5 (двусторонность); §5.4 `NODE_DETAILS` 9 узлов + `mem_ruflo` → Task 1 Step 3; §5.5 `EDGE_DETAILS` 15 ключей → Task 1 Step 4; §5.6 правки legacy (`pravila`/`mem_state`/`ag_pest`) → Task 1 Step 5; §5.7 комментарии-счётчики → встроены в блоки Steps 1/2/4 (`(11)`→`(9)`, баннеры переписаны); §6 границы scope → раздел «Структура файла» + «НЕ трогается»; §7 файлы → Task 1 (`automation-graph.html`) + Task 2 (memory); §8 верификация → Task 1 Steps 6–7; §10 метрики → Task 2 Step 1. Покрытие полное.

**Placeholder scan:** заглушек нет — весь JS-код приведён литералом, 3 правки legacy даны парами «Было/Стало».

**Type consistency:** `nd(desc, when, limits, reportsTo, manages, together, conflicts)` — 7-арг сигнатура; узлы без конфликтов вызываются 6 арг (`conflicts` опционален, `nd` подставляет `[]`), `ruflo_queen`/`ruflo_daemon`/`ruflo_memory` — 7 арг. `mem_state` переходит 6→7 арг (Step 5b) — безопасно (`nd` поддерживает 7-й арг). `E(from,to,label)` и `CONFLICT(from,to,label,type)` — сигнатуры SECTION 2. Ключи `EDGE_DETAILS` `'from->to'` совпадают с `edgeKey()` и с рёбрами Step 2. Узловые id (`ruflo_queen`, новые `ruflo_workers`/`ruflo_recall_hook`/`ruflo_agents_catalog`/`ruflo_commands`/`ruflo_plugins`, переиспользованный `ruflo_memory`, `ruflo_daemon`, `ruflo_mcp`, `mem_ruflo`) консистентны между `NODES`, `EDGES`, `NODE_DETAILS`, `EDGE_DETAILS`.

**Коллизия ключа `ruflo_queen->pravila`:** ребро существует дважды (`E` «перенял sub-policy» + `CONFLICT`); `EDGE_DETAILS['ruflo_queen->pravila']` — одна запись типа «конфликт» (diagnostic-priority, как 3 legacy-пары normal+conflict). Учтено в Task 1 Step 2 NB + Step 4 NB.

**Атомарность:** Task 1 — один логический change (реколлаж блока ruflo), один коммит; файл когерентен только после всех 5 правок секций — поэтому Steps 1–5 не коммитятся по отдельности. Task 2 — memory вне git, без коммита.

**Удалённые id (риск висячих ссылок):** `ruflo_architect`/`ruflo_coder`/`ruflo_security`/`ruflo_rls`/`ruflo_qa`/`ruflo_tester`/`ruflo_reviewer` — упоминаются в `NODES` (Step 1), `EDGES` (Step 2: рёбра `Queen→роль` + 3 делегирующих), `NODE_DETAILS` (Step 3), `EDGE_DETAILS` (Step 4) — все 4 блока заменяются целиком, остатков не будет. Греп-проверка Step 6 + visual smoke Step 7 (п. «з») это подтверждают.
