fix(map): 1 mcp_pw↔sk_parallel → 🟢 (квирк #95 + Pravila §15.2)

Фактологическая правка после повторного аудита «мозга» SYSTEM-режима
(продолжение Rec1-5 закрытия 18.05.2026).

Причина:
- nd()-тексты mcp_pw + sk_parallel ссылались на «квирк #2» в memory
- memory[#2] — это taskkill /F /IM на Windows, не Playwright
- реальный источник — квирк #95 (16.05.2026): профиль Playwright MCP
  хэшируется per-cwd → разные worktrees получают разные
  mcp-chrome-{hash} директории и не конфликтуют. README playwright-mcp
  прямо: конфликт — только для клиентов «sharing the same workspace»

Изменения:
- CONFLICT() BLACK → 🟢GREEN с новым reasoning
- mcp_pw nd() — текст «один shared browser» → «профиль per-cwd hash»
- sk_parallel nd() — type BLACK → GREEN, актуализированный desc
- EDGE_DETAILS rule — «нет регламента» → «GREEN: квирк #95 + §15.2 claim»
- snapshot 18.05.2026: счётчик 3/🟢8 → 2/🟢9 + сноска UPDATE
- snapshot «Ось 2» — переписана: оба оставшихся  — ruflo (dormant)

Эффект:
- 3 → 2 (оба оставшихся — ruflo, оба dormant после изоляции 18.05)
- 🟢8 → 🟢9
- реальное runtime-трение — ноль

Same-dir parallel (две Claude-сессии в одной dir одновременно зовут
browser) — редкий runtime-сценарий, регулируется Pravila §15.2 claim
в docs/sessions/CURRENT.md. Отдельный §15.4 «MCP same-dir locks» не
добавляется (вариант A — только фактологические правки).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-05-18 16:15:07 +03:00
parent bca6d55684
commit a03fb99242
2 changed files with 23 additions and 14 deletions
+5 -5
View File
@@ -579,7 +579,7 @@ const EDGES = [
// ══════════════════════════════════════════════════
CONFLICT('sk_rls', 'ag_rls', 'RLS: граница задана — скил по таблице, агент по diff/PR (spec 2026-05-16)', 'GREEN'),
CONFLICT('hookify_plugin', 'hk_pre_claude', 'Закрыто правилом HK1 (ADR-010, PSR_v1 R10.1 v3.13): hookify вызывается только по явному /hookify + обязательный pre-check на коллизию с зарегистрированными хуками; перезапись economy/skill-discipline архитектуры запрещена', 'GREEN'),
CONFLICT('mcp_pw', 'sk_parallel', 'Browser is already in use (квирк #2)', 'BLACK'),
CONFLICT('mcp_pw', 'sk_parallel', 'Профиль Playwright MCP хэшируется per-cwd (квирк #95) → worktrees получают разные mcp-chrome-{hash}, не конфликтуют. Same-dir parallel — редкий случай (две Claude-сессии в одной dir), регулируется Pravila §15.2 claim в docs/sessions/CURRENT.md', 'GREEN'),
CONFLICT('ag_pest', 'mcp_redis', 'Квирк 72 устранён 16.05.2026 (commit 0fa1a73 — array-стор в тестах): гонки в Redis при Pest --parallel больше нет', 'GREEN'),
CONFLICT('psr_v1', 'claude_md', 'Закрыто §5п.10 CLAUDE.md + хук CLAUDE.md-warn', 'GREEN'),
CONFLICT('upm', 'fd_plugin', 'PSR_v1 R14.5: не параллельно', 'GREEN'),
@@ -1000,7 +1000,7 @@ const NODE_DETAILS = {
[{ name: 'плагин Superpowers', cond: 'содержит' }],
[],
[{ name: 'скил worktree', cond: 'parallel-work использует worktree для изоляции' }],
[{ name: 'MCP-сервер playwright', desc: 'Браузер уже занят (Browser is already in use) при одновременном запуске нескольких сессий через worktree', type: 'BLACK' }]
[{ name: 'MCP-сервер playwright', desc: 'Профили per-cwd hash (квирк #95) → worktrees получают разные mcp-chrome-{hash} директории, не конфликтуют. Same-dir parallel — редкий runtime, регулируется Pravila §15.2 claim', type: 'GREEN' }]
),
sk_worktree: nd(
'Создаёт изолированную копию репозитория (worktree) для рискованной или параллельной работы.',
@@ -1231,11 +1231,11 @@ const NODE_DETAILS = {
mcp_pw: nd(
'Управляет браузером — снимает скриншоты, кликает, заполняет формы для smoke- и a11y-тестов.',
'При визуальной проверке прототипов (фаза 0), при a11y smoke (axe-core), при UI integration smoke.',
'Не для боевых пользователей. На сессию один общий браузер — при parallel-work возможны столкновения (см. квирк #2 в memory).',
'Не для боевых пользователей. Профиль persistent кэшируется per-cwd hash (квирк #95 в memory) → разные worktrees получают разные mcp-chrome-{hash} директории и не конфликтуют. Конфликт остаётся только при same-dir parallel (две Claude-сессии в одной dir одновременно вызывают browser).',
[{ name: 'CLAUDE.md §3.1 #2', cond: 'активен с фазы 0' }],
[],
[{ name: 'SessionStart хук', cond: 'используется для визуальной проверки прототипов' }],
[{ name: 'parallel-work скил', desc: 'Один shared browser на сессию — конкуренция при параллельной работе через worktrees (memory квирк #2)', type: 'BLACK' }]
[{ name: 'parallel-work скил', desc: 'Профили per-cwd hash → worktrees не конфликтуют (квирк #95). Same-dir parallel регулируется Pravila §15.2 claim в CURRENT.md', type: 'GREEN' }]
),
mcp_gh: nd(
'GitHub API — читает/создаёт PR, issues, коммиты, ветки в репозитории CoralMinister/lidpotok.',
@@ -1847,7 +1847,7 @@ const EDGE_DETAILS = {
// ── КОНФЛИКТЫ (8 рёбер; 3 из них имеют ту же пару from/to, что и обычные — здесь объединены под одним ключом) ─
'sk_rls->ag_rls': { type: 'конфликт', when: 'граница задана: скил — по таблице, агент — по diff/ветке/PR', transfers: 'coverage', mandatory: 'опционально', rule: 'секции «Граница…» в SKILL.md + rls-reviewer.md (spec 2026-05-16)' },
'hookify_plugin->hk_pre_claude': { type: 'конфликт', when: 'hookify plugin генерирует hook — двойное owner-ship vs settings.json', transfers: 'coverage', mandatory: 'опционально', rule: 'нет регламента (plugin vs settings.json)' },
'mcp_pw->sk_parallel': { type: 'конфликт', when: 'Playwright и parallel-agents оба требуют изоляцию', transfers: 'coverage', mandatory: 'опционально', rule: 'нет регламента (изоляция worktree vs MCP)' },
'mcp_pw->sk_parallel': { type: 'конфликт', when: 'Playwright и parallel-agents оба требуют изоляцию', transfers: 'coverage', mandatory: 'опционально', rule: 'GREEN: квирк #95 — профили per-cwd hash → worktrees не конфликтуют; same-dir parallel под Pravila §15.2 claim' },
'ag_pest->mcp_redis': { type: 'конфликт', when: 'Pest --parallel race на Redis cache (quirk 72/77)', transfers: 'coverage', mandatory: 'опционально', rule: 'CLAUDE.md §3.3 #35 (Redis MCP) — race остаётся вне регламента' },
'psr_v1->claude_md': { type: 'конфликт', when: 'PSR_v1 уровень 3 vs CLAUDE.md 2a — приоритет CLAUDE.md', transfers: 'контроль', mandatory: 'hard-block', rule: 'CLAUDE.md §1 (priority chain)' },
'upm->fd_plugin': { type: 'конфликт', when: 'UPM и FD оба претендуют на UI-решения', transfers: 'coverage', mandatory: 'hard-block', rule: 'PSR_v1 R14.5 (не параллельно)' },
@@ -12,11 +12,18 @@ Scope: **весь мозг, 125 узлов**. Заказчик попросил
## Состояние
Карта `docs/automation-graph.html`: **125 узлов / 135 рёбер**, конфликты **🔴0 / ⚫3 / 🟢8**
Карта `docs/automation-graph.html`: **125 узлов / 135 рёбер**, конфликты **🔴0 / ⚫2 / 🟢9**
(11 конфликтных рёбер). Тулчейн — **60 формализованных позиций** (29 phase-active +
30 off-phase + 1 historic). Последняя интеграция — #5660 Anthropic dev-tooling (push
`515acb6`, 18.05).
> **UPDATE 18.05.2026 вечер:** ⚫1 `mcp_pw ↔ sk_parallel` понижен до 🟢 после
> верификации квирка #95 — профиль Playwright MCP хэшируется per-cwd → worktrees
> получают разные `mcp-chrome-{hash}` директории, не конфликтуют. README playwright-mcp
> прямо: конфликт — только для клиентов «sharing the same workspace». Same-dir parallel
> регулируется Pravila §15.2 claim в `docs/sessions/CURRENT.md`. Эффект: ⚫3 → ⚫2,
> 🟢8 → 🟢9. Оба оставшихся ⚫ — ruflo (после изоляции 18.05 dormant).
### Ось 1 — здоровье новых узлов
С iter7 (16.05, 83 узла) мозг вырос на ~42 узла серией интеграций A6→D3→C9→A4→A3→A11→
@@ -38,18 +45,20 @@ section) синхронизирован интеграциями — покры
### Ось 2 — конфликты
🔴0 структурных — все закрыты правилами. 3 ⚫ (возникли на практике, рантайм):
🔴0 структурных — все закрыты правилами. 2 ⚫ (после downgrade 18.05 вечер):
1. `mcp_pw ↔ sk_parallel` — Playwright «Browser is already in use» (квирк #2). Смягчён
квирком #95 (профиль per-directory → worktrees не конфликтуют), same-dir parallel
остаётся.
1. ~~`mcp_pw ↔ sk_parallel`~~**🟢 закрыт**: квирк #95 (профили per-cwd hash → worktrees
не конфликтуют) + Pravila §15.2 claim для same-dir parallel. Текст nd() в карте
ссылался на «квирк #2», но memory[#2] — это taskkill, не Playwright; реальный источник
— квирк #95 (опровергает hypothesis shared-browser).
2. `ruflo_memory ↔ mem_state` — два хранилища памяти не синхронизированы; ruflo-память
почти пуста (0 записей + 2 HNSW-призрака #1122).
почти пуста (0 записей + 2 HNSW-призрака #1122). **После изоляции 18.05 — dormant.**
3. `ruflo_daemon ↔ ag_pest` — daemon worker-jitter усиливает Pest-квирки 73/77.
**После изоляции 18.05 — dormant** (daemon stopped, dump.pm2=[]).
**Системное наблюдение: 2 из 3 ⚫ — ruflo.** Плюс рой idle (0 задач), демон с известным
jitter-вредом для Pest, память-пустышка. ruflo — главный источник рантайм-трения при
near-zero отдаче: реально работают только recall-хук и queen-триггер.
**Системное наблюдение: оба оставшихся ⚫ — ruflo, оба dormant.** Реальное runtime-трение
— ноль. ruflo сохранён как артефакт, queen-триггер dormant, артефакты можно реактивировать
по плану в `feedback_ruflo_isolated.md`.
### Ось 3 — корректность routing (задача→узел)