From b8ef4a0a7ebeab7946c0448714fb5d45eb3c5b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 15 May 2026 15:24:39 +0300 Subject: [PATCH] =?UTF-8?q?docs(plan):=20automation-graph=20iter4=20?= =?UTF-8?q?=E2=80=94=20ruflo=20big-bang=20merge=20implementation=20plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 5 задач: ruflo-наслой (12 узлов / 22 ребра / 3 конфликта) → рефреш под нормативку v2.0 (4 узла-правила + §12/sub-policy) → удаление форка → visual smoke → синхронизация memory. 3 атомарных коммита реализации. cspell-words.txt +2 словоформы (тулбар/скила). Co-Authored-By: Claude Opus 4.7 (1M context) --- cspell-words.txt | 4 + ...2026-05-15-automation-graph-iter4-ruflo.md | 609 ++++++++++++++++++ 2 files changed, 613 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-15-automation-graph-iter4-ruflo.md diff --git a/cspell-words.txt b/cspell-words.txt index 18e32d7f..f6f3deab 100644 --- a/cspell-words.txt +++ b/cspell-words.txt @@ -1192,6 +1192,10 @@ poincaré нормативке рефреш +# Automation Graph iter4 — ruflo merge plan (2026-05-15) +тулбар +скила + # ruflo memory H7 fix + advisory hook design (2026-05-15) — Russian IT-slang inflections персистит персистящий diff --git a/docs/superpowers/plans/2026-05-15-automation-graph-iter4-ruflo.md b/docs/superpowers/plans/2026-05-15-automation-graph-iter4-ruflo.md new file mode 100644 index 00000000..f64ba3e0 --- /dev/null +++ b/docs/superpowers/plans/2026-05-15-automation-graph-iter4-ruflo.md @@ -0,0 +1,609 @@ +# Карта автоматизации iter4 — слияние ruflo big-bang. План реализации + +> **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` (iter4): +12 узлов, +22 ребра, 8→11 конфликтов, рефреш 4 узлов-правил и §12/sub-policy-формулировок под нормативку v2.0, удалить форк `automation-graph-ruflo.html`. + +**Architecture:** Правка единственного self-contained HTML-файла (vis.js Network 9.1.9). Ruflo-наслой добавляется в 6 секций файла (`GROUPS`, `CATEGORY_LABELS`, `cat-legend` HTML, `NODES`, `EDGES`, `NODE_DETAILS`, `EDGE_DETAILS`). SECTION 4–8 (vis-init, легенда-панель, тулбар, resize, highlighting) НЕ трогаются — подсветка авто-выводит `NEIGHBOURS` из рёбер и `CONFLICT_ENDPOINTS` из dashed-рёбер, фильтр `group:ruflo` авто-работает через `data-filter-key`. 3 атомарных коммита: ruflo-наслой → рефреш v2.0 → удаление форка. Затем visual smoke и синхронизация memory. + +**Tech Stack:** HTML5, vanilla JS, vis-network 9.1.9 (CDN, Solarized Dark). Без сборки, без unit-тестов — верификация через структурный grep-подсчёт + visual smoke (Playwright MCP). + +**Спек:** `docs/superpowers/specs/2026-05-15-automation-graph-iter4-ruflo-design.md` (коммит `55696e5`). + +--- + +## Структура файла + +Единственный затрагиваемый файл реализации — `docs/automation-graph.html` (1609 строк). Затрагиваемые регионы: + +| Регион | Что | Якорь для вставки | +|---|---|---| +| `cat-legend` (HTML) | +1 пункт фильтра ruflo | после `data-filter-key="group:memory"` строки, перед `conflict:RED` | +| SECTION 1 `NODES` | +12 узлов | перед закрывающей `];` массива `NODES` (после узла `mem_github`) | +| SECTION 2 `EDGES` | +22 ребра | перед закрывающей `];` массива `EDGES` (после `CONFLICT('hk_economy', ...)`) | +| SECTION 2 `CONFLICT` #8 | правка строки | строка `CONFLICT('hk_economy', 'superpowers', ...)` | +| SECTION 3 `CATEGORY_LABELS` | +1 ключ `ruflo` | объект `CATEGORY_LABELS` | +| SECTION 3 `NODE_DETAILS` | +12 записей + правка 7 записей | перед закрывающей `};` объекта `NODE_DETAILS` (после `mem_devindices`) | +| SECTION 3.5 `EDGE_DETAILS` | +21 запись + правка 2 записей | перед закрывающей `};` объекта `EDGE_DETAILS` (после `'hk_economy->superpowers'`) | +| SECTION 4 `GROUPS` | +1 группа `ruflo` | объект `GROUPS`, после `memory:` | + +Прочие файлы: `docs/automation-graph-ruflo.html` (удаление), memory `project_automation_map.md` + `project_ruflo_integration.md` (синхронизация, вне git-репозитория). + +--- + +## Task 1: Ruflo-наслой — группа, узлы, рёбра, легенды + +**Files:** + +- Modify: `docs/automation-graph.html` (секции `cat-legend`, `GROUPS`, `CATEGORY_LABELS`, `NODES`, `EDGES`, `NODE_DETAILS`, `EDGE_DETAILS`) + +Один логический коммит — полный ruflo-наслой. После задачи карта когерентна: ruflo-узлы рендерятся, кликабельны, легенды заполнены. + +- [ ] **Step 1: Добавить группу `ruflo` в `GROUPS`** + +В объекте `const GROUPS = { ... }` (SECTION 4) после строки группы `memory:` добавить строку. Якорь — строка `memory:` (заканчивается на `font: { color: '#eee8d5', size: 10 } },`). После неё, перед `};`: + +```js + ruflo: { color: { background: '#332100', border: '#ff8800', highlight: { border: '#ffaa33', background: '#4d3300' } }, font: { color: '#fdf6e3', size: 12, bold: true } }, +``` + +- [ ] **Step 2: Добавить ключ `ruflo` в `CATEGORY_LABELS`** + +Объект `const CATEGORY_LABELS = { ... }` (начало SECTION 3). Заменить целиком: + +```js +const CATEGORY_LABELS = { + rules: 'Правило', plugins: 'Плагин', skills_sp: 'Скил Superpowers', + skills_proj: 'Скил проекта', hooks: 'Хук .claude', agents: 'Агент', + mcp: 'MCP-сервер', lefthook: 'Lefthook job', memory: 'Memory-файл', + ruflo: 'ruflo (оркестратор)' +}; +``` + +- [ ] **Step 3: Добавить пункт фильтра ruflo в `cat-legend`** + +В блоке `
` после строки `
...
` и перед строкой `data-filter-key="conflict:RED"` вставить: + +```html +
🌊 ruflo (оркестратор)
+``` + +- [ ] **Step 4: Добавить 12 ruflo-узлов в `NODES`** + +В массиве `const NODES = [ ... ]` (SECTION 1) перед закрывающей `];` (последний легаси-узел — `mem_github`) добавить: + +```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 }, +``` + +NB: ruflo-узлы без свойств `ring`/`...pos()` (они вне радиального layout) и без `fixed`/`subPolicy` (физика отключена глобально, `subPolicy` — мёртвое свойство из форка). Координаты — финальная подгонка по visual smoke в Task 4. + +- [ ] **Step 5: Добавить 22 ruflo-ребра в `EDGES`** + +В массиве `const EDGES = [ ... ]` (SECTION 2) перед закрывающей `];` (последняя строка массива — `CONFLICT('hk_economy', 'superpowers', ...)`) добавить: + +```js + + // ══════════════════════════════════════════════════ + // RUFLO ОРКЕСТРАТОР — наслой ruflo big-bang (2026-05-15) + // ══════════════════════════════════════════════════ + // Queen → 9 swarm-ролей + E('ruflo_queen', 'ruflo_architect', 'подчиняет'), + E('ruflo_queen', 'ruflo_coder', 'подчиняет'), + E('ruflo_queen', 'ruflo_security', 'подчиняет'), + E('ruflo_queen', 'ruflo_rls', 'подчиняет'), + E('ruflo_queen', 'ruflo_qa', 'подчиняет'), + E('ruflo_queen', 'ruflo_tester', 'подчиняет'), + E('ruflo_queen', 'ruflo_reviewer', 'подчиняет'), + E('ruflo_queen', 'ruflo_memory', 'подчиняет'), + E('ruflo_queen', 'ruflo_daemon', 'подчиняет'), + // Queen → MCP-сервер ruflo + E('ruflo_queen', 'ruflo_mcp', 'экспонирует\n~210 инструментов'), + // 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'), + // swarm → legacy execution-layer + E('ruflo_coder', 'ag_pest', 'делегирует TDD'), + E('ruflo_security', 'ag_rls', 'делегирует RLS'), + E('ruflo_rls', 'sk_rls', 'делегирует\nRLS-скил'), + E('ruflo_memory', 'mem_state', 'reindex HNSW'), + // memory → ruflo + E('mem_ruflo', 'ruflo_queen', 'документирует\nинтеграцию'), + + // 3 новых конфликта ruflo (3-color, iter2 §4) + CONFLICT('ruflo_queen', 'pravila', 'Нормативка декларирует ruflo уровнем −1 (overlord) — фактически parallel subsystem', 'RED'), + CONFLICT('ruflo_daemon', 'mem_state', 'Два хранилища памяти (.md и HNSW) рассинхронизированы; memory store не персистит', 'BLACK'), + CONFLICT('ruflo_daemon', 'ag_pest', 'Daemon worker-jitter усиливает частоту Pest квирка 72', 'BLACK'), +``` + +NB: ребро `E('ruflo_queen', 'pravila', ...)` И `CONFLICT('ruflo_queen', 'pravila', ...)` — два ребра с одной парой from/to. Это допустимо (vis.js рисует параллельные рёбра); `EDGE_DETAILS` индексируется одним ключом `'ruflo_queen->pravila'` — под него кладётся запись конфликта (Step 7, diagnostic-priority — как 3 легаси-пары normal+conflict). + +- [ ] **Step 6: Добавить 12 ruflo-записей в `NODE_DETAILS`** + +В объекте `const NODE_DETAILS = { ... }` (SECTION 3) перед закрывающей `};` (последняя легаси-запись — `mem_devindices`) добавить: + +```js + + // ── RUFLO ОРКЕСТРАТОР ──────────────────────────── + ruflo_queen: nd( + 'Оркестратор ruflo v3.7.0-alpha.38 — Queen-led routing: SONA нейро-классификация задач, swarm-топологии (Raft/Byzantine/Gossip), HNSW vector memory. По нормативке — entry-point уровня −1 для всех задач.', + 'По нормативке — первичная классификация любой задачи и маршрутизация в sub-policy paired-stack ИЛИ прямое исполнение через swarm.', + 'Фактически ruflo НЕ перехватывает Claude Code workflow — Claude работает напрямую (скилы/инструменты). Queen-led routing как entry-point — нормативная декларация, не runtime. Alpha-версия. LLM API-ключи отсутствуют → swarm-агенты idle, $-расход near-zero. Plugin discovery через IPFS нестабилен (Pinata/Cloudflare недоступны 15.05.2026, рабочий только ipfs.io).', + [], + [ + { name: '9 swarm-ролей', cond: 'hive-mind Queen + 9 worker-агентов (idle)' }, + { name: 'ruflo MCP', cond: 'экспонирует ~210 инструментов' }, + { name: '4 узла-правила', cond: 'нормативная декларация уровня −1 (без enforcement)' } + ], + [{ name: 'memory:project_ruflo_integration', cond: 'memory-файл документирует интеграцию' }], + [{ name: 'Pravila', desc: 'Нормативка (Pravila §0/§12, CLAUDE.md §1, PSR_v1 R0) декларирует ruflo Queen-led routing уровнем −1 — overlord над всей иерархией. Фактически ruflo — параллельная подсистема: Claude работает напрямую, ruflo daemon/hive-mind крутятся рядом. Механизма enforcement нет — декларация ≠ runtime.', type: 'RED' }] + ), + ruflo_architect: nd( + 'Swarm-агент роли Architect в hive-mind ruflo — проектирование архитектуры.', + 'При routing-decision Queen на архитектурную задачу.', + 'idle — LLM API-ключи отсутствуют, реальная агентская работа (spawn --claude) не запускалась. Generic type. Alpha.', + [{ name: 'ruflo Queen', cond: 'подчинён — Queen-led hierarchy' }], + [], + [] + ), + ruflo_coder: nd( + 'Swarm-агент роли Coder в hive-mind ruflo — написание кода.', + 'При routing-decision Queen на задачу реализации кода.', + 'idle — LLM API-ключи отсутствуют, spawn --claude не запускался. Generic type. Alpha.', + [{ name: 'ruflo Queen', cond: 'подчинён — Queen-led hierarchy' }], + [], + [{ name: 'агент pest-parallel-debugger', cond: 'делегирует TDD-задачи в legacy execution-layer' }] + ), + ruflo_security: nd( + 'Swarm-агент роли Security в hive-mind ruflo — аудит безопасности.', + 'При routing-decision Queen на задачу безопасности.', + 'idle — LLM API-ключи отсутствуют, spawn --claude не запускался. Generic type. Alpha.', + [{ name: 'ruflo Queen', cond: 'подчинён — Queen-led hierarchy' }], + [], + [{ name: 'агент rls-reviewer', cond: 'делегирует RLS-задачи в legacy execution-layer' }] + ), + ruflo_rls: nd( + 'Swarm-агент роли RLS-reviewer в hive-mind ruflo — проверка RLS (защиты строк по тенанту).', + 'При routing-decision Queen на задачу RLS-аудита.', + 'idle — LLM API-ключи отсутствуют, spawn --claude не запускался. Generic type. Alpha.', + [{ name: 'ruflo Queen', cond: 'подчинён — Queen-led hierarchy' }], + [], + [{ name: 'скил rls-check', cond: 'делегирует RLS-скил в legacy execution-layer' }] + ), + ruflo_qa: nd( + 'Swarm-агент роли QA в hive-mind ruflo — контроль качества.', + 'При routing-decision Queen на QA-задачу.', + 'idle — LLM API-ключи отсутствуют, spawn --claude не запускался. Generic type. Alpha.', + [{ name: 'ruflo Queen', cond: 'подчинён — Queen-led hierarchy' }], + [], + [] + ), + ruflo_tester: nd( + 'Swarm-агент роли Tester в hive-mind ruflo — прогон тестов.', + 'При routing-decision Queen на задачу тестирования.', + 'idle — LLM API-ключи отсутствуют, spawn --claude не запускался. Generic type. Alpha.', + [{ name: 'ruflo Queen', cond: 'подчинён — Queen-led hierarchy' }], + [], + [] + ), + ruflo_reviewer: nd( + 'Swarm-агент роли Reviewer в hive-mind ruflo — ревью кода.', + 'При routing-decision Queen на задачу ревью.', + 'idle — LLM API-ключи отсутствуют, spawn --claude не запускался. Generic type. Alpha.', + [{ name: 'ruflo Queen', cond: 'подчинён — Queen-led hierarchy' }], + [], + [] + ), + ruflo_memory: nd( + 'Swarm-агент роли Memory-keeper — HNSW vector index + SONA neural routing. Хранилище `.swarm/memory.db` (sql.js) + реальные embeddings Xenova/all-MiniLM-L6-v2 384-dim.', + 'При обращении к памяти ruflo — переиндексация memory-файлов в HNSW-базу.', + '`ruflo memory store` CLI не персистит между запусками процесса (alpha-баг H7 — in-memory sql.js не флашится на диск).', + [{ name: 'ruflo Queen', cond: 'подчинён — Queen-led hierarchy' }], + [], + [{ name: 'memory:project_state', cond: 'переиндексирует memory-файлы в HNSW' }] + ), + ruflo_daemon: nd( + 'Фоновый демон ruflo под PM2 (`ruflo-daemon`, 5 workers: map/audit/optimize/consolidate/testgaps). Reboot-survival через Windows Task Scheduler.', + 'Работает постоянно в фоне — 5 workers в local-fallback mode.', + 'Workers в local-fallback (file I/O по `.claude-flow/`, без платных LLM-вызовов). Worker-jitter усиливает частоту Pest --parallel квирка 72 — на baseline-регрессии нужно `pm2 stop ruflo-daemon`.', + [{ name: 'ruflo Queen', cond: 'подчинён — Queen-led hierarchy' }], + [], + [], + [ + { name: 'memory:project_state', desc: 'Два хранилища памяти — статичные memory/*.md и HNSW-база ruflo (.swarm/memory.db) — рассинхронизированы. `ruflo memory store` не персистит между запусками (alpha-баг H7). Дублирование без регламента синхронизации.', type: 'BLACK' }, + { name: 'агент pest-parallel-debugger', desc: 'Daemon worker-jitter усиливает частоту Pest --parallel квирка 72 (гонка в Redis). ruflo не трогает Redis :6379 — лишь timing-amplifier. На baseline-регрессии — `pm2 stop ruflo-daemon` (квирк #93).', type: 'BLACK' } + ] + ), + ruflo_mcp: nd( + 'MCP-сервер ruflo — stdio mode, 7-й сервер в `.mcp.json`, экспонирует ~210 инструментов (agent/memory/swarm/hooks/neural и др.).', + 'Инструменты экспонированы постоянно — доступны Claude как MCP-tools.', + 'Claude НЕ обязан вызывать ruflo-инструменты — отсюда статус ruflo как parallel subsystem, а не overlord. Alpha-версия.', + [{ name: 'ruflo Queen', cond: 'часть оркестратора ruflo' }], + [], + [] + ), + mem_ruflo: nd( + 'Memory-файл `project_ruflo_integration` — история ruflo big-bang: Phase 1–7 + активация рантайма, alpha-баги, операционные ноты.', + 'При работе с ruflo — для контекста интеграции и известных alpha-багов.', + 'Снимок состояния на 15.05.2026. Описывает alpha-баги (memory-CLI H7, embeddings-fragility) — обновлять при изменении.', + [], + [], + [{ name: 'ruflo Queen', cond: 'документирует ruflo-интеграцию' }] + ), +``` + +- [ ] **Step 7: Добавить 21 ruflo-запись в `EDGE_DETAILS`** + +В объекте `const EDGE_DETAILS = { ... }` (SECTION 3.5) перед закрывающей `};` (последняя легаси-запись — `'hk_economy->superpowers'`) добавить: + +```js + + // ── RUFLO ОРКЕСТРАТОР (наслой ruflo big-bang 2026-05-15) ── + 'ruflo_queen->ruflo_architect': { type: 'подчиняет', when: 'hive-mind активен — Queen раздаёт задачи swarm-агентам', transfers: 'контроль', mandatory: 'опционально', rule: 'Tooling §4.10 (orchestration layer)' }, + 'ruflo_queen->ruflo_coder': { type: 'подчиняет', when: 'hive-mind активен — Queen раздаёт задачи swarm-агентам', transfers: 'контроль', mandatory: 'опционально', rule: 'Tooling §4.10 (orchestration layer)' }, + 'ruflo_queen->ruflo_security': { type: 'подчиняет', when: 'hive-mind активен — Queen раздаёт задачи swarm-агентам', transfers: 'контроль', mandatory: 'опционально', rule: 'Tooling §4.10 (orchestration layer)' }, + 'ruflo_queen->ruflo_rls': { type: 'подчиняет', when: 'hive-mind активен — Queen раздаёт задачи swarm-агентам', transfers: 'контроль', mandatory: 'опционально', rule: 'Tooling §4.10 (orchestration layer)' }, + 'ruflo_queen->ruflo_qa': { type: 'подчиняет', when: 'hive-mind активен — Queen раздаёт задачи swarm-агентам', transfers: 'контроль', mandatory: 'опционально', rule: 'Tooling §4.10 (orchestration layer)' }, + 'ruflo_queen->ruflo_tester': { type: 'подчиняет', when: 'hive-mind активен — Queen раздаёт задачи swarm-агентам', transfers: 'контроль', mandatory: 'опционально', rule: 'Tooling §4.10 (orchestration layer)' }, + 'ruflo_queen->ruflo_reviewer': { type: 'подчиняет', when: 'hive-mind активен — Queen раздаёт задачи swarm-агентам', transfers: 'контроль', mandatory: 'опционально', rule: 'Tooling §4.10 (orchestration layer)' }, + 'ruflo_queen->ruflo_memory': { type: 'подчиняет', when: 'hive-mind активен — Queen раздаёт задачи swarm-агентам', transfers: 'контроль', mandatory: 'опционально', rule: 'Tooling §4.10 (orchestration layer)' }, + 'ruflo_queen->ruflo_daemon': { type: 'подчиняет', when: 'hive-mind активен — Queen раздаёт задачи swarm-агентам', transfers: 'контроль', mandatory: 'опционально', rule: 'Tooling §4.10 (orchestration layer)' }, + 'ruflo_queen->ruflo_mcp': { type: 'экспонирует', when: 'MCP-сервер ruflo постоянно поднят (stdio, 7-й в .mcp.json)', 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)' }, + 'ruflo_coder->ag_pest': { type: 'делегирует', when: 'при routing-decision Queen (требует LLM API-ключи — сейчас idle)', transfers: 'триггер', mandatory: 'опционально', rule: 'Tooling §4.10' }, + 'ruflo_security->ag_rls': { type: 'делегирует', when: 'при routing-decision Queen (требует LLM API-ключи — сейчас idle)', transfers: 'триггер', mandatory: 'опционально', rule: 'Tooling §4.10' }, + 'ruflo_rls->sk_rls': { type: 'делегирует', when: 'при routing-decision Queen (требует LLM API-ключи — сейчас idle)', transfers: 'триггер', mandatory: 'опционально', rule: 'Tooling §4.10' }, + 'ruflo_memory->mem_state': { type: 'читает', when: 'Memory-keeper переиндексирует memory-файлы в HNSW-базу', transfers: 'данные', mandatory: 'опционально', rule: 'Tooling §4.10 (HNSW vector memory)' }, + 'mem_ruflo->ruflo_queen': { type: 'документирует', when: 'memory-файл хранит историю ruflo-интеграции (Phase 1–7 + runtime)', transfers: 'данные', mandatory: 'рекомендуется', rule: 'memory/project_ruflo_integration.md' }, + 'ruflo_daemon->mem_state': { type: 'конфликт', when: 'два хранилища памяти — статичные .md и HNSW-база ruflo', transfers: 'coverage', mandatory: 'опционально', rule: 'нет регламента синхронизации (alpha-баг H7)' }, + 'ruflo_daemon->ag_pest': { type: 'конфликт', when: 'daemon worker-jitter усиливает частоту Pest квирка 72', transfers: 'coverage', mandatory: 'опционально', rule: 'memory feedback_environment квирк #93 (pm2 stop на baseline-регрессии)' }, +``` + +- [ ] **Step 8: Структурная верификация** + +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 -c "'ruflo_queen->" docs/automation-graph.html +``` + +Expected: `{ id: '` → **85**; `E('` → **85**; `CONFLICT('` → **11**; `ruflo_` (NODE_DETAILS keys) → **10** (ruflo_queen + 9 swarm; `ruflo_mcp` ключ начинается так же — итого 11; если grep даёт 11, это ок — считает ruflo_mcp); `'ruflo_queen->` → **14** (9 swarm + mcp + 4 правила). Если числа не сходятся — найти пропущенную/лишнюю запись до коммита. + +- [ ] **Step 9: Visual smoke — ruflo-узлы рендерятся и кликабельны** + +Если Playwright MCP доступен: + +```bash +cd "c:/моя/проекты/портал crm/Документация/docs" && python -m http.server 8765 +``` + +(квирк #90 — Playwright отвергает `file://`). Открыть `http://localhost:8765/automation-graph.html`, проверить: (а) граф рендерится, ruflo-кластер виден в верхнем-левом углу оранжевым; (б) клик по `ruflo_queen` — панель легенды заполнена 7 секциями, конфликт 🔴 виден; (в) клик по ruflo-ребру — edge-легенда 5 полей (не «Регламент не задокументирован»); (г) клик «🌊 ruflo (оркестратор)» в нижней легенде подсвечивает 11 ruflo-узлов; (д) консоль браузера — 0 ошибок. Остановить сервер. Если Playwright MCP недоступен — пометить smoke как отложенный к Task 4. + +- [ ] **Step 10: Commit A** + +```bash +cd "c:/моя/проекты/портал crm/Документация" +git add docs/automation-graph.html +git commit -m "feat(graph): ruflo orchestrator overlay — +12 nodes / +22 edges / 3 conflicts (iter4) + +Co-Authored-By: Claude Opus 4.7 (1M context) " +``` + +--- + +## Task 2: Рефреш под нормативку v2.0 — узлы-правила, §12/sub-policy, конфликт #8 + +**Files:** + +- Modify: `docs/automation-graph.html` (`NODES` метки 4 правил, `NODE_DETAILS` записи `pravila`/`claude_md`/`psr_v1`/`tooling`/`superpowers`/`hk_economy`/`mem_sp`, `EDGES` конфликт #8, `EDGE_DETAILS` записи `pravila->superpowers`/`hk_economy->superpowers`) + +- [ ] **Step 1: Обновить метки 4 узлов-правил в `NODES`** + +В массиве `NODES` заменить (4 точечные правки): + +- `label: 'Pravila v1.13'` → `label: 'Pravila v1.14'` +- `label: 'CLAUDE.md v1.92'` → `label: 'CLAUDE.md v2.0'` +- `label: 'PSR_v1 v2.1'` → `label: 'PSR_v1 v3.0'` +- `label: 'Tooling v1.17'` → `label: 'Tooling v2.0'` + +- [ ] **Step 2: Переписать `NODE_DETAILS.pravila`** + +Заменить запись `pravila: nd( ... ),` целиком на: + +```js + pravila: nd( + 'Главный свод правил работы Клода — кто чем командует, что запрещено, какие обязательные действия.', + 'Действует всегда — Клод читает его при старте каждой сессии.', + '§12 Superpowers стал sub-policy под ruflo Queen-led routing (уровень −1); в уровнях 0–6 цепочки приоритетов §12 остаётся hard-rule (скил инвокируется первым), economy-режим §12 не отменяет. Расходимость с другими документами — нарушение §7.', + [{ name: 'ruflo Queen', cond: 'уровень −1 по нормативке — ruflo Queen-led routing над Pravila' }], + [ + { name: 'CLAUDE.md', cond: 'подчинён, уровень 2a в цепочке приоритетов' }, + { name: 'PSR_v1', cond: 'подчинён, уровень 3 в цепочке приоритетов' }, + { name: 'плагин Superpowers', cond: '§12 обязывает запускать скил первым' }, + { name: 'Все компоненты', cond: 'через цепочку приоритетов §1' } + ], + [{ name: 'CLAUDE.md', cond: 'оба читаются при старте сессии' }], + [{ name: 'ruflo Queen', desc: 'Нормативка декларирует ruflo Queen-led routing уровнем −1 над Pravila — overlord. Фактически ruflo — параллельная подсистема, Claude работает напрямую; механизма enforcement нет (декларация ≠ runtime).', type: 'RED' }] + ), +``` + +- [ ] **Step 3: Переписать `NODE_DETAILS.claude_md`** + +Заменить запись `claude_md: nd( ... ),` целиком на: + +```js + claude_md: nd( + 'Оперативная карта проекта — технологии, команды, фазы, 9-уровневая цепочка приоритетов (§1, уровень −1 — ruflo) и §3.5 orchestration layer, ссылки на документы.', + 'Читается при старте каждой сессии; обновляется при новом инструменте или новой фазе.', + 'Править можно только через скил `/claude-md-management:claude-md-improver` или `:revise-claude-md` (правило §5 п.10). Прямые Edit/Write блокируются хуком предупреждения.', + [{ name: 'Pravila', cond: 'всегда подчинён (уровень 2a)' }], + [ + { name: 'Tooling v2.0', cond: 'ссылается как на реестр инструментов' }, + { name: 'плагин claude-md-management', cond: 'правило §5 п.10 — единственный канал правок' } + ], + [ + { name: 'Pravila', cond: 'оба читаются при старте сессии' }, + { name: 'Tooling', cond: 'оба — оперативные карты уровня 2' } + ], + [{ name: 'PSR_v1', desc: 'Правило §5 п.10 запрещает прямые правки, но PSR_v1 это явно не повторяет — есть риск Edit без скила', type: 'GREEN' }] + ), +``` + +- [ ] **Step 4: Переписать `NODE_DETAILS.psr_v1`** + +Заменить запись `psr_v1: nd( ... ),` целиком на: + +```js + psr_v1: nd( + 'Правила совместной работы плагинов — кто с кем работает, какая процедура обязательна. R0 stack-gate переформулирован в sub-policy paired-stack delegation pattern под ruflo Queen-led routing.', + 'При выборе UI-инструмента (плагин Frontend Design против плагина UI UX Pro Max против MCP-сервера 21st Magic), при координации парных плагинов, при включении дополнительного MCP (внешнего сервиса-инструмента Claude) вне основных фаз.', + 'Обязательное правило R14.5: плагины UI UX Pro Max, 21st Magic, Frontend Design — нельзя использовать одновременно. Обязательное правило R6.0 (фильтр стека) и R6.1 (палитра Forest) — нужно соблюдать при UI-выводе плагинов.', + [{ name: 'Pravila', cond: 'подчинён, уровень 3 в цепочке' }], + [ + { name: 'плагин Superpowers + плагин Frontend Design', cond: 'координирует как пару плагинов' }, + { name: 'плагин UI UX Pro Max', cond: 'R14.3: включается только через процедуру' }, + { name: 'MCP-сервер 21st Magic', cond: 'R14.4: включается только через процедуру' } + ], + [{ name: 'CLAUDE.md', cond: 'обе — оперативные карты, правятся согласованно' }], + [{ name: 'CLAUDE.md', desc: 'CLAUDE.md §5 п.10 требует править только через скил claude-md-management, а PSR_v1 это ограничение не повторяет — риск прямых Edit', type: 'GREEN' }] + ), +``` + +- [ ] **Step 5: Переписать `NODE_DETAILS.tooling`** + +Заменить запись `tooling: nd( ... ),` целиком на: + +```js + tooling: nd( + 'Реестр 55 позиций — 35 формализованных инструментов + 20 ruflo-плагинов; +§4.10 Orchestration layer. Когда что использовать, команды установки, конфликты.', + 'При выборе инструмента для фазы (нулевая документация / первая backend / вторая frontend / третья перед запуском в боевую среду), при добавлении нового инструмента, при обновлении версий.', + 'При прямом конфликте с CLAUDE.md побеждает CLAUDE.md (оперативная карта уровня 2a). Любая правка требует синхронизации с CLAUDE.md §3.', + [ + { name: 'Pravila', cond: 'уровень 2b — оперативная карта рядом с CLAUDE.md' }, + { name: 'CLAUDE.md', cond: 'при прямом конфликте побеждает CLAUDE.md' } + ], + [], + [{ name: 'CLAUDE.md', cond: 'обе — оперативные карты, правятся синхронно' }] + ), +``` + +- [ ] **Step 6: Обновить `NODE_DETAILS.superpowers` — `limits` и `conflicts`** + +В записи `superpowers: nd( ... )` заменить 3-й аргумент (`limits`): + +Было: `'Обязательное правило §12: единственная отмена — явная просьба заказчика «не используй superpowers сейчас» на текущее действие. Раздел §9 «Отступления» к §12 не применяется.'` + +Стало: `'§12 Superpowers — sub-policy под ruflo Queen-led routing (уровень −1); в уровнях 0–6 остаётся hard-rule (скил инвокируется первым). Единственная отмена — явная просьба заказчика «не используй superpowers сейчас» на текущее действие; §9 «Отступления» к §12 не применяется; economy-режим §12 не отменяет.'` + +И в той же записи заменить `desc` единственного элемента 7-го аргумента (`conflicts`): + +Было: `'Режим экономии 100% теоретически может «сэкономить» запуск скила и нарушить обязательное правило §12 (§12 нельзя отменить)'` + +Стало: `'Режим экономии 100% теоретически может «сэкономить» запуск скила — §12 (sub-policy под ruflo Queen-led routing) economy-режим не отменяет.'` + +- [ ] **Step 7: Обновить `NODE_DETAILS.hk_economy` — `limits` и `conflicts`** + +В записи `hk_economy: nd( ... )` заменить 3-й аргумент (`limits`): + +Было: `'Правило §12 **НЕ** отменяется этим режимом ни на каком уровне. Действует только на текущую задачу — следующий промпт разбирается заново.'` + +Стало: `'§12 Superpowers — sub-policy под ruflo Queen-led routing, но economy-режим §12 НЕ отменяет ни на каком уровне. Действует только на текущую задачу — следующий промпт разбирается заново.'` + +И заменить `desc` единственного элемента 7-го аргумента (`conflicts`): + +Было: `'Экономия=100% теоретически может «сэкономить» вызов скила, нарушая обязательное правило (см. §12) — §12 неотменяем, экономия его не отменяет'` + +Стало: `'Экономия=100% теоретически может «сэкономить» вызов скила — §12 (sub-policy под ruflo Queen-led routing) economy-режим не отменяет ни на каком уровне (Pravila §12.4).'` + +- [ ] **Step 8: Обновить `NODE_DETAILS.mem_sp` — `desc`** + +В записи `mem_sp: nd( ... )` заменить 1-й аргумент (`desc`): + +Было: `'Обязательное правило §12 + архитектура хука economy из 6 компонентов — дисциплина вызова скилов.'` + +Стало: `'Правило §12 (sub-policy под ruflo Queen-led routing) + архитектура хука economy из 6 компонентов — дисциплина вызова скилов.'` + +- [ ] **Step 9: Обновить конфликт #8 в `EDGES`** + +Заменить строку: + +Было: `CONFLICT('hk_economy', 'superpowers', 'Pravila §12.4: §12 неотменяем', 'GREEN'),` + +Стало: `CONFLICT('hk_economy', 'superpowers', '§12 — sub-policy под ruflo; economy-режим §12 не отменяет (Pravila §12.4)', 'GREEN'),` + +- [ ] **Step 10: Обновить 2 записи в `EDGE_DETAILS`** + +Заменить запись `'pravila->superpowers'`: + +Было: `'pravila->superpowers': { type: 'подчиняет', when: 'задача попадает под карту §12.2 (14 типов)', transfers: 'контроль', mandatory: 'hard-block', rule: 'Pravila §12 (hard rule, §9 не применяется)' },` + +Стало: `'pravila->superpowers': { type: 'подчиняет', when: 'задача попадает под карту §12.2 (14 типов)', transfers: 'контроль', mandatory: 'hard-block', rule: 'Pravila §12 (sub-policy под ruflo Queen-led routing; в уровнях 0–6 — hard rule, §9 не применяется)' },` + +Заменить запись `'hk_economy->superpowers'`: + +Было: `'hk_economy->superpowers': { type: 'конфликт', when: 'economy hook блокирует skill в обход Pravila §12', transfers: 'контроль', mandatory: 'hard-block', rule: 'Pravila §12.4 (только явный «не используй»)' },` + +Стало: `'hk_economy->superpowers': { type: 'конфликт', when: 'economy-режим теоретически может «сэкономить» вызов скила — §12 (sub-policy под ruflo) economy не отменяет', transfers: 'контроль', mandatory: 'hard-block', rule: 'Pravila §12.4 (только явный «не используй»)' },` + +- [ ] **Step 11: Верификация — устаревшие формулировки вычищены** + +Run: + +```bash +cd "c:/моя/проекты/портал crm/Документация" +grep -n "неотменяем" docs/automation-graph.html +grep -n "v1.13\|v1.92\|v2.1\|v1.17\|35 инструмент" docs/automation-graph.html +``` + +Expected: оба `grep` — **0 совпадений** (пустой вывод). Если что-то найдено — не закоммиченный остаток, исправить. `grep -c "^ ruflo_" docs/automation-graph.html` — без изменений (Task 2 не трогает ruflo-записи). + +- [ ] **Step 12: Visual smoke — узлы-правила** + +Если Playwright MCP доступен — открыть карту (как в Task 1 Step 9), кликнуть `pravila` / `claude_md` / `psr_v1` / `tooling`: метки показывают v1.14 / v2.0 / v3.0 / v2.0; легенда `pravila` показывает reportsTo «ruflo Queen» + конфликт 🔴; 0 ошибок в консоли. Иначе — отложить к Task 4. + +- [ ] **Step 13: Commit B** + +```bash +cd "c:/моя/проекты/портал crm/Документация" +git add docs/automation-graph.html +git commit -m "docs(graph): refresh rule nodes + §12/sub-policy to v2.0 normative (iter4) + +Co-Authored-By: Claude Opus 4.7 (1M context) " +``` + +--- + +## Task 3: Удаление форка + +**Files:** + +- Delete: `docs/automation-graph-ruflo.html` + +- [ ] **Step 1: Удалить форк-файл** + +```bash +cd "c:/моя/проекты/портал crm/Документация" +git rm docs/automation-graph-ruflo.html +``` + +Expected: `rm 'docs/automation-graph-ruflo.html'`. + +- [ ] **Step 2: Подтвердить, что на форк нет ссылок в репозитории** + +```bash +cd "c:/моя/проекты/портал crm/Документация" +grep -rn "automation-graph-ruflo" --include=*.md --include=*.html . || echo "ссылок нет" +``` + +Expected: `ссылок нет` ИЛИ только совпадения внутри `docs/superpowers/specs/2026-05-15-ruflo-integration-design.md` и `docs/superpowers/plans/2026-05-15-ruflo-big-bang-integration.md` (исторические упоминания форка в закрытых spec/plan — править НЕ нужно, это исторические артефакты). Если ссылка найдена в актуальной нормативке или активном `.md` — отметить для отдельной правки, не блокировать коммит. + +- [ ] **Step 3: Commit C** + +```bash +cd "c:/моя/проекты/портал crm/Документация" +git commit -m "chore(graph): remove automation-graph-ruflo.html fork — merged into main map (iter4) + +Co-Authored-By: Claude Opus 4.7 (1M context) " +``` + +--- + +## Task 4: Комплексный visual smoke + подгонка координат + +**Files:** + +- Modify (при необходимости): `docs/automation-graph.html` (только координаты `x`/`y` ruflo-узлов при перекрытии) + +- [ ] **Step 1: Запустить локальный сервер** + +```bash +cd "c:/моя/проекты/портал crm/Документация/docs" && python -m http.server 8765 +``` + +(квирк #90 — Playwright отвергает `file://`; нужен HTTP-сервер.) + +- [ ] **Step 2: Visual smoke через Playwright MCP** + +Открыть `http://localhost:8765/automation-graph.html`. Проверить по спеку §8: + +- (а) 85 узлов рендерятся; ruflo-кластер (11 оранжевых) виден в верхнем-левом углу, без перекрытий с легаси-узлами и между собой; `mem_ruflo` (серый) рядом с кластером; +- (б) клик по каждому из 11 ruflo-узлов + `mem_ruflo` — панель легенды заполнена (7 секций), без пустых панелей; +- (в) клик по ruflo-рёбрам — edge-легенда показывает 5 полей (не «Регламент не задокументирован»); +- (г) фильтр `🌊 ruflo (оркестратор)` в нижней легенде подсвечивает 11 ruflo-узлов; фильтры 🔴/⚫/🟢 подхватывают 3 новых конфликта; +- (д) клик по 4 узлам-правилам — метки v1.14/v2.0/v3.0/v2.0, легенды освежены; +- (е) консоль браузера — 0 ошибок (квирк-проверка: нет узлов-сирот от несуществующих id); +- (ж) кнопки тулбара (Зафиксировать/Расшевелить/Сбросить вид/Снять выделение) и поиск работают. + +Если Playwright MCP недоступен — выполнить структурные grep-проверки (Task 1 Step 8 + Task 2 Step 11) и передать визуальную проверку заказчику (Edit в Edge). При клике по узким ruflo-рёбрам Playwright `browser_click` может быть flaky (квирк #91) — workaround `browser_evaluate('el.click()')`. + +- [ ] **Step 3: Подгонка координат при перекрытии** + +Если smoke выявил перекрытие `ruflo_mcp` / `mem_ruflo` / swarm-узлов — скорректировать `x`/`y` соответствующих узлов в `NODES`. Остановить сервер (Ctrl+C в фоновом процессе). + +- [ ] **Step 4: Commit D (только если координаты менялись)** + +```bash +cd "c:/моя/проекты/портал crm/Документация" +git add docs/automation-graph.html +git commit -m "fix(graph): tune ruflo node coordinates after visual smoke (iter4) + +Co-Authored-By: Claude Opus 4.7 (1M context) " +``` + +Если координаты не менялись — шаг пропустить. + +--- + +## Task 5: Синхронизация memory + +**Files:** + +- Modify: `memory/project_automation_map.md` (вне git-репозитория — путь `C:\Users\Administrator\.claude\projects\c---------------------crm-------------\memory\`) +- Modify: `memory/project_ruflo_integration.md` + +Memory-файлы вне git-репозитория проекта — правки через Edit, без коммита. + +- [ ] **Step 1: Обновить `project_automation_map.md`** + +Re-Read файл. Обновить секцию «Текущее состояние»: iter3 → **iter4**; метрики 73 узла / 74 ребра / 8 конфликтов → **85 узлов / 96 рёбер / 11 конфликтов (🔴3/⚫4/🟢4)**; 9 групп → **10 (+ruflo)**; добавить ruflo-кластер в «Структуру узлов» (Queen + 9 swarm + ruflo_mcp; +mem_ruflo в memory-группе); добавить ссылки на spec/plan iter4 (`docs/superpowers/specs/2026-05-15-automation-graph-iter4-ruflo-design.md`, `docs/superpowers/plans/2026-05-15-automation-graph-iter4-ruflo.md`) и коммиты iter4; убрать упоминание форка `automation-graph-ruflo.html` как существующего файла. + +- [ ] **Step 2: Обновить `project_ruflo_integration.md`** + +Re-Read файл. В секции «Что сделано в session» / «Spec/plan documents» — строку «Map fork: `docs/automation-graph-ruflo.html` commit `796d814` — TO-BE визуализация» отметить как **слитую в каноническую `docs/automation-graph.html` (iter4, 2026-05-15) и удалённую**; форк больше не существует. + +--- + +## Self-Review (выполнено при написании плана) + +**Spec coverage:** §5.1 узлы → Task 1 Step 4; §5.2 рёбра → Task 1 Step 5; §5.3 конфликты (3 новых) → Task 1 Step 5, конфликт #8 → Task 2 Step 9; §5.4 узлы-правила → Task 2 Steps 1–5; §5.5 §12/sub-policy → Task 2 Steps 6–10; §5.6 ruflo NODE_DETAILS → Task 1 Step 6; §5.7 ruflo EDGE_DETAILS → Task 1 Step 7; группа+CATEGORY_LABELS+cat-legend → Task 1 Steps 1–3; §6 границы scope — SECTION 4–8 не трогаются (отражено в Architecture); §7 файлы → Task 3 (удаление форка) + Task 5 (memory); §8 верификация → Task 4; §10 метрики → Task 5 Step 1. Покрытие полное. + +**Placeholder scan:** заглушек нет — весь JS-код приведён литералом, все Edit-правки даны парами «Было/Стало». + +**Type consistency:** `nd(desc, when, limits, reportsTo, manages, together, conflicts)` — 7-арг сигнатура; ruflo-узлы без конфликтов вызываются с 6 арг (`conflicts` опционален — `nd` подставляет `[]`), `ruflo_queen`/`ruflo_daemon` — с 7 арг. `E(from,to,label)` и `CONFLICT(from,to,label,type)` — сигнатуры из SECTION 2. `EDGE_DETAILS` ключи `'from->to'` совпадают с `edgeKey()`. Узловые id (`ruflo_queen`, `ruflo_*`, `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 легаси-пары normal+conflict). Учтено в Task 1 Step 5 NB + Step 7.