Compare commits

...

27 Commits

Author SHA1 Message Date
Дмитрий 515acb654c fix(adt): renumber cross-refs v1.27→v1.28 / v2.14→v2.15 after rebase
Ветка ребейзнута на parallel-sessions §15 — Pravila v1.27 и CLAUDE.md
v2.14 параллельно заняты §15-эпиком, перенумеровано Pravila→v1.28 /
CLAUDE.md→v2.15. Sync cross-refs: Tooling §0+§13 footer, PSR_v1 §0
entry, automation-graph rule-labels (pravila/claude_md узлы),
+rebase-девиация note в plan. Tooling v2.14 / PSR_v1 v3.13 — без
изменений (§15 их не трогал).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 11:46:30 +03:00
Дмитрий 7bc9ded118 docs(adt): CLAUDE.md v2.15 — register #56-#60 (rebased onto parallel-sessions §15)
Пересоздан после ребейза на parallel-sessions §15 (origin/main 781a59c).
v2.14 параллельно занят §15 — перенумеровано v2.14→v2.15: §3 title/§1 row
55→60, §3.3 +5 строк #56-#60 + footer 14 off-phase подкатегорий, §0
cross-refs Pravila v1.28 / PSR_v1 v3.13 / Tooling v2.14, §6 +абзац, §9 +запись.
Прямой Edit — worktree-constraint эксцепшн §5 п.10.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 11:42:53 +03:00
Дмитрий 30d1a3c756 docs(adt): Pravila v1.28 — §13.2 +Off-phase authoring-tooling + dev-support
Пересоздан после ребейза feat/anthropic-dev-tooling на parallel-sessions
§15 (origin/main 781a59c). v1.27 параллельно занят §15 — перенумеровано
v1.27→v1.28: §13.2 +абзац (тринадцатая off-phase подкатегория
authoring-tooling #56-#58 + четырнадцатая dev-support #59-#60),
+«Что изменилось в v1.28» блок, +§13 history-row.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 11:39:01 +03:00
Дмитрий 7e167cf943 fix(map): adt — dedup psr_v1 edges (remove 4 stale iter7 duplicates superseded by ADT-block) 2026-05-18 11:35:47 +03:00
Дмитрий cb5bb7dbaf feat(map): adt — register #56-#60 in nd(), 5 edges to psr_v1, hookify conflict 🔴🟢, rule labels v2.14 2026-05-18 11:35:47 +03:00
Дмитрий 942f5364e8 docs(adt): PSR_v1 v3.13 — R10.1 Блок 1 +5 строк (skill-creator/plugin-dev/hookify/claude-code-setup/context7) + hookify HK1 pre-check 2026-05-18 11:35:34 +03:00
Дмитрий fcba06172a docs(adt): Tooling Прил. Н v2.14 — register #56-#60 (authoring-tooling + dev-support) 2026-05-18 11:35:34 +03:00
Дмитрий 947290f1dc docs(adr): ADR-010 — Anthropic dev-tooling formalization decision 2026-05-18 11:35:34 +03:00
Дмитрий 14f405a84a docs(adt): brainstorming spec + implementation plan — Anthropic dev-tooling formalization 2026-05-18 11:35:34 +03:00
Дмитрий 781a59cbf6 chore(sessions): release parallel-sessions-coordination session
status: in-progress → closed-b1765e9
+version-claim CLAUDE.md 2.13 → 2.14 (был пропущен в initial claim)

Все 8 task'ов плана исполнены и merged в origin/main FF
(b40f2c8..b1765e9, 10 commits). Pre-push регрессия GREEN (gitleaks
full-history 0 leaks / 5/5 hook tests / lychee 0 errors на моих файлах).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 10:47:27 +03:00
Дмитрий b1765e98f7 feat(skills): subagent-driven-development project wrapper + git-safety-checklist
Project-local обёртка над marketplace-скилом superpowers:subagent-driven-development.
Добавляет обязательный pre/post-subagent git-safety verify-протокол
per Pravila §15.1 (Sprint 6 прецедент-источник: Haiku-субагенты
угнали ветку параллельной сессии).

Состав:
- SKILL.md — точка входа, ссылка на marketplace + §A/§B/§C из checklist.
- references/git-safety-checklist.md — pre-spawn / post-subagent / red-flags / GIT REPORT format / code-review boundary.

Хук tools/subagent-prompt-prefix.mjs — первая линия защиты (auto-inject),
этот checklist — вторая линия (контроллер verify).

cspell-words.txt: +ревьюить +инвокацией (§E git-safety-checklist / SKILL.md).

Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md §5.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 10:43:06 +03:00
Дмитрий c2c9210317 chore(hooks): register subagent-prompt-prefix PreToolUse Task hook
Регистрирует tools/subagent-prompt-prefix.mjs как PreToolUse-хук
matcher:'Task'. JSON валиден (node -e JSON.parse OK).

Хук становится LIVE для всех будущих Task-инвокаций — auto-inject
SUBAGENT GIT-SAFETY HEADER (cwd/branch/HEAD/worktree-root + rules 1-5)
per Pravila §15.1.

End-to-end smoke verified at next Task dispatch (Task 7 плана —
wrapper-skill subagent-driven-development).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 10:38:22 +03:00
Дмитрий 07eacdbceb docs(claude-md): v2.14 — sync Pravila §15 cross-refs (§0 + §1 footer + §9 entry)
3 точечные правки + version bump:

1. §0 cross-ref row Pravila: v1.26 → v1.27 (lead narrative обновлён,
   v1.26 → 'наследие'-секция).
2. §1 priority chain: новый footer-абзац 'Hard-rules вне §9 «Отступления»'
   — упоминает §12 (Superpowers), §14 (Ruflo Queen), §15 (параллельные
   сессии); все три explicit override-floor под §9.
3. §9 история версий: запись v2.14 с описанием parallel-sessions
   coordination scope (spec + plan + 4 связанных артефакта на ветке).

Шапка v2.13 → v2.14, v2.13 преобразован в 'наследие'-секцию.

Sibling commits на feat/parallel-sessions-coordination (Tasks 1/2/3/4
плана): 83a8d58 (Pravila §15) + 1ab84d8 (docs/sessions/) + 049eaf0
(TDD red) + 78bae4a (TDD green) + ef5da8d (Windows-compat test fixup).

Через /claude-md-management:claude-md-improver (§5 п.10).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 10:29:51 +03:00
Дмитрий ef5da8def8 test(hooks): fix test 5 Windows-compat — PATH=nodeDir not PATH=''
Previous test 5 stripped PATH entirely, which kills node.exe spawn resolution
on Windows (CreateProcess needs PATH to find node). Changed to set PATH to
node's own directory only — node spawns fine, git is not in node-dir → ENOENT
→ hook fail-opens per spec §4.5.

All 5 tests now pass cross-platform.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 10:18:54 +03:00
Дмитрий 78bae4addf feat(hooks): subagent-prompt-prefix — PreToolUse git-safety inject (TDD green)
Per Pravila §15.1 — инжектит cwd/branch/HEAD/worktree-root + правила
поведения в каждый Task-prompt. FAIL-OPEN на любой ошибке (git
не в PATH, malformed stdin, non-Task tools).

Все 5 тестов из subagent-prompt-prefix.test.mjs PASS.
Регистрация в .claude/settings.json — Task 6 плана.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 10:17:04 +03:00
Дмитрий 049eaf0dfc test(hooks): subagent-prompt-prefix — failing tests (TDD red)
5 тестов для Task git-safety inject хука:
- inject SUBAGENT GIT-SAFETY HEADER в Task-prompt
- inject real cwd/branch/HEAD/worktree-root
- passes through non-Task tools
- fail-open on malformed stdin
- fail-open when git unavailable

Tests FAIL — hook implementation в следующем коммите (TDD green-phase).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 10:13:27 +03:00
Дмитрий 1ab84d8038 feat(sessions): CURRENT.md + README — заявочный лог параллельных Claude-сессий
Создаём docs/sessions/ — координация per Pravila §15.2 (claim/check/release
жизненный цикл, конфликт-резолюция). CURRENT.md содержит текущую сессию
parallel-sessions-coordination + retro-claim записи для существующих
активных worktrees (16 user-sessions на 2026-05-18; 2 locked agent-* worktrees
исключены — не user-сессии).

Backfill scope/version-claims заполнен best-effort; активные сессии
обновят свой блок при возобновлении работы.

+cspell-words: парсится (валидная транслитерация).

Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 10:08:51 +03:00
Дмитрий 83a8d58096 feat(pravila): §15 hard-rule — параллельные сессии (субагенты+git, нормативка+pre-flight sync)
Bump Pravila v1.26 → v1.27 + §10 changelog entry. §15 третье hard-rule
после §12 (Superpowers) и §14 (Ruflo Queen). §15 лечит два класса
инцидентов параллельных Claude-сессий — субагенты путают ветки/worktree
(Sprint 6) и нормативка/MEMORY дрейфует (Tooling v2.11 collision 17.05.2026).

Cross-refs to CLAUDE.md §1 — отдельная правка через
/claude-md-management:claude-md-improver (Task 5 плана).

Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md
Plan: docs/superpowers/plans/2026-05-18-parallel-sessions-coordination.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 09:59:19 +03:00
Дмитрий 8dbdd5aac0 docs(superpowers): parallel sessions coordination — implementation plan
8 atomic tasks per spec 2026-05-18-parallel-sessions-coordination-design.md:
1. Pravila §15 hard-rule (15.1 субагенты+git, 15.2 нормативка+pre-flight, 15.3 cross-refs) + v1.26→v1.27.
2. docs/sessions/ — README + CURRENT.md с retro-claim для 16 worktrees.
3. tools/subagent-prompt-prefix.test.mjs — TDD red-фаза (5 тестов).
4. tools/subagent-prompt-prefix.mjs — TDD green (PreToolUse Task auto-inject).
5. CLAUDE.md cross-ref через /claude-md-management:claude-md-improver (§5 п.10).
6. .claude/settings.json — регистрация хука matcher:'Task'.
7. .claude/skills/subagent-driven-development/ — wrapper-skill + git-safety-checklist.
8. Final regression + push (manual /push gate).

Все шаги с exact paths, exact commands, expected outputs.
TDD red→green разнесён по двум task'ам (3 → 4) с RED-коммитом между.

Branch: feat/parallel-sessions-coordination (от origin/main b40f2c8).
Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 09:51:29 +03:00
Дмитрий 235b1d4e8c docs(superpowers): parallel sessions coordination — design spec
Brainstorm (экономия 5%) с Дмитрием: лечим два класса инцидентов параллельных сессий —
(A) субагенты теряются между worktree (Sprint 6 паттерн);
(B) нормативка/MEMORY дрейфует (Tooling v2.11 collision 17.05.2026).

Решение из 4 артефактов, 0 новых плагинов/MCP:
1. Pravila §15 (новое hard-rule): §15.1 субагенты+git (Sonnet/Opus only),
   §15.2 нормативка+pre-flight sync (фиксированный список 8 файлов).
2. docs/sessions/CURRENT.md — заявочный лог активных сессий + claim/check/release.
3. .claude/hooks/subagent-prompt-prefix.mjs — PreToolUse-хук, инжектит cwd/branch/HEAD заголовок в каждый Task-prompt.
4. Verify-протокол в скиле subagent-driven-development — pre/post-subagent чеклист
   + обязательный GIT REPORT блок от субагента.

Acceptance в §8 spec'а. Spec — черновик → ревью заказчика → writing-plans.

+cspell-words: коммитит / инвокейшн / парсимый (валидные транслитерации).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 09:40:10 +03:00
Дмитрий b40f2c8ffb feat(map): discovery_interview node — discovery-tooling, E5 section
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 07:35:36 +03:00
Дмитрий 63337b418d docs(discovery): process-analysis — reciprocal SKIP boundary to discovery-interview
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 07:28:34 +03:00
Дмитрий 2ebc776cc9 docs(discovery): register discovery-tooling — Tooling/PSR/Pravila/CLAUDE.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 06:37:16 +03:00
Дмитрий a0691e8857 docs(discovery): ADR-009 — discovery-interview tooling decision
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 06:24:51 +03:00
Дмитрий 50fc188f01 feat(discovery): add docs/discovery — README + brief/snapshot templates
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 06:23:42 +03:00
Дмитрий 14f92d5147 feat(discovery): add discovery-interview skill — FEATURE + SYSTEM modes
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 06:22:08 +03:00
Дмитрий 802cda1b34 docs(discovery): brainstorming spec + integration plan
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 05:28:58 +03:00
28 changed files with 3343 additions and 42 deletions
+9
View File
@@ -64,6 +64,15 @@
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; const pd=process.env.CLAUDE_PROJECT_DIR||''; const path=require('path'); if (f && pd && path.resolve(f) === path.resolve(pd, 'CLAUDE.md')) { process.stderr.write('\\n[hook] WARNING: Direct edit of root CLAUDE.md detected. Per CLAUDE.md §5 п.10, prefer /claude-md-management:revise-claude-md or /claude-md-management:claude-md-improver. If invoked via that skill, this warning is informational.\\n'); }\""
}
]
},
{
"matcher": "Task",
"hooks": [
{
"type": "command",
"command": "node \"C:/моя/проекты/портал crm/Документация/tools/subagent-prompt-prefix.mjs\""
}
]
}
],
"PostToolUse": [
+142
View File
@@ -0,0 +1,142 @@
---
name: discovery-interview
description: Структурированное интервью-discovery ПЕРЕД проектированием. Два режима. FEATURE — заказчик описывает проблему, боль или цель без готового решения («менеджеры жалуются на…», «сделки теряются», «хочу чтобы…»): JTBD-интервью вскрывает проблему до решения и отдаёт discovery-brief в brainstorming. SYSTEM — запрос ориентации по проекту («сориентируй», «где мы сейчас», «что в тулчейне / на карте», «catch-up по…»): синтез по мета-слою (карта, CLAUDE.md, MEMORY, Открытые_вопросы, Tooling, git log). SKIP — чёткий директив на реализацию («интегрируй X», «закрой находку Y», «поправь Z»): это не discovery. SKIP — анализ бизнес-процесса из кода или диагностика просадки измеримой метрики/конверсии («как устроен процесс X», «process discovery», «где узкое место», «почему просела конверсия»): это skill process-analysis. Используй при «discovery interview», «проведи discovery», «сориентируй по проекту» и при расплывчатом проблемном запросе, даже если слово «discovery» не названо.
---
# Discovery Interview
Структурированное интервью, которое вскрывает **проблему** прежде, чем кто-либо
начнёт проектировать решение. Два режима — FEATURE (интервью заказчика перед
фичей) и SYSTEM (интервью-ориентация по состоянию проекта).
Зачем скил существует: запрос вида «менеджеры жалуются на X» или «хочу, чтобы Y» —
это симптом, не задача. Уйдёшь сразу в дизайн — спроектируешь решение не той
проблемы. Discovery interview удерживает разговор в проблемном поле ровно столько,
сколько нужно, чтобы понять *настоящую* потребность, и только потом передаёт
эстафету проектированию.
## Когда какой режим
| Запрос | Действие |
|---|---|
| Заказчик описал проблему / боль / цель без решения | режим **FEATURE** |
| Заказчик просит сориентировать по проекту | режим **SYSTEM** |
| Заказчик дал чёткий директив («сделай X», «интегрируй Y») | скил не нужен — работай напрямую |
| Вопрос про устройство бизнес-процесса из кода | скил `process-analysis`, не этот |
## Несущий принцип — три слоя-источника
Этот скил соседствует со скилом `process-analysis` (раздел C10 карты). Чтобы не
дублировать его, способности разведены по **слою данных**, с которым работают:
| Способность | Слой-источник | Метод |
|---|---|---|
| `process-analysis` | app-код — `routes/`, `app/Jobs`, `audit_*` | реконструкция бизнес-процесса из кода |
| discovery-interview **FEATURE** | голова заказчика | интервью человека |
| discovery-interview **SYSTEM** | мета-слой — карта, CLAUDE.md, MEMORY, Открытые_вопросы, Tooling, git log | интервью + синтез |
Правило разведения: если ответ добывается **чтением кода** — это `process-analysis`.
Если ответ лежит в голове заказчика или в управляющих документах — это
discovery-interview.
## Режим FEATURE
### Триггер
Заказчик описывает проблему, боль, раздражение или цель — но НЕ готовое решение.
Признаки: «менеджеры жалуются…», «X теряется», «неудобно делать Y», «хочу, чтобы…»,
«было бы хорошо, если…».
### SKIP
Не запускай FEATURE, если запрос — чёткий директив на реализацию: «интегрируй X»,
«закрой находку Y», «поправь Z», «добавь endpoint». Проблема уже понята заказчиком,
discovery только затормозит. Работай напрямую — или через `brainstorming`, если
дизайн решения нетривиален.
Не запускай FEATURE и если запрос — **диагностика просадки измеримой метрики или
конверсии** («почему падает конверсия B2», «где теряем в воронке», «почему лиды не
доходят до оплаты»). Ответ там добывается анализом кода и audit-данных — это скил
`process-analysis`. FEATURE — про UX-боль и желаемые возможности, не про диагностику
чисел.
### Процесс
1. **Один вопрос за раз.** Не вываливай список — это интервью, не анкета. Ответ на
первый вопрос определяет второй.
2. **Спрашивай про прошлое поведение, не про гипотетику.** «Расскажи, как ты делал
это в последний раз» сильнее, чем «как бы ты хотел». Люди плохо предсказывают
своё поведение и точно помнят прошлое.
3. **Копай до корня — «5 почему».** Первая названная проблема обычно симптом.
4. **Не задавай наводящих вопросов.** «Тебе мешает отсутствие фильтра?» подсказывает
ответ. Спроси открыто: «что именно замедляет тебя на этом экране?».
5. **Поняв проблему — собери discovery-brief и остановись.** Не проектируй решение —
это работа `brainstorming`.
Банк вопросов по шагам JTBD — `references/jtbd-questions.md`.
### Артефакт — discovery-brief
Проблема · JTBD (какую работу заказчик «нанимает» решение сделать) · Текущий обходной
путь · Цена боли (время / деньги / частота) · Сигнал успеха (как поймём, что закрыто)
· Ограничения. Шаблон — `docs/discovery/templates/discovery-brief.md`.
### Хэндофф
discovery-brief — это вход для `brainstorming`. Передай brief как готовую проблемную
секцию: `brainstorming` берёт её и переходит к решению — он **не перезадаёт** уже
выясненные вопросы. discovery-interview отвечает за «что за проблема», brainstorming —
за «что построим». Отдельным файлом FEATURE-brief не сохраняется — он вливается в
спеку brainstorming.
## Режим SYSTEM
### Триггер
Заказчик просит сориентировать его по состоянию проекта: «сориентируй», «где мы
сейчас», «что у нас по X», «что в тулчейне / на карте», «catch-up».
### SKIP
Не запускай SYSTEM, если вопрос про устройство **бизнес-процесса** («как устроен
процесс сделок», «process discovery», «где узкое место в воронке») — это скил
`process-analysis`, он читает код. SYSTEM отвечает на «где мы в проекте», не «как
работает процесс X».
### Процесс
1. **Короткое уточнение scope** — что именно ориентировать? Весь проект, конкретный
раздел, тулчейн, открытые вопросы? Без scope ответ будет рыхлым.
2. **Синтез по мета-слою:** карта `docs/automation-graph.html`, `CLAUDE.md`, MEMORY,
`docs/Открытые_вопросы_*.md`, `docs/Tooling_*.md`, `git log`.
3. **Запрет:** не читай `app/`-код для реконструкции процессов — это исключительный
метод `process-analysis`. SYSTEM работает только с мета-слоем.
4. **Выдай синтез**, а не пересказ документа целиком — ответ на запрос ориентации с
пинами на источники.
### Артефакт — system-snapshot
Если ориентация существенная — сохрани `docs/discovery/YYYY-MM-DD-<тема>.md` по
шаблону `docs/discovery/templates/system-snapshot.md`. Мелкий устный ответ файла не
требует.
## JTBD-дисциплина (общая для обоих режимов)
- **Один вопрос за раз** — интервью, не анкета.
- **Прошлое, не гипотетика** — «когда это случилось в последний раз?».
- **«5 почему»** — корень, не симптом.
- **Не наводи** — открытые вопросы, без подсказанного ответа.
- **Слушай, не защищай** — если заказчик критикует существующее, не оправдывай его,
копай дальше.
## Границы
- **`brainstorming`** — проектирование решения. discovery-interview вскрывает проблему
и передаёт brief; brainstorming проектирует. Не дублируй его вопросы.
- **`process-analysis`** (раздел C10) — анализ as-is бизнес-процесса из кода и
диагностика метрик/конверсии. Если ответ требует чтения `routes/` / `app/Jobs` /
`audit_*` или расчёта метрик процесса — это `process-analysis`, не этот скил.
- **`audit-portal`** — качественный вердикт о здоровье портала. SYSTEM даёт
ориентацию («где мы»), не вердикт («здорово ли»).
- **Интервью конечных пользователей Лидерры** — вне этого скила (defer post-Б-1; для
методологии user research — `design:user-research`).
@@ -0,0 +1,26 @@
{
"skill_name": "discovery-interview",
"note": "Триггер-eval: should_trigger=true → должен вызваться discovery-interview; false → должен сработать другой инструмент (expected_skill). Особое внимание — near-miss к process-analysis (C10).",
"evals": [
{ "id": 1, "should_trigger": true, "expected_skill": "discovery-interview/FEATURE", "prompt": "менеджеры жалуются что не видят, какие сделки сегодня надо обзвонить — каждое утро роются в фильтрах вручную" },
{ "id": 2, "should_trigger": false, "expected_skill": "process-analysis", "prompt": "у меня ощущение что лиды из B2 проседают по конверсии, но не пойму почему — хочу разобраться" },
{ "id": 3, "should_trigger": true, "expected_skill": "discovery-interview/FEATURE", "prompt": "хочу чтобы поставщики сами видели свой баланс, а то постоянно пишут в поддержку спрашивают" },
{ "id": 4, "should_trigger": true, "expected_skill": "discovery-interview/FEATURE", "prompt": "проведи discovery interview по идее напоминаний — я пока сам не уверен что именно нужно" },
{ "id": 5, "should_trigger": true, "expected_skill": "discovery-interview/FEATURE", "prompt": "не нравится как сейчас сделана выгрузка отчётов, неудобно, давай покопаем что не так" },
{ "id": 6, "should_trigger": true, "expected_skill": "discovery-interview/FEATURE", "prompt": "клиенты часто отваливаются на этапе оплаты, надо понять что там за проблема" },
{ "id": 7, "should_trigger": true, "expected_skill": "discovery-interview/SYSTEM", "prompt": "сориентируй меня — где мы сейчас по проекту, что закрыто что нет" },
{ "id": 8, "should_trigger": true, "expected_skill": "discovery-interview/SYSTEM", "prompt": "что у нас вообще в тулчейне по безопасности, я запутался" },
{ "id": 9, "should_trigger": true, "expected_skill": "discovery-interview/SYSTEM", "prompt": "вернулся после недели отсутствия, сделай catch-up что произошло по проекту" },
{ "id": 10, "should_trigger": true, "expected_skill": "discovery-interview/SYSTEM", "prompt": "что там на карте в разделе биллинга, какие узлы" },
{ "id": 11, "should_trigger": false, "expected_skill": "process-analysis", "prompt": "как устроен процесс обработки сделки от создания до закрытия — пройди по коду" },
{ "id": 12, "should_trigger": false, "expected_skill": "process-analysis", "prompt": "где узкое место в воронке лидов, какой шаг тормозит" },
{ "id": 13, "should_trigger": false, "expected_skill": "process-analysis", "prompt": "сделай process discovery по джобам импорта лидов" },
{ "id": 14, "should_trigger": false, "expected_skill": "process-analysis", "prompt": "посчитай метрики процесса: cycle time по статусам сделок" },
{ "id": 15, "should_trigger": false, "expected_skill": "directive (no skill)", "prompt": "интегрируй openapi-mcp-server в .mcp.json" },
{ "id": 16, "should_trigger": false, "expected_skill": "directive (no skill)", "prompt": "закрой находку аудита G7 по AdminBillingController" },
{ "id": 17, "should_trigger": false, "expected_skill": "systematic-debugging", "prompt": "поправь падающий тест RlsSmokeTest, он валится на teardown" },
{ "id": 18, "should_trigger": false, "expected_skill": "directive (no skill)", "prompt": "добавь endpoint POST /api/deals/{id}/archive" },
{ "id": 19, "should_trigger": false, "expected_skill": "write-spec / brainstorming", "prompt": "напиши спеку для фичи мультивалютного биллинга" },
{ "id": 20, "should_trigger": false, "expected_skill": "audit-portal", "prompt": "проведи полный аудит портала перед релизом" }
]
}
@@ -0,0 +1,45 @@
# Банк вопросов JTBD — режим FEATURE
Вопросы для discovery-интервью. Задавать **по одному**, адаптируя формулировку под
контекст. Все вопросы — про прошлое поведение, без подсказанного ответа.
## 1. Вскрыть проблему
- Расскажи, что произошло в последний раз, когда [ситуация]?
- Что именно тебя в этом раздражало или замедляло?
- Как часто это случается?
## 2. Текущий обходной путь
- Как ты решаешь это сейчас?
- Что делаешь, когда [проблема] происходит?
- Кто ещё это делает и как?
## 3. Цена боли
- Сколько времени это съедает за неделю?
- Что случается, если не сделать это вовремя?
- Были случаи, когда из-за этого что-то сорвалось?
## 4. JTBD — какую работу «нанимают» решение сделать
- Если бы это работало идеально — что бы ты перестал делать руками?
- Какого результата ты на самом деле добиваешься?
## 5. Сигнал успеха
- Как ты поймёшь, что проблема закрыта?
- Что должно стать видимо иначе?
## 6. Ограничения
- Что нельзя ломать или менять?
- Есть ли срок?
## Антипаттерны
- **Наводящий вопрос** («тебе мешает отсутствие X?») — подсказывает ответ; заказчик
согласится из вежливости.
- **Гипотетика** («как бы ты хотел?») — люди плохо предсказывают своё поведение.
- **Список вопросов разом** — это анкета, не интервью; теряется ветвление по ответам.
- **Принять первый ответ за корень** — копай «5 почему» до настоящей причины.
+6
View File
@@ -56,6 +56,12 @@ description: Анализ и оптимизация существующего
`analysis:bottleneck-detect` (PA1).
- **Продуктовые метрики** — плагин `product-management`.
- **Документ / change-request процесса** — плагин `operations`.
- **Интервью заказчика про будущую фичу / ориентация по проекту** — скил
`discovery-interview`. Тот вскрывает проблему до решения через интервью человека
(режим FEATURE) и синтезирует мета-слой проекта (режим SYSTEM); этот скил — про
вскрытие as-is процесса из app-кода. «process discovery», «как устроен процесс X»,
«где узкое место» — сюда; «проведи discovery interview», «сориентируй по проекту» —
в `discovery-interview`.
- **Генерик-методология оптимизации процесса** — скил `process-optimization`
плагина `operations`. Этот скил — про code-grounded discovery конкретного
процесса Лидерры (вскрытие as-is), не про общую методологию и не про
@@ -0,0 +1,27 @@
---
name: subagent-driven-development
description: Project-local wrapper для superpowers:subagent-driven-development — добавляет обязательный git-safety verify-протокол per Pravila §15.1. Использовать вместо marketplace-варианта при работе с git-коммит-задачами в субагентах.
---
# Subagent-Driven Development (project wrapper)
Этот скил — проектная обёртка над marketplace-скилом `superpowers:subagent-driven-development`. Дополняет его обязательным git-safety verify-протоколом per Pravila §15.1.
## Когда использовать
Когда нужно делегировать задачу субагенту через Task tool — особенно git-коммит-задачи (Sprint 6 прецедент: Haiku-субагенты угнали ветку параллельной сессии).
## Что делать
1. **Откройте marketplace-скил** `superpowers:subagent-driven-development` для общего workflow (fresh subagent per task + two-stage review).
2. **Перед каждой Task-инвокацией** прочитайте и выполните pre-spawn-чеклист — [references/git-safety-checklist.md](references/git-safety-checklist.md) §A.
3. **После каждой Task-инвокации** прочитайте и выполните post-subagent-чеклист — там же §B.
4. **Hard-rule §15.1** — git-коммит-задача = модель Sonnet/Opus, никогда Haiku. Read-only git-операции (`log`, `status`, `diff`, `rev-parse`, `branch --show-current`, `worktree list`) разрешены любой модели.
Хук `tools/subagent-prompt-prefix.mjs` (зарегистрирован в `.claude/settings.json`) автоматически инжектит git-safety заголовок в каждый Task-prompt — это **первая** линия защиты. Чеклист из этого скила — **вторая** линия (защита со стороны контроллера).
## Cross-refs
- Pravila §15.1 — hard-rule субагенты + git.
- Spec: `docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md` §5.
- Memory: `memory/feedback_subagent_git_reliability.md`.
@@ -0,0 +1,65 @@
# Git-safety Checklist для контроллера субагентов
Per Pravila §15.1 — выполнять каждый раз при делегировании задачи через Task tool.
## §A. Pre-spawn чеклист (до Task-инвокации)
1. **Резолвите 4 значения** (запишите у себя для post-check):
```bash
git branch --show-current # → ожидаемая ветка
git rev-parse HEAD # → pre-spawn parent SHA
git rev-parse --show-toplevel # → worktree root
pwd # → cwd
```
2. **Выберите модель** субагенту:
- Задача требует `git commit`/`push`/`stage`/`checkout`/`switch`/`merge`/`rebase`? → **Sonnet или Opus**, никогда Haiku (§15.1).
- Только read-только `git log`/`status`/`diff`/`rev-parse` ИЛИ только Edit/Read/Grep? → любая модель.
3. **Если задача правит нормативку из списка §15.2** (Pravila / CLAUDE.md / Tooling / PSR_v1 / MEMORY.md / Открытые_вопросы / docs/adr/* / db/schema.sql):
```bash
git fetch origin && git log HEAD..origin/main --oneline
```
Не пусто → **ребейз/merge до инвокации**, не после. Pre-flight также проверить `docs/sessions/CURRENT.md` на конфликт scope-files / version-claims.
## §B. Post-subagent чеклист (сразу после возврата субагента)
1. **`git rev-parse HEAD`** — сравнить с pre-spawn parent SHA.
- Равно → субагент не коммитил (OK для Edit-задач без commit).
- Отличается ровно одним коммитом, чей parent = pre-spawn HEAD → OK для commit-задач.
- **Иначе → STOP, разбор инцидента.**
2. **`git branch --show-current`** — сравнить с pre-spawn branch.
- Не равно → **STOP, разбор инцидента** (Sprint 6 паттерн).
3. **`git log -1 --format='%s%n%P'`** — проверить subject + parent последнего коммита.
- Subject соответствует задаче?
- Parent = pre-spawn HEAD?
4. Если несколько коммитов — ручная проверка subject'ов каждого.
## §C. Red-flag-список — любой = hard-stop разбор
- `branch ≠ ожидаемая`;
- `parent коммита ≠ pre-spawn HEAD` (висячий коммит / попадание на чужую ветку);
- HEAD двинулся, но субагент в отчёте об этом не упомянул;
- в diff'е есть файлы вне scope задачи.
## §D. Обязательный формат отчёта субагента
Субагент в конце ответа выписывает блок:
```
=== GIT REPORT ===
cwd: <pwd>
branch: <git branch --show-current>
HEAD: <git rev-parse HEAD>
HEAD^: <git rev-parse HEAD^>
status: <git status --short>
=== END GIT REPORT ===
```
Отсутствие блока = контроллер считает результат недостоверным и запускает §B-чеклист сам через Bash.
## §E. Соотношение с code-review
Двухстадийное review (Pravila §4.5 / PSR_v1 R10) сохраняется. Git-safety-чеклист **не заменяет** code-review — он стоит **до** него (нет смысла ревьюить diff, если он не в той ветке).
+25 -7
View File
File diff suppressed because one or more lines are too long
+21
View File
@@ -1407,3 +1407,24 @@ czlonkowski
# C10 normative sync vocabulary (2026-05-17)
линтуются
# discovery-interview integration — spec/plan/skill (2026-05-18)
JTBD
триггерится
фичу
фичей
гипотетика
гипотетику
гипотетики
хэндофф
тулчейне
пинами
evals
# parallel-sessions-coordination spec (2026-05-18)
коммитит
инвокейшн
парсимый
парсится
ревьюить
инвокацией
+15 -2
View File
@@ -1,8 +1,12 @@
# Plugin Stack Rules — Superpowers + Frontend Design (v3.11)
# Plugin Stack Rules — Superpowers + Frontend Design (v3.13)
**Дата:** 17.05.2026
**Дата:** 18.05.2026
**Назначение:** свод правил совместного использования плагинов Claude Code в проекте Лидерра — paired-stack ядро `obra/superpowers` (14 skills) + `anthropics/frontend-design`, плюс расширенный пул UI-инструментов `ui-ux-pro-max` (skill, marketplace `nextlevelbuilder/ui-ux-pro-max-skill`) и `21st.dev Magic MCP` (MCP-сервер `magic`), плюс инфраструктурный `claude-md-management` (skills, marketplace `anthropics/claude-plugins-official`), плюс **debug-runtime MCP** `@sentry/mcp-server` + `@modelcontextprotocol/server-redis` (v2.1+, R10.1 Блок 3).
**v3.13** — Anthropic dev-tooling: R10.1 Блок 1 +5 строк таблицы — **skill-creator** (#56) / **plugin-dev** (#57) / **hookify** (#58) / **claude-code-setup** (#59) / **context7** (#60) — 5 Anthropic-плагинов из `anthropics/claude-plugins-official`, уже включённых в `~/.claude/settings.json` `enabledPlugins` user-level без формализации (L1-паттерн). +note (v3.13). Новые 13-я (**authoring-tooling** — #56-#58) и 14-я (**dev-support** — #59-#60) off-phase подкатегории — не UI → вне R6.0/R6.1/R14. **hookify HK1** — hard-rule pre-check на коллизию с economy/skill-discipline хуками; закрывает 🔴-конфликт карты `hookify_plugin ↔ hk_pre_claude`. Содержательных изменений R0–R14: 0. ADR-010. Связано: Tooling v2.14, Pravila v1.28, CLAUDE.md v2.15; план `docs/superpowers/plans/2026-05-18-anthropic-dev-tooling-formalization.md`.
**v3.12** — discovery-interview: R10.1 Блок 1 +note (v3.12) — **discovery-interview** (Tooling #55, self-authored project-скил `.claude/skills/discovery-interview/`, как process-modeling/process-analysis; режимы FEATURE + SYSTEM). Новая 12-я off-phase подкатегория **discovery-tooling** (§4.30) — не UI → вне R6.0/R6.1/R14. Содержательных изменений R0–R14: 0. Связано: Tooling v2.13, Pravila v1.26, CLAUDE.md v2.13; план `docs/superpowers/plans/2026-05-18-discovery-interview-integration.md`.
**v3.11** — C10 business-process: R10.1 Блок 1 +1 строка **operations** (`operations@knowledge-work-plugins` v1.2.0, Anthropic Verified, 9 скилов, marketplace-плагин) + Блок 1 note (v3.11) — **process-modeling** + **process-analysis** (self-authored project-скилы `.claude/skills/`) + Блок 3 +1 строка **n8n-mcp** (DEFERRED — workflow-движок n8n, у портала нет n8n). Новая 11-я off-phase подкатегория **business-process** (Tooling #51-54, раздел C10 карты) — не UI → вне R6.0/R6.1/R14, как architecture-tooling/audit-security/ml-ai-tooling. Содержательных изменений R0–R14: 0. Связано: Tooling v2.12, Pravila v1.25, CLAUDE.md v2.12; план `docs/superpowers/plans/2026-05-17-c10-business-process-tooling-integration.md`.
**v3.10** — A11 ml-ai-tooling: R10.1 Блок 3 +1 строка **Jupyter MCP** (DEFERRED — требует Python ML-окружения; ml-ai-tooling, off-phase, раздел A11 карты) + Блок 1 note (v3.10) — **promptfoo** (npm devDependency `promptfoo`, CLI-eval LLM-промптов) + **Data Scientist skill** (вендоренный сторонний скил `.claude/skills/data-scientist/`). Десятая off-phase подкатегория ml-ai-tooling. Не UI → вне R6/R14. Содержательных изменений R0–R14: 0. Связано: Tooling v2.10, Pravila v1.24, CLAUDE.md v2.10; план `docs/superpowers/plans/2026-05-17-a11-ml-ai-tooling-integration.md`.
@@ -416,6 +420,11 @@ Stack — **головной**. Все плагины вне stack'а — **ин
| **product-management** *(6 команд `/write-spec`, `/roadmap-update` и др.)* | `anthropics/knowledge-work-plugins` (plugin `product-management@knowledge-work-plugins`, Anthropic Verified) | product-strategy церемонии (problem→spec, roadmap, stakeholder updates, research synthesis, competitive analysis, metrics review). Категория: **project-management** (Tooling #42). 0 хуков | при product-strategy work: написание спеки, обновление роадмапа, анализ конкурентов. Не UI → вне R6.0/R6.1/R14 |
| **Design plugin** *(Design Critique / Accessibility Audit / UX Writing / Research Synthesis)* | `anthropics/knowledge-work-plugins` (Anthropic Verified) | дизайн-критика и UX — ревью макетов, дизайн-уровневый a11y-аудит, UX-копирайт, research synthesis. Категория: **design-tooling** (Tooling #46, вне UI-пула) | при дизайн-критике макета, UX-анализе, написании микрокопирайта — pre-code (ADR-006). Не подменяет FD #30 (генерация) и `requesting-code-review`. Не UI → вне R6.0/R6.1/R14 |
| **operations** *(9 skills: `process-doc` / `process-optimization` / `change-request` / `capacity-plan` / `compliance-tracking` / `risk-assessment` / `runbook` / `status-report` / `vendor-review`)* | `anthropics/knowledge-work-plugins` (plugin `operations@knowledge-work-plugins` v1.2.0, Anthropic Verified) | бизнес-процессы — документирование процесса, оптимизация, change-management, capacity-планирование. Категория: **business-process** (Tooling #51, вне UI-пула). 0 lifecycle-хуков | при работе с бизнес-процессом — документирование/оптимизация/change-request/capacity. Не UI → вне R6.0/R6.1/R14 |
| **skill-creator** *(1 skill)* | `anthropics/claude-plugins-official` (Anthropic Verified) | конструктор скилов — создание standalone-скилов с нуля, модификация, performance-eval/benchmark, оптимизация `description` под триггеринг. Категория: **authoring-tooling** (Tooling #56, вне UI-пула) | при создании нового **standalone** проектного скила. SC1 — граница с plugin-dev:skill-development (скилы внутри плагина); SC2 — вендоренные/self-authored скилы правятся прямым Edit, не через skill-creator (риск потери провенанса). Не UI → вне R6.0/R6.1/R14 |
| **plugin-dev** *(8 skills + агенты `agent-creator` / `plugin-validator` / `skill-reviewer`)* | `anthropics/claude-plugins-official` (Anthropic Verified) | конструктор Claude-плагинов — структура / агенты / скилы / команды / хуки / MCP-интеграция / settings. Категория: **authoring-tooling** (Tooling #57) | при разработке собственного marketplace-плагина. PD1 — не для модификации вендоренного/self-authored (SC2); PD3 — `plugin-dev:hook-development` генерирует хук → применяется правило HK1. Не UI → вне R6.0/R6.1/R14 |
| **hookify** *(skills `/hookify` / `/configure` / `/list` / `/help` + `writing-rules` + агент `conversation-analyzer`)* | `anthropics/claude-plugins-official` (Anthropic Verified) | генератор хуков из анализа транскриптов диалога / явных инструкций. Категория: **authoring-tooling** (Tooling #58) | **только по явному `/hookify`**, не проактивно (HK2). **HK1 hard-rule:** перед генерацией хука — обязательный pre-check на коллизию с уже-зарегистрированными хуками в `~/.claude/settings.json`; перезапись 6-компонентной economy/skill-discipline архитектуры (economy-mode / skill-marker / skill-check / state-guard / postcompact / verifier) **запрещена**; при коллизии — остановка, ручное согласование. HK3 — закрывает 🔴-конфликт карты `hookify_plugin ↔ hk_pre_claude`. Не UI → вне R6.0/R6.1/R14 |
| **claude-code-setup** *(skill `claude-automation-recommender`)* | `anthropics/claude-plugins-official` (Anthropic Verified) | рекомендатель Claude Code automations — анализ кодовой базы + советы (хуки / суб-агенты / скилы / плагины / MCP). Read-only. Категория: **dev-support** (Tooling #59, вне UI-пула) | при запросе на оптимизацию Claude Code setup. CCS1 — рекомендации фильтруются R0 stack-gate + R10.1; ничего не устанавливается без явного согласования заказчика. Не UI → вне R6.0/R6.1/R14 |
| **context7** *(MCP-tools `query-docs` / `resolve-library-id`)* | `anthropics/claude-plugins-official` (Anthropic Verified) — плагин в `enabledPlugins`, не `.mcp.json`-сервер | актуальная документация библиотек / фреймворков / SDK — отдаёт upstream-доки, обходит cutoff training data. Категория: **dev-support** (Tooling #60) | **первый выбор** для документации **известной библиотеки** (Laravel / Vue / Vuetify / Pest / React / …). CTX1 — WebFetch для конкретного URL, WebSearch — поиск без знания библиотеки. Не UI → вне R6.0/R6.1/R14 |
**Блок 1 — note (v3.3):** **mermaid-skill** (Tooling #37, генератор C4/architecture-диаграмм) — вендоренный сторонний скил в `.claude/skills/mermaid/` (`WH-2099/mermaid-skill`, MIT), **не** через marketplace и **не** в `enabledPlugins`. Пассивная утилита (генерация Mermaid-исходника), не решатель — формально вне типологии трёх блоков; регистрируется здесь для полноты. Категория **architecture-tooling**, вне R6/R14.
@@ -427,6 +436,10 @@ Stack — **головной**. Все плагины вне stack'а — **ин
**Блок 1 — note (v3.11):** **process-modeling** (Tooling #52) + **process-analysis** (Tooling #53) — self-authored project-скилы в `.claude/skills/process-modeling/` и `.claude/skills/process-analysis/`, **не** вендоренные сторонние и **не** через marketplace; написаны проектом (паттерн project-скилов `audit-portal`/`regression`). В отличие от вендоренных mermaid-skill/CCPM/Data Scientist — **линтуются** lefthook'ом (cspell+markdownlint), **не** в `cspell.json` `ignorePaths` / `.markdownlintignore` (конфликт-аудит LINT1). Категория **business-process** (раздел C10 карты), вне R6.0/R6.1/R14.
**Блок 1 — note (v3.12):** **discovery-interview** (Tooling #55) — self-authored project-скил в `.claude/skills/discovery-interview/`, **не** вендоренный сторонний и **не** через marketplace; написан проектом (паттерн project-скилов `audit-portal`/`regression`/`process-modeling`/`process-analysis`). **Линтуется** lefthook'ом (cspell+markdownlint), **не** в `cspell.json` `ignorePaths` / `.markdownlintignore` (LINT1). Категория **discovery-tooling** (12-я off-phase подкатегория), вне R6.0/R6.1/R14.
**Блок 1 — note (v3.13):** 5 Anthropic dev-плагинов — **skill-creator** (#56) / **plugin-dev** (#57) / **hookify** (#58) / **claude-code-setup** (#59) / **context7** (#60) — marketplace-плагины из `anthropics/claude-plugins-official`, включены в `~/.claude/settings.json` `enabledPlugins` user-level. Формализованы 18.05.2026 после аудита «мозга» (L1-паттерн «плагин включён без формализации» — повтор UPM/21st 10.05 и Sentry/Redis 13.05). Две новые off-phase подкатегории: **authoring-tooling** (13-я — #56-#58, создание Claude-артефактов) + **dev-support** (14-я — #59-#60, поддержка/документация Claude-разработки), не UI → вне R6.0/R6.1/R14. **hookify** несёт hard-rule HK1 (pre-check на коллизию с existing хуками). `context7` — плагин из marketplace (не `.mcp.json`-сервер Блока 3), хотя предоставляет MCP-tools. ADR-010, Tooling §4.31–§4.35.
**Отмена:** через удаление из `enabledPlugins` в `~/.claude/settings.json` или через live-override `/имя-плагина` (R0.4.B) на одно действие.
#### Блок 2: Built-in skills Claude Code (всегда доступны через `Skill` tool по `/имя`)
+62 -2
View File
@@ -1,10 +1,16 @@
# Правила работы Claude в проекте «Лидерра»
**Версия:** v1.25 (17.05.2026)
**Дата:** 17.05.2026
**Версия:** v1.28 (18.05.2026)
**Дата:** 18.05.2026
**Назначение:** настройки проекта (Project instructions) — Claude читает этот файл в каждом чате и следует правилам ниже.
**Статус документа:** ✅ утверждён. Содержимое скопировано в поле "Project instructions" Claude.ai. Файл хранится в архиве как служебный документ.
**Что изменилось в v1.28 относительно v1.27:** §13.2 +абзац «Off-phase authoring-tooling + dev-support» — формализованы 5 Anthropic dev-плагинов из `anthropics/claude-plugins-official`, уже включённых в `~/.claude/settings.json` `enabledPlugins` user-level без формализации (#56 skill-creator, #57 plugin-dev, #58 hookify — тринадцатая off-phase подкатегория authoring-tooling; #59 claude-code-setup, #60 context7 — четырнадцатая off-phase подкатегория dev-support). L1-паттерн «плагин включён без формализации» (повтор UPM/21st 10.05, Sentry/Redis 13.05). hookify несёт hard-rule HK1 — pre-check на коллизию с economy/skill-discipline хуками. Границы — ADR-010. Связано: Tooling v2.14 / PSR_v1 v3.13 / CLAUDE.md v2.15. План `docs/superpowers/plans/2026-05-18-anthropic-dev-tooling-formalization.md`.
**Что изменилось в v1.27 относительно v1.26:** +§15 hard-rule «Параллельные сессии» (15.1 субагенты+git Sonnet/Opus only, 15.2 нормативка+pre-flight sync, 15.3 cross-refs). §15 третье hard-rule после §12 и §14. Список «нормативка» — 8 позиций. Спек — `docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md`.
**Что изменилось в v1.26 относительно v1.25:** §13.2 +абзац «Off-phase discovery-tooling» — формализован скил `discovery-interview` (Tooling #55; self-authored project-скил `.claude/skills/discovery-interview/`, режимы FEATURE+SYSTEM) как двенадцатая off-phase подкатегория; как проектный скил регистрируется в §13.2, не §12.2. Границы — ADR-009 (DI1–DI6, разрез по слою-источнику с process-analysis #53). Связано: Tooling v2.13 / PSR_v1 v3.12 / CLAUDE.md v2.13. План `docs/superpowers/plans/2026-05-18-discovery-interview-integration.md`.
**Что изменилось в v1.25 относительно v1.24:** §13.2 +абзац «Off-phase business-process» — формализованы инструменты раздела C10 карты «Бизнес-процессы (общее)» (#51 operations — marketplace-плагин 9 скилов; #52 process-modeling, #53 process-analysis — self-authored project-скилы; #54 n8n-mcp — DEFERRED, у портала нет n8n) как одиннадцатая off-phase подкатегория. Границы — ADR-008. Связано: Tooling v2.12 / PSR_v1 v3.11 / CLAUDE.md v2.12. План `docs/superpowers/plans/2026-05-17-c10-business-process-tooling-integration.md`.
**Что изменилось в v1.24 относительно v1.23:** §13.2 +абзац «Off-phase ml-ai-tooling» — формализованы инструменты раздела A11 карты «ML / AI-разработка» (#48 promptfoo, #49 Data Scientist skill, #50 Jupyter MCP DEFERRED) как десятая off-phase подкатегория; promptfoo делает платные LLM-вызовы — только вручную/CI, никогда в хук (ML1). Границы — ADR-007. Связано: Tooling v2.10 / PSR_v1 v3.10 / CLAUDE.md v2.10. План `docs/superpowers/plans/2026-05-17-a11-ml-ai-tooling-integration.md`.
@@ -582,6 +588,9 @@ P0 = блокер старта спринта или регуляторного
| **v1.23** | **17.05.2026** | A3 integration-tooling: §13.2 +абзац «Off-phase integration-tooling» — формализованы инструменты раздела A3 карты «Программирование — интеграции (API, вебхуки)» (#47 `openapi-mcp-server`, Tooling §4.22; `api-docs` agent, claude-flow, без Tooling-номера) как девятая off-phase подкатегория, отдельная от всех предыдущих; не UI → вне R6.0/R6.1/R14. READ-ONLY introspection. Регулируются PSR_v1 R10.1 Блок 3. Связано: Tooling v2.9 / PSR_v1 v3.9 / CLAUDE.md v2.9. План `docs/superpowers/plans/2026-05-17-a3-integration-tooling-integration.md`. Архитектурных изменений в §§1–12 + §§13.1, 13.314: 0. |
| **v1.24** | **17.05.2026** | A11 ml-ai-tooling: §13.2 +абзац «Off-phase ml-ai-tooling» — формализованы инструменты раздела A11 карты «ML / AI-разработка» (#48 promptfoo — npm devDependency, CLI-eval LLM-промптов; #49 Data Scientist skill — вендоренный сторонний скил; #50 Jupyter MCP — DEFERRED, требует Python ML-окружения) как десятая off-phase подкатегория, отдельная от всех предыдущих; не UI → вне R6.0/R6.1/R14. promptfoo делает платные LLM-вызовы — только вручную/CI, никогда в хук (ML1). Границы — ADR-007. Связано: Tooling v2.10 / PSR_v1 v3.10 / CLAUDE.md v2.10. Через manual Edit всех 4 нормативных файлов (claude-md-management неприменим — исполнение в worktree, §5 п.10 worktree-constraint эксцепшн). План `docs/superpowers/plans/2026-05-17-a11-ml-ai-tooling-integration.md`. Архитектурных изменений в §§1–12 + §§13.1, 13.314: 0. |
| **v1.25** | **17.05.2026** | C10 business-process: §13.2 +абзац «Off-phase business-process» — формализованы инструменты раздела C10 карты «Бизнес-процессы (общее)» (#51 operations — marketplace-плагин 9 скилов; #52 process-modeling — self-authored BPMN-скил; #53 process-analysis — self-authored discovery-скил; #54 n8n-mcp — DEFERRED, workflow-движок, у портала нет n8n) как одиннадцатая off-phase подкатегория, отдельная от всех предыдущих; не UI → вне R6.0/R6.1/R14. Границы — ADR-008. Связано: Tooling v2.12 / PSR_v1 v3.11 / CLAUDE.md v2.12. Через manual Edit всех 4 нормативных файлов (claude-md-management неприменим — исполнение в worktree, §5 п.10 worktree-constraint эксцепшн — как v1.24). План `docs/superpowers/plans/2026-05-17-c10-business-process-tooling-integration.md`. Архитектурных изменений в §§1–12 + §§13.1, 13.314: 0. |
| **v1.26** | **18.05.2026** | discovery-interview: §13.2 +абзац «Off-phase discovery-tooling» — формализован скил `discovery-interview` (Tooling #55, §4.30; self-authored project-скил `.claude/skills/discovery-interview/`, режимы FEATURE+SYSTEM — интервью-discovery до проектирования) как двенадцатая off-phase подкатегория, отдельная от всех предыдущих; не UI → вне R6.0/R6.1/R14. Как проектный скил регистрируется в §13.2, **не** в §12.2 (карта Superpowers-скилов); триггер-eval 20/20. Границы — ADR-009 (DI1DI6). Связано: Tooling v2.13 / PSR_v1 v3.12 / CLAUDE.md v2.13. Через manual Edit всех 4 нормативных файлов (claude-md-management неприменим — исполнение в worktree, §5 п.10 worktree-constraint эксцепшн — как v1.24/v1.25). План `docs/superpowers/plans/2026-05-18-discovery-interview-integration.md`. Архитектурных изменений в §§1–12 + §§13.1, 13.314: 0. |
| **v1.27** | **18.05.2026** | Параллельные сессии: координация. +§15 hard-rule (15.1 субагенты+git Sonnet/Opus only, 15.2 нормативка+pre-flight sync, 15.3 cross-refs). §15 третье hard-rule после §12 и §14; список «нормативка» — 8 позиций. Лечит два класса инцидентов параллельных-сессий: (A) субагенты теряются между worktree (Sprint 6 прецедент), (B) нормативка/MEMORY дрейфует (Tooling v2.11 collision 17.05.2026). Спек — `docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md`, план — `docs/superpowers/plans/2026-05-18-parallel-sessions-coordination.md`. |
| **v1.28** | **18.05.2026** | Anthropic dev-tooling: §13.2 +абзац «Off-phase authoring-tooling + dev-support» — формализованы 5 Anthropic-плагинов из `anthropics/claude-plugins-official`, уже включённых в `~/.claude/settings.json` `enabledPlugins` user-level без формализации (#56 skill-creator / #57 plugin-dev / #58 hookify — тринадцатая off-phase подкатегория authoring-tooling; #59 claude-code-setup / #60 context7 — четырнадцатая off-phase подкатегория dev-support); не UI → вне R6.0/R6.1/R14. L1-паттерн «плагин включён без формализации» (повтор UPM/21st 10.05, Sentry/Redis 13.05). hookify несёт hard-rule HK1 — pre-check на коллизию с economy/skill-discipline хуками; закрывает 🔴-конфликт карты `hookify_plugin ↔ hk_pre_claude`. Границы — ADR-010 (SC1SC3 / PD1PD3 / HK1HK3 / CCS1 / CTX1CTX2). Связано: Tooling v2.14 / PSR_v1 v3.13 / CLAUDE.md v2.15. Через manual Edit всех 4 нормативных файлов (claude-md-management неприменим — исполнение в worktree, §5 п.10 worktree-constraint эксцепшн — как v1.24/v1.25/v1.26). **NB:** перенумеровано v1.27→v1.28 — v1.27 параллельно занят parallel-sessions §15 (origin/main `781a59c`); ветка `feat/anthropic-dev-tooling` ребейзнута на §15. План `docs/superpowers/plans/2026-05-18-anthropic-dev-tooling-formalization.md`. Архитектурных изменений в §§1–12 + §§13.1, 13.314: 0. |
---
@@ -730,6 +739,10 @@ Frontend Design и `obra/superpowers` (v5.1.0, 14 skills) — **парный sta
**Off-phase business-process (C10, v1.25, 17.05.2026):** Инструменты раздела C10 карты «Бизнес-процессы (общее)» — #51 `operations` (Tooling §4.26; marketplace-плагин `operations@knowledge-work-plugins` v1.2.0, Anthropic Verified, 9 скилов — документирование/оптимизация/change-management/capacity бизнес-процессов; 0 lifecycle-хуков), #52 `process-modeling` (Tooling §4.27; self-authored project-скил `.claude/skills/process-modeling/` — BPMN 2.0 моделирование to-be, рендер делегируется скилу `mermaid`), #53 `process-analysis` (Tooling §4.28; self-authored project-скил `.claude/skills/process-analysis/` — as-is discovery из кода Laravel, узкие места, трассировка, метрики), #54 `n8n-mcp` (Tooling §4.29; **DEFERRED** — workflow-движок платформы n8n; стек Лидерры не содержит n8n: движок процессов = очередь Laravel + события/джобы; принятие n8n = отдельное архитектурное решение; зарегистрирован как pending-слот, как Figma MCP #44 / Jupyter MCP #50). Плюс 5 reuse-кросс-ссылок (mermaid #37, architecture-patterns #38, CCPM #41, product-management #42, superpowers writing-plans) — surface в C10 через `NODE_SECTION_SECONDARY`, без новых номеров. **Одиннадцатая** off-phase подкатегория. Off-phase, не UI → вне R6.0/R6.1/R14 PSR_v1. self-authored скилы process-modeling/process-analysis **линтуются** (cspell+markdownlint), **не** в ignorePaths — в отличие от вендоренных mermaid-skill/CCPM/Data Scientist (конфликт-аудит LINT1). Границы — ADR-008. Регулируются PSR_v1 R10.1 (Блок 1 — operations + note self-authored скилы; Блок 3 — n8n-mcp). Установлены 17.05.2026 на ветке `worktree-c10-business-process-tooling`; план `docs/superpowers/plans/2026-05-17-c10-business-process-tooling-integration.md`.
**Off-phase discovery-tooling (v1.26, 18.05.2026):** скил `discovery-interview` (Tooling #55, §4.30; self-authored project-скил `.claude/skills/discovery-interview/` — как `audit-portal`/`regression`/`process-modeling`/`process-analysis`) — структурированное интервью-discovery до проектирования: режим FEATURE (JTBD-интервью заказчика — вскрывает проблему, отдаёт discovery-brief в `brainstorming`), режим SYSTEM (интервью-ориентация по мета-слою проекта — карта/CLAUDE.md/MEMORY/Открытые_вопросы/Tooling/git log). **Двенадцатая** off-phase подкатегория. Не UI → вне R6.0/R6.1/R14 PSR_v1. Как **проектный** скил (не Superpowers-скил) регистрируется здесь в §13.2, **не** в §12.2 (карта Superpowers-скилов) — триггерится штатным механизмом using-superpowers по `description` (триггер-eval 20/20). Дубль с `process-analysis` #53 исключён разрезом по слою-источнику; границы — ADR-009 (DI1–DI6). Регулируется PSR_v1 R10.1 Блок 1 note (self-authored project-скил). Установлен 18.05.2026 на ветке `worktree-discovery-interview`; план `docs/superpowers/plans/2026-05-18-discovery-interview-integration.md`.
**Off-phase authoring-tooling + dev-support (v1.28, 18.05.2026):** 5 Anthropic dev-плагинов из marketplace `anthropics/claude-plugins-official`, уже включённых в `~/.claude/settings.json` `enabledPlugins` user-level — формализованы 18.05.2026 после аудита «мозга» (L1-паттерн «плагин фактически включён без формализации в правилах» — повтор UPM/21st 10.05 и Sentry/Redis 13.05). Подкатегория **authoring-tooling** (тринадцатая, создание Claude-артефактов): #56 `skill-creator` (Tooling §4.31; конструктор standalone-скилов), #57 `plugin-dev` (§4.32; конструктор marketplace-плагинов — 8 sub-skills + 3 агента), #58 `hookify` (§4.33; генератор хуков). Подкатегория **dev-support** (четырнадцатая, поддержка/документация Claude-разработки): #59 `claude-code-setup` (§4.34; рекомендатель Claude Code automations, read-only), #60 `context7` (§4.35; актуальная документация библиотек). Off-phase, не UI → вне R6.0/R6.1/R14 PSR_v1. **hookify** — особое правило: вызов только по явному `/hookify`, перед генерацией хука обязательный pre-check на коллизию с уже-зарегистрированными хуками в `~/.claude/settings.json` (перезапись 6-компонентной economy/skill-discipline архитектуры запрещена — конфликт-аудит HK1; закрывает 🔴-конфликт карты `hookify_plugin ↔ hk_pre_claude`). Границы D2–D5 — ADR-010. Регулируется PSR_v1 R10.1 Блок 1. Установлены 18.05.2026 на ветке `feat/anthropic-dev-tooling`; план `docs/superpowers/plans/2026-05-18-anthropic-dev-tooling-formalization.md`.
### 13.3. Скоуп
| Тип задачи | Кто отвечает |
@@ -855,6 +868,53 @@ Hard-link идёт через цепочку: R14 нарушено → R10.4 «
---
## 15. Параллельные сессии — hard rule (субагенты + git, нормативка + pre-flight sync)
Действует с 18.05.2026. **Hard rule**: §9 «Отступления» к §15 не применяется (как §12 и §14).
### 15.1 Субагенты + git
Git-коммит-задачи субагенту (любой `Task`-инвокейшн, чей prompt содержит `git commit`, `git push`, `git stage`, `git checkout`, `git switch`, `git merge`, `git rebase`, либо где явно ожидается коммит в результате) — **только модель Sonnet или Opus**, никогда Haiku. Контроллер, делегирующий git-операцию Haiku-субагенту — нарушение §15.1, фиксируется в feedback того же уровня, что §12.
Исключение — read-only git-операции (`git log`, `git status`, `git diff`, `git rev-parse`, `git branch --show-current`, `git worktree list`) — разрешены любой модели.
Прецедент-источник: Sprint 6 (17.05.2026) — Haiku-субагенты угнали ветку параллельной сессии, устранено через `git reflog` + `reset`. Корневая причина — отсутствие верификации HEAD/branch после Task-инвокации. Verify-протокол — `.claude/skills/subagent-driven-development/references/git-safety-checklist.md`.
### 15.2 Нормативные правки + pre-flight sync
Любая правка файлов из списка «нормативка» (см. ниже) выполняется **только** на актуальной базе `origin/main`. Pre-flight обязателен:
```bash
git fetch origin && git log HEAD..origin/main --oneline
```
Если есть untracked commits на `origin/main`, ребейз/merge **до начала правки**, не после.
Параллельная нормативная правка на устаревшей базе — нарушение §15.2. Признак нарушения: коммит правит файл, чья последняя версия на `origin/main` новее, чем версия в parent коммите правки.
**Список «нормативка» — 8 позиций:**
1. `docs/Pravila_raboty_Claude_v1_1.md`
2. `CLAUDE.md`
3. `docs/Tooling_v8_3.md`
4. `docs/Plugin_stack_rules_v1.md`
5. `memory/MEMORY.md` (и все `memory/*.md`)
6. `docs/Открытые_вопросы_v8_3.md`
7. `docs/adr/*.md` (glob — collision на ADR-NNN номере = тот же класс, что version-bump нормативки)
8. `db/schema.sql` (параллельные миграции из разных сессий = реальный риск; запись в `db/CHANGELOG_schema.md` сама не защищает от version-base дрейфа)
Расширение списка — отдельная правка §15.2, не «по ощущениям».
Дополнительно: при параллельных активных сессиях контроллер обязан добавить запись в `docs/sessions/CURRENT.md` до первой нормативной правки (claim) — формат и жизненный цикл записи описаны в `docs/sessions/README.md`. Конфликт-резолюция (file overlap / section overlap / version-claim collision) — там же.
### 15.3 Cross-refs в других файлах
- **CLAUDE.md §1 priority chain** — §15 рядом с §12 и §14 как hard-rule (см. footer-абзац после цепочки).
- **PSR_v1** — не правится: §15 не про координацию плагинов, а про координацию сессий.
- **Tooling** — не правится.
---
## Что сделано после утверждения
Заказчик согласовал v1.1-DRAFT (короткий ответ «а» = вариант A: поправить §4.8 и шапку, выпустить v1.1) в сессии 05.05.2026. Claude выполнил:
+92 -4
View File
File diff suppressed because one or more lines are too long
@@ -0,0 +1,59 @@
# ADR-009: Discovery-interview tooling
- **Status:** Accepted
- **Date:** 2026-05-18
- **Deciders:** Дмитрий
## Context
Запрос вида «менеджеры жалуются на X» или «хочу, чтобы Y» — симптом, не задача.
`brainstorming` уходит в проектирование решения, не удерживая разговор в проблемном
поле; для расплывчатых проблемных запросов нет слоя, который вскрывает проблему до
решения (JTBD / customer discovery). Аналогично у заказчика нет способа получить
синтезированную ориентацию по состоянию проекта — CLAUDE.md и MEMORY грузятся
пассивно, `audit-portal` даёт качественный вердикт, не ориентацию.
Параллельно 17.05.2026 раздел C10 карты ввёл скил `process-analysis`, чей режим 1 —
«process discovery» (реконструкция as-is бизнес-процесса из кода). Это создаёт риск
дубля (§5 п.6 CLAUDE.md) и коллизии триггеров по слову «discovery».
## Decision
Вводится проектный vendored-скил `discovery-interview` (`.claude/skills/`), два
режима:
- **FEATURE** — интервью заказчика перед фичей: JTBD вскрывает проблему, отдаёт
discovery-brief в `brainstorming`.
- **SYSTEM** — интервью-ориентация по состоянию проекта: синтез по мета-слою (карта,
CLAUDE.md, MEMORY, Открытые_вопросы, Tooling, git log).
Режим «интервью конечных пользователей» — **defer** post-Б-1 (нет живых
пользователей; дублировал бы `design:user-research`).
Дубль с `process-analysis` исключён **разрезом по слою-источнику**: `process-analysis`
работает с app-кодом (`routes/`, `app/Jobs`, `audit_*`); discovery-interview — с
головой заказчика (FEATURE) и мета-слоем управления (SYSTEM). Триггер-коллизия по
слову «discovery» снята лексическим разведением описаний + взаимными SKIP-блоками;
проверено триггер-eval'ом 20/20 (`.claude/skills/discovery-interview/evals/`) —
переименование скила (fallback) не понадобилось.
discovery-interview — *проектный* скил (как `audit-portal`, `regression`), не
Superpowers-скил → регистрируется в Pravila §13.2; §12.2 (карта Superpowers-скилов)
не трогается. Категория — новая 12-я off-phase подкатегория `discovery-tooling`,
вне UI-пула PSR_v1; реестр Tooling — #55.
## Consequences
- Положительно: расплывчатый проблемный запрос получает дисциплину discovery до
проектирования; заказчик получает синтез-ориентацию on-demand; дубля с C10
`process-analysis` нет (разрез по слою), коллизия триггеров снята (eval 20/20).
- Риск: скил self-authored — принадлежит проекту, без upstream-зависимости (это
смягчение, не риск).
- Defer: режим «интервью конечных пользователей» — до появления живых пользователей
(блокер Б-1).
## Enforcement
None — discovery-interview advisory; корректность срабатывания проверяется
триггер-eval'ом (`evals/evals.json`) и code review. Границы с `process-analysis`,
`brainstorming` и `audit-portal` зафиксированы в SKILL.md секции «Границы».
+77
View File
@@ -0,0 +1,77 @@
# ADR-010: Anthropic dev-tooling formalization
- **Status:** Accepted
- **Date:** 2026-05-18
- **Deciders:** Дмитрий
## Context
Пять Anthropic-плагинов включены в `~/.claude/settings.json` `enabledPlugins`
user-level, но не имеют номера в реестре Tooling §3.3 / PSR_v1 R10.1:
`skill-creator`, `plugin-dev`, `hookify`, `claude-code-setup`, `context7`. Все пять
из marketplace `anthropics/claude-plugins-official`.
Это повторение L1-паттерна «плагин фактически включён без формализации в правилах»:
зафиксирован 2026-05-10 (UPM #31 / 21st #32 — обнаружены только когда заказчик
спросил про конфликты), повторился 2026-05-13 (Sentry #34 / Redis #35
формализованы retrospective в v1.92). Любое использование неформализованного
плагина — байпас PSR_v1 R0.2/R10. Карта `docs/automation-graph.html` имеет
соответствующие 5 узлов (iter7 audit-actualization 16.05.2026), но без номеров и
без edge к governing-правилу; узел `hookify_plugin` несёт незакрытый 🔴-конфликт
`hookify_plugin ↔ hk_pre_claude` (плагин hookify может перезаписать существующие
хуки в `settings.json`).
Аудит «мозга» (discovery-interview SYSTEM-режим, 2026-05-18) вскрыл долг; заказчик
выбрал формализовать все 5, предварительно закрыв риски.
## Decision
Пять плагинов формализуются как позиции #56#60 реестра Tooling в **двух новых
off-phase подкатегориях** (семантика разная — одна категория запутала бы правила):
- **authoring-tooling** — создание Claude-артефактов: #56 skill-creator,
#57 plugin-dev, #58 hookify.
- **dev-support** — поддержка/документация Claude-разработки: #59 claude-code-setup,
#60 context7.
Граничные правила (locked):
1. **hookify (#58)** — вызов только по явному `/hookify`, не проактивно. Перед
генерацией хука — обязательный pre-check на коллизию с уже-зарегистрированными
хуками в `~/.claude/settings.json`; перезапись 6-компонентной economy/
skill-discipline архитектуры запрещена. Это закрывает 🔴-конфликт
`hookify_plugin ↔ hk_pre_claude` (🔴 → 🟢).
2. **skill-creator (#56) ↔ plugin-dev:skill-development (#57)** — skill-creator для
standalone проектных скилов; plugin-dev:skill-development — для скилов внутри
разрабатываемого marketplace-плагина. Вендоренные и self-authored скилы
модифицируются прямым Edit, не через skill-creator.
3. **context7 (#60) ↔ WebFetch ↔ WebSearch** — context7 первый выбор для
документации известной библиотеки; WebFetch — конкретный URL; WebSearch — поиск
без URL.
4. **claude-code-setup (#59)** — read-only анализатор; рекомендации фильтруются
через R0/R10.1, ничего не устанавливается без явного согласования.
Обе подкатегории — не UI → вне фильтров PSR_v1 R6.0/R6.1 и R14 pipeline; регулируются
R10.1 Блок 1 как infrastructure (по образцу claude-md-management #33).
ADR обязателен (не retrospective-без-ADR как Sentry/Redis #34/#35): здесь 5 позиций
и 2 новые подкатегории — decision-grain выше порога.
## Consequences
- Положительно: L1-долг для 5 Anthropic-плагинов закрыт — использование больше не
байпас R0.2/R10; 🔴-конфликт hookify закрыт правилом (🔴 → 🟢, классификация карты
🔴1/⚫3/🟢7 → 🔴0/⚫3/🟢8); карта получает edge к governing-правилу для 5 узлов.
- Отрицательно: реестр Tooling растёт 55 → 60; число off-phase подкатегорий 12 → 14.
- Риск: эти 5 плагинов включены user-level — влияют на все проекты машины;
формализация в Лидерра-нормативке другие проекты не ломает (они её не читают) —
это не риск, а ограничение области действия.
- Defer: изменение `enabledPlugins` (выключение плагинов) — отвергнуто заказчиком в
пользу формализации; не выполняется.
## Enforcement
None — формализация декларативная (реестр + границы в R10.1 / Pravila §13.2).
hookify pre-check на коллизию хуков — поведенческое правило, проверяется code review,
не автоматическим гейтом. Границы #56#60 зафиксированы в Tooling §4.31–§4.32 и
PSR_v1 R10.1 Блок 1.
+55 -27
View File
@@ -228,10 +228,10 @@ function pos(ring, angleDeg) {
const NODES = [
// ── ПРАВИЛА (4) ── центр + первое кольцо ───────
{ id: 'pravila', label: 'Pravila v1.24', group: 'rules', size: 38, ring: 0, ...pos(0, 0) },
{ id: 'claude_md', label: 'CLAUDE.md v2.10', group: 'rules', size: 34, ring: 1, ...pos(1, 30) },
{ id: 'psr_v1', label: 'PSR_v1 v3.10', group: 'rules', size: 32, ring: 1, ...pos(1, 150) },
{ id: 'tooling', label: 'Tooling v2.10', group: 'rules', size: 30, ring: 1, ...pos(1, 270) },
{ id: 'pravila', label: 'Pravila v1.28', group: 'rules', size: 38, ring: 0, ...pos(0, 0) },
{ id: 'claude_md', label: 'CLAUDE.md v2.15', group: 'rules', size: 34, ring: 1, ...pos(1, 30) },
{ id: 'psr_v1', label: 'PSR_v1 v3.13', group: 'rules', size: 32, ring: 1, ...pos(1, 150) },
{ id: 'tooling', label: 'Tooling v2.14', group: 'rules', size: 30, ring: 1, ...pos(1, 270) },
// ── ПЛАГИНЫ (13) ── второе кольцо ──────────────
{ id: 'superpowers', label: 'Superpowers v5.1', group: 'plugins', size: 30, ring: 2, ...pos(2, 45) },
@@ -290,6 +290,8 @@ const NODES = [
{ id: 'ops_plugin', label: 'operations\n(plugin)', group: 'plugins', size: 20, ring: 2, ...pos(2, 385) },
{ id: 'process_modeling', label: 'process-modeling\n(skill)', group: 'skills_proj', size: 18, ring: 3, ...pos(3, 367) },
{ id: 'process_analysis', label: 'process-analysis\n(skill)', group: 'skills_proj', size: 18, ring: 3, ...pos(3, 377) },
// discovery-tooling (18.05.2026) — self-authored скил интервью-discovery
{ id: 'discovery_interview', label: 'discovery-interview\n(skill)', group: 'skills_proj', size: 18, ring: 3, ...pos(3, 387) },
// ── ХУКИ (12) — S+infra + E (economy/skill) ───
{ id: 'hk_session', label: 'SessionStart:\ncontext-inject', group: 'hooks', size: 24, ring: 4, ...pos(4, 100) },
@@ -507,10 +509,8 @@ const EDGES = [
E('mcp_boost', 'ag_rls', 'схема БД\nдля RLS-review'),
// ── АУДИТ-АКТУАЛИЗАЦИЯ 16.05.2026 — связи новых узлов ──
E('psr_v1', 'skill_creator', 'R10.1:\nвнешний инструмент'),
E('psr_v1', 'claude_setup', 'R10.1:\nвнешний инструмент'),
E('psr_v1', 'plugin_dev', 'R10.1:\nвнешний инструмент'),
E('psr_v1', 'context7', 'R10.1:\nвнешний инструмент'),
// 4 ребра psr_v1skill_creator/claude_setup/plugin_dev/context7 — перенесены
// в ADT-блок 18.05.2026 (точные категории authoring-tooling/dev-support, дедуп)
E('plugin_dev', 'ag_pcreator', 'содержит\nагента'),
E('plugin_dev', 'ag_pvalid', 'содержит\nагента'),
E('plugin_dev', 'ag_skreview', 'содержит\nагента'),
@@ -560,12 +560,25 @@ const EDGES = [
E('tooling', 'process_modeling', '§4.27 #52 — реестр'),
E('tooling', 'process_analysis', '§4.28 #53 — реестр'),
// ── DISCOVERY-TOOLING 18.05.2026 — связи узла discovery-interview ──
E('tooling', 'discovery_interview', '§4.30 #55 — реестр'),
E('psr_v1', 'discovery_interview', 'R10.1 блок 1 note:\ndiscovery-tooling'),
E('discovery_interview', 'sk_brainstorm', 'хэндофф:\nFEATURE-brief'),
E('discovery_interview', 'process_analysis', 'граница: слой-источник\n(ADR-009 DI2)'),
// ── ANTHROPIC DEV-TOOLING 18.05.2026 — связи 5 узлов ──
E('psr_v1', 'skill_creator', 'R10.1 блок 1:\nauthoring-tooling'),
E('psr_v1', 'plugin_dev', 'R10.1 блок 1:\nauthoring-tooling'),
E('psr_v1', 'hookify_plugin', 'R10.1 блок 1:\nauthoring-tooling (HK1)'),
E('psr_v1', 'claude_setup', 'R10.1 блок 1:\ndev-support'),
E('psr_v1', 'context7', 'R10.1 блок 1:\ndev-support'),
// ══════════════════════════════════════════════════
// КОНФЛИКТЫ — 3-color classification (iter2 §4)
// 🔴 не закрыт правилом / ⚫ возник на практике / 🟢 закрыт правилом
// ══════════════════════════════════════════════════
CONFLICT('sk_rls', 'ag_rls', 'RLS: граница задана — скил по таблице, агент по diff/PR (spec 2026-05-16)', 'GREEN'),
CONFLICT('hookify_plugin', 'hk_pre_claude', 'hookify может перезаписать существующий хук', 'RED'),
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('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'),
@@ -673,7 +686,7 @@ const NODE_DETAILS = {
[{ name: 'CLAUDE.md', desc: 'CLAUDE.md §5 п.10 требует править только через скил claude-md-management, а PSR_v1 это ограничение не повторяет — риск прямых Edit', type: 'GREEN' }]
),
tooling: nd(
'Реестр 70 позиций — 50 формализованных инструментов + 20 ruflo-плагинов; §4.10 — ruflo как advisory/automation-подсистема. Когда что использовать, команды установки, конфликты.',
'Реестр 80 позиций — 60 формализованных инструментов + 20 ruflo-плагинов; §4.10 — ruflo как advisory/automation-подсистема. Когда что использовать, команды установки, конфликты.',
'При выборе инструмента для фазы (нулевая документация / первая backend / вторая frontend / третья перед запуском в боевую среду), при добавлении нового инструмента, при обновлении версий.',
'При прямом конфликте с CLAUDE.md побеждает CLAUDE.md (оперативная карта уровня 2a). Любая правка требует синхронизации с CLAUDE.md §3.',
[
@@ -729,12 +742,12 @@ const NODE_DETAILS = {
hookify_plugin: nd(
'Плагин создания хуков — анализирует разговоры и предлагает новые автоматизации в виде хуков.',
'При запросе «давай повесим хук на это поведение» или после серии повторяющихся ошибок — анализ через агента conversation-analyzer.',
'Правило PSR_v1 R10.1. Новые хуки могут конфликтовать с существующими (см. конфликты ниже) — обязательная проверка файла настроек до создания.',
[{ name: 'PSR_v1', cond: 'R10.1: формализован' }],
'PSR_v1 R10.1 блок 1 #58 (authoring-tooling). HK1 hard-rule: только по явному /hookify, не проактивно; перед генерацией хука — обязательный pre-check на коллизию с зарегистрированными хуками settings.json; перезапись 6-компонентной economy/skill-discipline архитектуры запрещена. ADR-010.',
[{ name: 'PSR_v1', cond: 'R10.1 блок 1 #58: authoring-tooling, HK1 pre-check (ADR-010)' }],
[{ name: 'агент hookify:conversation-analyzer', cond: 'запускает анализ разговоров' }],
[{ name: 'агент hookify:conversation-analyzer', cond: 'плагин и агент работают в паре' }],
[
{ name: 'хук pre-claude-warn', desc: 'плагин hookify создаёт новые хуки PreToolUse на лету — может перезаписать или конкурировать с этим хуком', type: 'RED' }
{ name: 'хук pre-claude-warn', desc: 'Закрыто правилом HK1 (ADR-010): hookify — только по явному /hookify, перед генерацией хука обязательный pre-check на коллизию с существующими хуками settings.json; перезапись 6-компонентной economy/skill-discipline архитектуры запрещена', type: 'GREEN' }
]
),
@@ -921,6 +934,16 @@ const NODE_DETAILS = {
[{ name: 'process-modeling', cond: 'as-is ↔ to-be пара' }]
),
// ── DISCOVERY-TOOLING (18.05.2026) ────────────
discovery_interview: nd(
'Self-authored скил: структурированное интервью-discovery до проектирования — FEATURE (JTBD-интервью заказчика) + SYSTEM (ориентация по мета-слою проекта).',
'При расплывчатом проблемном запросе — провести JTBD-интервью, отдать discovery-brief в brainstorming; при «сориентируй по проекту» — синтез по карте/CLAUDE.md/MEMORY/Открытые_вопросы/Tooling.',
'Свой project-скил в .claude/skills/discovery-interview/ (не вендоренный → линтуется, LINT1). Не UI → вне фильтров R6.0/R6.1/R14. Триггер-eval 20/20. Tooling §4.30 #55, CLAUDE.md §3.3 #55, ADR-009.',
[{ name: 'PSR_v1', cond: 'R10.1 блок 1 note: discovery-tooling' }, { name: 'Tooling', cond: '§4.30 #55 — реестр' }],
[{ name: 'DI2', cond: 'разрез по слою-источнику с process-analysis (ADR-009)' }],
[{ name: 'process-analysis', cond: 'граница: app-код ↔ голова заказчика/мета-слой' }, { name: 'brainstorming', cond: 'хэндофф FEATURE-brief' }]
),
// ── СКИЛЫ SUPERPOWERS ────────────────────────────
sk_brainstorm: nd(
'Продумывает задачу вместе с заказчиком, формулирует варианты A/B/C и согласует дизайн до написания кода.',
@@ -1581,7 +1604,7 @@ const NODE_DETAILS = {
'Плагин Anthropic для создания новых скилов — eval-driven подход: датасеты сценариев, train/test split, бенчмарк-цикл.',
'При формализации повторяющегося процесса в скил с проверяемым выводом (генерация кода, преобразование файлов).',
'Включён в настройках (~/.claude/settings.json). Для discipline-скилов (TDD-типа) предпочтительнее скил writing-skills плагина Superpowers — у них разные философии.',
[{ name: 'PSR_v1', cond: 'R10.1: внешний плагин-инструмент' }],
[{ name: 'PSR_v1', cond: 'R10.1 блок 1 #56: authoring-tooling (ADR-010)' }],
[],
[{ name: 'скил writing-skills', cond: 'обе создают скилы — skill-creator eval-driven, writing-skills через TDD' }]
),
@@ -1589,7 +1612,7 @@ const NODE_DETAILS = {
'Плагин Anthropic — рекомендатель автоматизаций (claude-automation-recommender): анализирует репозиторий и советует, какие MCP-серверы, скилы, хуки, суб-агентов добавить.',
'При настройке/ревизии автоматизации проекта — «чего не хватает в тулчейне».',
'Включён в настройках (~/.claude/settings.json). Рекомендации — совещательные, решение за заказчиком.',
[{ name: 'PSR_v1', cond: 'R10.1: внешний плагин-инструмент' }],
[{ name: 'PSR_v1', cond: 'R10.1 блок 1 #59: dev-support — рекомендации фильтруются R0/R10.1 (CCS1, ADR-010)' }],
[],
[]
),
@@ -1597,7 +1620,7 @@ const NODE_DETAILS = {
'Плагин Anthropic для разработки плагинов Claude Code — 7 скилов (структура плагина, разработка скилов / агентов / хуков / команд, интеграция MCP, настройки).',
'При создании или правке плагина и его компонентов.',
'Включён в настройках. Содержит 3 агента, уже представленные на карте (agent-creator / plugin-validator / skill-reviewer).',
[{ name: 'PSR_v1', cond: 'R10.1: внешний плагин-инструмент' }],
[{ name: 'PSR_v1', cond: 'R10.1 блок 1 #57: authoring-tooling — только для marketplace-плагинов, не для вендоренного/self-authored (PD1, ADR-010)' }],
[
{ name: 'агент plugin-dev:agent-creator', cond: 'входит в плагин' },
{ name: 'агент plugin-dev:plugin-validator', cond: 'входит в плагин' },
@@ -1609,7 +1632,7 @@ const NODE_DETAILS = {
'Плагин Anthropic — актуальная документация библиотек / фреймворков / API через MCP-инструменты query-docs и resolve-library-id.',
'При вопросах по библиотеке / фреймворку / SDK / CLI — синтаксис API, конфигурация, миграция версий. Предпочтительнее веб-поиска для документации библиотек.',
'Включён в настройках. Не для рефакторинга / отладки бизнес-логики / ревью — только документация.',
[{ name: 'PSR_v1', cond: 'R10.1: внешний плагин-инструмент' }],
[{ name: 'PSR_v1', cond: 'R10.1 блок 1 #60: dev-support — первый выбор для документации библиотек; WebFetch/WebSearch как fallback (CTX1, ADR-010)' }],
[],
[]
),
@@ -1864,17 +1887,17 @@ const META_WINDOW = '0916.05.2026'; // окно подсчёта испо
// usesSrc: 'скил' | 'агент' | 'MCP' | 'хук' | 'memory-чтение' | 'коммиты' | 'инспекция' | '—'
const NODE_META = {
// ── ПРАВИЛА (4) — узлы-правила, напрямую не вызываются ──
pravila: { since: '06.05.2026', changed: '17.05.2026', uses: null, usesSrc: '—' },
claude_md: { since: '06.05.2026', changed: '17.05.2026', uses: null, usesSrc: '—' },
psr_v1: { since: '09.05.2026', changed: '17.05.2026', uses: null, usesSrc: '—' },
tooling: { since: '06.05.2026', changed: '17.05.2026', uses: null, usesSrc: '—' },
pravila: { since: '06.05.2026', changed: '18.05.2026', uses: null, usesSrc: '—' },
claude_md: { since: '06.05.2026', changed: '18.05.2026', uses: null, usesSrc: '—' },
psr_v1: { since: '09.05.2026', changed: '18.05.2026', uses: null, usesSrc: '—' },
tooling: { since: '06.05.2026', changed: '18.05.2026', uses: null, usesSrc: '—' },
// ── ПЛАГИНЫ (5) ──
superpowers: { since: '09.05.2026', changed: '—', uses: null, usesSrc: '—' },
fd_plugin: { since: '10.05.2026', changed: '—', uses: 1, usesSrc: 'скил' },
upm: { since: '10.05.2026', changed: '—', uses: 0, usesSrc: 'скил' },
claude_md_mgmt: { since: '10.05.2026', changed: '—', uses: 15, usesSrc: 'скил' },
hookify_plugin: { since: '—', changed: '', uses: null, usesSrc: '—' },
hookify_plugin: { since: '—', changed: '18.05.2026', uses: null, usesSrc: '—' },
// ── СКИЛЫ SUPERPOWERS (14) — связка подключена 09.05.2026 ──
sk_brainstorm: { since: '09.05.2026', changed: '—', uses: 44, usesSrc: 'скил' },
@@ -1973,10 +1996,10 @@ const NODE_META = {
// ── АУДИТ-АКТУАЛИЗАЦИЯ 16.05.2026 — узлы добавлены по полному аудиту карты ──
// uses новых узлов по транскриптам не измерялись (null = нет данных).
skill_creator: { since: '11.05.2026', changed: '', uses: null, usesSrc: '—' },
claude_setup: { since: '11.05.2026', changed: '', uses: null, usesSrc: '—' },
plugin_dev: { since: '—', changed: '', uses: null, usesSrc: '—' },
context7: { since: '—', changed: '', uses: null, usesSrc: '—' },
skill_creator: { since: '11.05.2026', changed: '18.05.2026', uses: null, usesSrc: '—' },
claude_setup: { since: '11.05.2026', changed: '18.05.2026', uses: null, usesSrc: '—' },
plugin_dev: { since: '—', changed: '18.05.2026', uses: null, usesSrc: '—' },
context7: { since: '—', changed: '18.05.2026', uses: null, usesSrc: '—' },
hk_self_check: { since: '10.05.2026', changed: '—', uses: null, usesSrc: '—' },
hk_skill_marker: { since: '10.05.2026', changed: '—', uses: null, usesSrc: '—' },
hk_skill_check: { since: '10.05.2026', changed: '—', uses: null, usesSrc: '—' },
@@ -2028,6 +2051,9 @@ const NODE_META = {
ops_plugin: { since: '17.05.2026', changed: '—', uses: null, usesSrc: 'плагин' },
process_modeling: { since: '17.05.2026', changed: '—', uses: null, usesSrc: 'скил' },
process_analysis: { since: '17.05.2026', changed: '—', uses: null, usesSrc: 'скил' },
// ── DISCOVERY-TOOLING (18.05.2026) ──
discovery_interview: { since: '18.05.2026', changed: '—', uses: null, usesSrc: 'скил' },
};
// Явные парные дубли (Фича 3) — попадают в кнопку «⧉ Дубли».
@@ -2110,7 +2136,7 @@ const SECTIONS = [
{ id: 'E7', bucket: 'E', label: 'Исследования' },
{ id: 'E8', bucket: 'E', label: 'Самообучение Claude' },
];
// Узел -> раздел. Покрывает все 124 узлов карты.
// Узел -> раздел. Покрывает все 125 узлов карты.
const NODE_SECTION = {
// правила (4)
pravila: 'E1', claude_md: 'E1', psr_v1: 'E1', tooling: 'E1',
@@ -2166,6 +2192,8 @@ const NODE_SECTION = {
claude_api: 'A11', promptfoo: 'A11', data_scientist: 'A11',
// C10 business-process 17.05.2026 — раздел «Бизнес-процессы (общее)» наполнен
ops_plugin: 'C10', process_modeling: 'C10', process_analysis: 'C10',
// discovery-interview 18.05.2026 — раздел E5 «Стратегия и принятие решений» (рядом с brainstorming)
discovery_interview: 'E5',
};
// Вторичная классификация: узел первично в NODE_SECTION, дополнительно — в этих
// разделах (кросс-реф). Введено A3-интеграцией 17.05.2026 — раздел A3 наполняется
+21
View File
@@ -0,0 +1,21 @@
# docs/discovery — артефакты discovery interview
Home раздела `discovery-tooling` карты. Каталог хранит артефакты скила
`discovery-interview` (`.claude/skills/discovery-interview/`).
## Что здесь лежит
- **SYSTEM-snapshot'ы**`YYYY-MM-DD-<тема>.md`, результаты режима SYSTEM
(синтез-ориентация по состоянию проекта). Шаблон — `templates/system-snapshot.md`.
## Чего здесь НЕ лежит
- **FEATURE-brief** (режим FEATURE) отдельным файлом не сохраняется — он вливается
проблемной секцией в спеку `brainstorming` (`docs/superpowers/specs/`). Шаблон
`templates/discovery-brief.md` задаёт структуру этой секции.
## Связано
- Скил — `../../.claude/skills/discovery-interview/SKILL.md`
- Дизайн — `../superpowers/specs/2026-05-18-discovery-interview-design.md`
- ADR — `../adr/ADR-009-discovery-interview-tooling.md`
@@ -0,0 +1,30 @@
# Discovery-brief — шаблон (режим FEATURE)
Структура проблемной секции, которую `discovery-interview` FEATURE отдаёт в
`brainstorming`. Заполняется по итогам интервью. Отдельным файлом не коммитится —
вливается в спеку brainstorming как готовая проблемная секция.
## Проблема
<Что именно болит — одно-два предложения, формулировкой заказчика.>
## JTBD
<Какую работу заказчик «нанимает» решение сделать. Формат: «Когда <ситуация>, я хочу
<мотив>, чтобы <результат>».>
## Текущий обходной путь
<Как заказчик решает это сейчас — вручную или другим инструментом.>
## Цена боли
<Время / деньги / частота. Сколько стоит НЕ решать проблему.>
## Сигнал успеха
<Как поймём, что проблема закрыта — наблюдаемый признак.>
## Ограничения
<Что нельзя ломать или менять; сроки; технические и процессные рамки.>
@@ -0,0 +1,26 @@
# System-snapshot — шаблон (режим SYSTEM)
Результат режима SYSTEM скила `discovery-interview` — синтез-ориентация по состоянию
проекта. Сохраняется как `docs/discovery/YYYY-MM-DD-<тема>.md`.
## Запрос ориентации
<Что просили сориентировать. Scope: весь проект / конкретный раздел / тулчейн /
открытые вопросы.>
## Состояние
<Синтез: где проект сейчас по запрошенному срезу.>
## Что открыто
<Незакрытые вопросы, блокеры, недоделанное в рамках scope.>
## Источники
<Пины на мета-слой: карта, CLAUDE.md, MEMORY, Открытые_вопросы, Tooling, git log —
конкретные файлы, секции, коммиты.>
## Следующий шаг
<Что логично сделать дальше, если применимо.>
+224
View File
@@ -0,0 +1,224 @@
# CURRENT.md — активные Claude-сессии
> Формат и жизненный цикл записей: [docs/sessions/README.md](README.md).
> Pravila §15.2 — описание правила в нормативке.
## session: 2026-05-18-parallel-sessions-coordination
- branch: feat/parallel-sessions-coordination
- worktree: c:/моя/проекты/портал crm/Документация
- started: 2026-05-18T09:30+03:00
- scope-files:
- docs/Pravila_raboty_Claude_v1_1.md §15 (new)
- CLAUDE.md §1 (cross-ref), §0 (Pravila version row)
- tools/subagent-prompt-prefix.mjs (new)
- .claude/settings.json (PreToolUse Task block)
- .claude/skills/subagent-driven-development/ (new wrapper-skill)
- docs/sessions/README.md, CURRENT.md (new — этот файл)
- version-claims:
- Pravila: 1.26 → 1.27
- CLAUDE.md: 2.13 → 2.14
- status: closed-b1765e9
- closes: docs/superpowers/plans/2026-05-18-parallel-sessions-coordination.md
---
## Retro-claim'ы активных worktrees (snapshot 2026-05-18)
Per Pravila §15.2 — backfill для существующих параллельных сессий. Эти записи retroactive, scope/version-claims заполнены best-effort из последних коммитов worktree-веток. Активные сессии при возобновлении работы обновляют свой блок.
## session: 2026-05-17-a11-ml-ai-tooling
- branch: worktree-a11-ml-ai-tooling
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/a11-ml-ai-tooling
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/automation-graph.html [A11 section] [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
## session: 2026-05-17-a3-integration-tooling
- branch: feat/a3-integration-tooling
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/a3-integration-tooling
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- cspell-words.txt [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
## session: 2026-05-17-adr006-icon-path-boundary
- branch: worktree-adr006-icon-path-boundary
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/adr006-icon-path-boundary
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/adr/006-design-tooling-figma-universal-icons-design-plugin.md [best-effort]
- CLAUDE.md §3.3 (#45), §0 cross-ref Tooling v2.11 [best-effort]
- docs/Tooling_v8_3.md §4.20 [best-effort]
- version-claims:
- Tooling: 2.10 → 2.11
- status: closed-9cf0f0c (backfilled)
- closes: unknown — backfill
## session: 2026-05-18-anthropic-dev-tooling
- branch: feat/anthropic-dev-tooling
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/anthropic-dev-tooling
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/automation-graph.html [E5 discovery-tooling section] [best-effort]
- version-claims:
- none verified — backfill
- status: closed-b40f2c8 (backfilled)
- closes: unknown — backfill
## session: 2026-05-18-c10-business-process-tooling
- branch: worktree-c10-business-process-tooling
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/c10-business-process-tooling
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/superpowers/specs/2026-05-17-c10-business-process-tooling-integration-design.md [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
## session: 2026-05-17-c9-project-management-tooling
- branch: worktree-c9-project-management-tooling
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/c9-project-management-tooling
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/automation-graph.html [C9 section] [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
## session: 2026-05-18-discovery-interview
- branch: worktree-discovery-interview
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/discovery-interview
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/automation-graph.html [E5 discovery-tooling section] [best-effort]
- version-claims:
- none verified — backfill
- status: closed-b40f2c8 (backfilled)
- closes: unknown — backfill
## session: 2026-05-16-iter6-automation-graph
- branch: feat/rls-tooling-boundary
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/iter6-automation-graph
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/automation-graph.html [viewMode/usage/dupes UI] [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
## session: 2026-05-15-plan-6-regions
- branch: plan-6-regions
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/plan-6-regions
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- app/resources/js/components/projects/ProjectDetailsDrawer.vue [best-effort]
- app/resources/js/stores/projectsStore.ts [best-effort]
- app/resources/js/views/projects/NewProjectDialog.vue [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
## session: 2026-05-16-ruflo-recollage
- branch: worktree-ruflo-recollage
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/ruflo-recollage
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/superpowers/specs/2026-05-10-claude-brain-extraction-design.md [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
## session: 2026-05-16-sprint4-historical-import
- branch: worktree-sprint4-historical-import
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/sprint4-historical-import
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- app/routes/web.php [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
## session: 2026-05-17-sprint5a-auth-polish
- branch: worktree-sprint5a-auth-polish
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/sprint5a-auth-polish
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/superpowers/plans/2026-05-16-sprint5a-auth-polish.md [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: docs/superpowers/plans/2026-05-16-sprint5a-auth-polish.md
## session: 2026-05-17-sprint5b-layout-views
- branch: worktree-sprint5b-layout-views
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/sprint5b-layout-views
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/superpowers/plans/2026-05-17-sprint5b-layout-views.md [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: docs/superpowers/plans/2026-05-17-sprint5b-layout-views.md
## session: 2026-05-17-sprint5c-billing-admin
- branch: worktree-sprint5c-billing-admin
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/sprint5c-billing-admin
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- app/tests/Feature/Admin/AdminPricingTiersControllerTest.php [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
## session: 2026-05-17-sprint5d-cleanup
- branch: worktree-sprint5d-cleanup
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/sprint5d-cleanup
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- docs/superpowers/plans/2026-05-17-sprint5d-cleanup-mock-fallback.md [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: docs/superpowers/plans/2026-05-17-sprint5d-cleanup-mock-fallback.md
## session: 2026-05-17-sprint6-p3-polish
- branch: worktree-sprint6-p3-polish
- worktree: C:/моя/проекты/портал crm/Документация/.claude/worktrees/sprint6-p3-polish
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- app/resources/js/views/ProjectsView.vue [best-effort]
- version-claims:
- none verified — backfill
- status: in-progress (backfilled)
- closes: unknown — backfill
+61
View File
@@ -0,0 +1,61 @@
# docs/sessions/ — координация параллельных Claude-сессий
**Источник правила:** Pravila §15.2 (раздел про CURRENT.md в конце текста §15.2).
## Назначение
`docs/sessions/CURRENT.md` — заявочный лог активных параллельных Claude-сессий проекта. Решает класс инцидентов «нормативка/MEMORY дрейфует» (см. spec — `docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md`).
## Когда писать в CURRENT.md
Перед **первой** нормативной правкой в сессии (правки файлов из списка §15.2 — Pravila, CLAUDE.md, Tooling, PSR_v1, MEMORY.md, Открытые_вопросы, docs/adr/*, db/schema.sql). Запись добавляется отдельным атомарным коммитом `sessions: claim <topic>` — до plan-документа и до первой содержательной правки.
## Формат записи
```
## session: YYYY-MM-DD-<topic-kebab>
- branch: <git branch --show-current>
- worktree: <git rev-parse --show-toplevel>
- started: <ISO 8601 with timezone>
- scope-files:
- <relative path> [§/раздел/строка]
- ...
- version-claims:
- <file-or-topic>: <from> → <to>
- ...
- status: in-progress | closed-<commit-sha>
- closes: <relative path к plan-документу>
```
`scope-files` — какие нормативные файлы и в каких секциях правит сессия. `version-claims` — какие новые версии (Tooling 2.X, Pravila 1.Y и т.п.) или номера (ADR-NNN) сессия резервирует.
## Жизненный цикл
- **claim** — добавить запись со `status: in-progress` + атомарный коммит `sessions: claim <topic>`.
- **check** — pre-flight перед нормативной правкой: `Read docs/sessions/CURRENT.md` + проверить пересечение `scope-files` / `version-claims` с активными записями.
- **release** — на закрытии (после push на main) изменить `status: closed-<commit-sha>` (запись остаётся в CURRENT.md — append-only-вариант).
Closed-записи переезжают в `docs/sessions/archive/YYYY-MM.md` через ≥30 дней после закрытия (ручная архивация раз в месяц, не cron).
## Конфликт-резолюция
| Тип пересечения | Реакция |
|---|---|
| Файловое пересечение (одинаковый файл, разные секции) | **soft-warn** — продолжать можно, но pre-flight fetch перед каждым коммитом обязателен (§15.2). |
| Section-пересечение (одна и та же секция §X.Y) | **hard-stop** — координация с заказчиком до начала правки. |
| Version-claim collision (две сессии заявили один номер) | **hard-stop** — кто claim'нул раньше (по `started`-timestamp), тот его и берёт. Вторая сессия сдвигается на +1. |
## Pre-flight snippet (для plan-документов и скила subagent-driven-development)
```bash
# Перед нормативной правкой:
git fetch origin && git log HEAD..origin/main --oneline
grep -A 20 'status: in-progress' docs/sessions/CURRENT.md
```
## Что мы НЕ делаем (явный YAGNI)
- Pre-commit hook на CURRENT.md — добавим только если будут зафиксированы инциденты игнорирования.
- TTL / auto-expire записей — добавим, если файл реально засорится.
- Machine-readable JSON-формат — markdown достаточен, парсится grep/sed.
- Интеграция с GitHub Issues — отдельная тема, не блокер.
@@ -0,0 +1,320 @@
# Anthropic Dev-Tooling Formalization — Implementation Plan
> **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. Git-commit-bearing tasks — **controller-only (Sonnet)**, never delegated to Haiku-subagent (Sprint 3F/5/6 lessons).
**Goal:** Формализовать 5 Anthropic-плагинов уже включённых в `~/.claude/settings.json` user-level (skill-creator, plugin-dev, hookify, claude-code-setup, context7) — добавить как позиции #56#60 в две новые off-phase подкатегории Tooling: **authoring-tooling** (#56-#58) + **dev-support** (#59-#60). Закрыть 🔴-конфликт `hookify_plugin ↔ hk_pre_claude` правилом pre-check в PSR_v1 R10.1.
**Architecture:** retrospective formalization paired со spec ADR-010. Никакой кодовой регрессии — только текстовая нормативка (4 файла) + карта (5 узлов refresh + 5 новых edge) + memory + ADR. Worktree уже создан (`feat/anthropic-dev-tooling` от origin/main `b40f2c8`). Спека: `docs/superpowers/specs/2026-05-18-anthropic-dev-tooling-formalization-design.md`.
> **Rebase-девиация (исполнение 18.05.2026):** во время эпика origin/main ушёл `b40f2c8``781a59c` — параллельная сессия запушила parallel-sessions §15 (Pravila v1.27, CLAUDE.md v2.14). Ветка ребейзнута на `781a59c`; коммиты Pravila/CLAUDE.md дропнуты из rebase (`--skip`) и пересозданы поверх §15. Целевые версии перенумерованы: **Pravila v1.27→v1.28, CLAUDE.md v2.14→v2.15** (Tooling v2.14 / PSR_v1 v3.13 — без изменений, §15 их не трогал). Шаги ниже отражают исходный план — фактические версии нормативки см. §9 CLAUDE.md / §13 Pravila.
**Tech Stack:** Tooling Прил. Н / PSR_v1 / Pravila / CLAUDE.md / ADR-010 / automation-graph.html / memory. Pre-push — `bin/gitleaks.exe detect --no-banner` (full-history) + `npx lychee --offline --no-progress .` (или из главного дерева во избежание квирка #92).
---
## Tool Identity & Decisions (verified 2026-05-18)
| # | Plugin | Marketplace | Category | Sub-skills/agents | Role |
|---|---|---|---|---|---|
| 56 | `skill-creator@claude-plugins-official` | anthropics/claude-plugins-official | authoring-tooling | skill `skill-creator` | Создание standalone скилов с performance-метриками |
| 57 | `plugin-dev@claude-plugins-official` | anthropics/claude-plugins-official | authoring-tooling | 8 skills (plugin-structure, agent-development, skill-development, command-development, hook-development, mcp-integration, plugin-settings) + 2 agents (agent-creator, plugin-validator, skill-reviewer) | Конструктор marketplace-плагинов |
| 58 | `hookify@claude-plugins-official` | anthropics/claude-plugins-official | authoring-tooling | skills (hookify, configure, list, help, writing-rules) + agent (conversation-analyzer) | Генератор хуков из анализа транскриптов |
| 59 | `claude-code-setup@claude-plugins-official` | anthropics/claude-plugins-official | dev-support | skill `claude-automation-recommender` | Анализатор кодовой базы + рекомендации |
| 60 | `context7@claude-plugins-official` | anthropics/claude-plugins-official | dev-support | MCP `plugin_context7_context7` (tools `query-docs`, `resolve-library-id`) | Актуальная документация библиотек |
**Locked decisions (D1-D8):** см. спеку §Decisions.
---
## Task 1: Pre-flight — baseline, snapshot
**Files:** none modified (read-only)
- [ ] **Step 1: Verify worktree state**
```bash
cd ".claude/worktrees/anthropic-dev-tooling"
git status --short # должен быть clean (spec+plan еще не закоммичены)
git rev-parse --short HEAD # должен быть b40f2c8
git branch --show-current # должен быть feat/anthropic-dev-tooling
```
- [ ] **Step 2: Snapshot the live Tooling counter (NUM1)**
```bash
grep -E "^\*\*Прил\. Н" docs/Tooling_v8_3.md | head -1
grep -E "Итого формализованных позиций.*55" docs/Tooling_v8_3.md
```
Expected: «v2.13», count «55». Если иное (главное origin/main продвинулось дальше) — **остановка**, ребейз worktree на актуальный origin/main, перенумеровка позиций.
- [ ] **Step 3: Snapshot map state**
```bash
grep -c "id: 'skill_creator'" docs/automation-graph.html
grep -c "id: 'plugin_dev'" docs/automation-graph.html
grep -c "id: 'hookify_plugin'" docs/automation-graph.html
grep -c "id: 'claude_setup'" docs/automation-graph.html
grep -c "id: 'context7'" docs/automation-graph.html
```
Each expected = 1. Если 0 — узел не существует, плана недостаточно, нужен add (не refresh). **NB:** claude-code-setup имеет map-id `claude_setup` (verified Task 1, 2026-05-18) — не `cc_setup`.
- [ ] **Step 4: Stage spec + plan**
```bash
git add docs/superpowers/specs/2026-05-18-anthropic-dev-tooling-formalization-design.md \
docs/superpowers/plans/2026-05-18-anthropic-dev-tooling-formalization.md
git commit -m "docs(adt): brainstorming spec + implementation plan — Anthropic dev-tooling formalization"
```
---
## Task 2: ADR-010 — Anthropic dev-tooling decision
**Files:** `docs/adr/ADR-010-anthropic-dev-tooling.md` (create)
- [ ] **Step 1:** Создать ADR по шаблону ADR-009 (discovery-interview) с секциями:
- Status: Accepted (date 2026-05-18)
- Context: 5 плагинов в settings.json без формализации; L1-паттерн повторяется (UPM/21st, Sentry/Redis); карта iter7 audit имеет узлы, но без правил
- Decision: split на 2 подкатегории (D1); правила D2–D5; ADR-010 как умолчание для retrospective формализации крупнее 2 позиций
- Consequences: + closes L1 для 5 плагинов; + закрывает 🔴 hookify; − добавляет 5 позиций к 55 (рост реестра)
- References: spec link, ADR-004/005/006/007/008/009 как прецеденты
- [ ] **Step 2:** Commit
```bash
git add docs/adr/ADR-010-anthropic-dev-tooling.md
git commit -m "docs(adr): ADR-010 — Anthropic dev-tooling formalization decision"
```
---
## Task 3: Tooling Прил. Н — 2 подкатегории + 5 позиций
**Files:** `docs/Tooling_v8_3.md`
- [ ] **Step 1:** §0 счётчик 55→60. Шапка v2.13 → v2.14. Версия в любых других местах файла где упоминается — sync.
- [ ] **Step 2:** Добавить §4.31 «authoring-tooling» с подпунктами:
- §4.31.1 #56 skill-creator (роль, install через marketplace, граница D3, конфликт-аудит SC1: standalone vs plugin-dev; SC2: self-authored — direct Edit, не trigger; SC3: bus-factor — Anthropic Verified)
- §4.31.2 #57 plugin-dev (роль, 8 sub-skills, граница D3, конфликт-аудит PD1-PD3: marketplace vs standalone; PD2: вендоренные/self-authored — не trigger; PD3: 8 sub-skills overlap внутри plugin'а)
- §4.31.3 #58 hookify (роль, generator, **HK1 hard-rule pre-check на коллизию с economy/skill-discipline 6-компонентной архитектурой; HK2: только по явному /hookify; HK3: hookify_plugin ↔ hk_pre_claude конфликт — закрыт правилом**)
- [ ] **Step 3:** Добавить §4.32 «dev-support» с подпунктами:
- §4.32.1 #59 claude-code-setup (роль, /claude-automation-recommender, read-only, CCS1: рекомендации фильтровать R0/R10.1)
- §4.32.2 #60 context7 (роль, MCP-доки, граница D4 с WebFetch/WebSearch, CTX1: первый выбор для known library docs; CTX2: не trigger при WebSearch без библиотеки)
- [ ] **Step 4:** §13 (история версий) +entry v2.14: «Anthropic dev-tooling integration — формализация 5 плагинов (#56-#60) в 2 новых off-phase подкатегориях».
- [ ] **Step 5:** Commit
```bash
git add docs/Tooling_v8_3.md
git commit -m "docs(adt): Tooling Прил. Н v2.14 — register #56-#60 (authoring-tooling + dev-support)"
```
---
## Task 4: PSR_v1 R10.1 — +5 строк + hookify-special note
**Files:** `docs/Plugin_stack_rules_v1.md`
- [ ] **Step 1:** R10.1 Блок 1 (`enabledPlugins`) +5 строк по образцу adr-kit / architecture-patterns / operations / product-management / design:
- skill-creator (роль / когда инвокировать — «при создании нового standalone скила; вендоренное/self-authored — direct Edit»)
- plugin-dev (роль / когда — «при разработке собственного marketplace-плагина; не для модификации вендоренного/self-authored»)
- hookify (роль / когда — «только по явному `/hookify`; **обязательный pre-check на коллизию с existing хуками в `~/.claude/settings.json`**; перезапись economy/skill-discipline хуков запрещена»)
- claude-code-setup (роль / когда — «по запросу или превентивно; рекомендации **фильтровать R0/R10.1**; не устанавливать без явного согласования»)
- context7 (роль / когда — «**первый выбор для документации известной библиотеки**; fallback на WebFetch при конкретном URL, WebSearch — без знания URL/библиотеки»)
- [ ] **Step 2:** Note блока (после строк): «Подкатегории **authoring-tooling** (#56-#58) и **dev-support** (#59-#60) — не UI → вне фильтров R6.0/R6.1 и R14 pipeline. Регулируются PSR_v1 R10.1 Блок 1 как infrastructure (по образцу claude-md-management #33).»
- [ ] **Step 3:** §0 (история) +entry: «v3.13 — Anthropic dev-tooling: R10.1 Блок 1 +5 строк + hookify pre-check hard-rule. Связано: Tooling v2.14, Pravila v1.27, CLAUDE.md v2.14.»
- [ ] **Step 4:** Шапка PSR v3.12 → v3.13.
- [ ] **Step 5:** Commit
```bash
git add docs/Plugin_stack_rules_v1.md
git commit -m "docs(adt): PSR_v1 v3.13 — R10.1 Блок 1 +5 строк (skill-creator/plugin-dev/hookify/claude-code-setup/context7) + hookify pre-check"
```
---
## Task 5: Pravila §13.2 — +2 абзаца
**Files:** `docs/Pravila_raboty_Claude_v1_1.md`
- [ ] **Step 1:** §13.2 +абзац «Off-phase authoring-tooling»: 3 позиции (#56 skill-creator, #57 plugin-dev, #58 hookify), категория для создания Claude-артефактов; не UI → вне R6/R14; **hookify — особое правило pre-check (PSR_v1 R10.1 hookify-строка hard-rule)**.
- [ ] **Step 2:** §13.2 +абзац «Off-phase dev-support»: 2 позиции (#59 claude-code-setup read-only анализатор; #60 context7 MCP-документация для known libraries — первый выбор); не UI → вне R6/R14.
- [ ] **Step 3:** §0 +entry v1.27 («Anthropic dev-tooling: 13-я и 14-я off-phase подкатегории»).
- [ ] **Step 4:** Шапка Pravila v1.26 → v1.27.
- [ ] **Step 5:** Commit
```bash
git add docs/Pravila_raboty_Claude_v1_1.md
git commit -m "docs(adt): Pravila v1.27 — §13.2 +Off-phase authoring-tooling + dev-support"
```
---
## Task 6: CLAUDE.md — §3/§1/§3.3/§6/§9 (worktree-эксцепшн §5 п.10)
**Files:** `CLAUDE.md` (прямой Edit в worktree — прецедент A11/C10/discovery, claude-md-management не наводится на worktree-копию), `docs/CHANGELOG_claude_md.md`
- [ ] **Step 1:** §3 title «55» → «60». §1 priority chain row 2b «55» → «60».
- [ ] **Step 2:** §3.3 +5 строк #56-#60 по образцу #51-#55 (operations / process-modeling / process-analysis / n8n / discovery). Каждая строка: ID-плагина, marketplace, категория (authoring-tooling/dev-support), роль, когда инвокировать, регламент-cross-ref на PSR R10.1 + Pravila §13.2. Для hookify — **bold pre-check note**.
- [ ] **Step 3:** §3.3 footer count 55→60 + двенадцатая→четырнадцатая off-phase подкатегория (authoring-tooling + dev-support).
- [ ] **Step 4:** §0 cross-refs row Pravila v1.26→v1.27 / PSR v3.12→v3.13 / Tooling v2.13→v2.14.
- [ ] **Step 5:** §6 +абзац «2026-05-18 Anthropic dev-tooling integration: формализованы #56#60 в 2 новых off-phase подкатегориях…».
- [ ] **Step 6:** §9 +entry v2.14.
- [ ] **Step 7:** Шапка CLAUDE.md v2.13 → v2.14.
- [ ] **Step 8:** CHANGELOG_claude_md.md +entry v2.14.
- [ ] **Step 9:** Commit
```bash
git add CLAUDE.md docs/CHANGELOG_claude_md.md
git commit -m "docs(adt): CLAUDE.md v2.14 + CHANGELOG — register #56-#60 (worktree direct Edit, §5 п.10 эксцепшн)"
```
---
## Task 7: Карта — refresh узлов + лейблы правил + edge
**Files:** `docs/automation-graph.html`
- [ ] **Step 1:** Обновить лейблы 4 узлов-правил: pravila v1.27, claude_md v2.14, psr_v1 v3.13, tooling v2.14. NODE_META.changed для всех 4 → 18.05.2026.
- [ ] **Step 2:** Обновить nd() 5 узлов (skill_creator, plugin_dev, hookify_plugin, claude_setup, context7):
- `desc` — добавить номер «#NN» в начало
- `limits` — добавить ключевые ограничения из R10.1 (для hookify — обязательный pre-check; для plugin-dev — вендоренное не трогать; для context7 — первый выбор для known library docs)
- `reportsTo` — добавить «PSR_v1 R10.1 Блок 1 / Pravila §13.2 / Tooling §4.31-4.32»
- [ ] **Step 3:** Добавить 5 рёбер `psr_v1 → {skill_creator, plugin_dev, hookify_plugin, claude_setup, context7}` тип «R10.1 блок 1» (по образцу `psr_v1→adr_kit`/`arch_patterns`/`ccpm`/...). EDGE_DETAILS — поля type «правило», when «всегда», transfers «coverage», mandatory «обязательно», rule «PSR_v1 R10.1 Блок 1». EDGES_NORMAL +5.
- [ ] **Step 4:** Конфликт-edge `hookify_plugin ↔ hk_pre_claude` (строка 1844): тип `RED``GREEN`, rule «D2 R10.1 hookify pre-check (ADR-010)». Конфликт-классификация в legend footer: 🔴1/⚫3/🟢7 → 🔴0/⚫3/🟢8.
- [ ] **Step 5:** Обновить tooling-узел nd() count «70 / 50» → «75 / 60» (75 — это позиции tooling + ruflo-плагины, 60 — формализованных).
- [ ] **Step 6:** NODE_META.changed → 18.05.2026 для 5 узлов.
- [ ] **Step 7:** Smoke (Playwright headless или ручной visual в Edge): NODES.length=124, EDGES.length=135 (130+5), 0 JS-ошибок, hookify_plugin конфликт стал 🟢.
- [ ] **Step 8:** Commit
```bash
git add docs/automation-graph.html
git commit -m "feat(map): adt — register #56-#60 in nd(), 5 edges to psr_v1, hookify conflict 🔴→🟢, rule labels v2.14"
```
---
## Task 8: Memory updates
**Files:** `MEMORY.md` + `feedback_plugin_paired_stack.md` + `project_state.md` + `reference_archive.md` + `project_automation_map.md` + new `project_anthropic_dev_tooling.md`
- [ ] **Step 1:** Создать `project_anthropic_dev_tooling.md` (новый файл) — краткий summary эпика: 5 позиций, 2 подкатегории, decisions D1-D8, key learnings (формализация L1-паттерна для Anthropic-плагинов, прецедент).
- [ ] **Step 2:** `MEMORY.md` +pointer на новый memory-файл.
- [ ] **Step 3:** `feedback_plugin_paired_stack.md` — добавить блок «Обновление 2026-05-18 — Anthropic dev-tooling (новые off-phase подкатегории authoring-tooling + dev-support)». Active versions bump до v2.14/v3.13/v1.27/v2.14. Off-phase подкатегорий теперь 14 (было 12).
- [ ] **Step 4:** `project_state.md` — branch state и HEAD update (после push в Task 9).
- [ ] **Step 5:** `reference_archive.md` — version refs sync до v2.14/v3.13/v1.27/v2.14.
- [ ] **Step 6:** `project_automation_map.md` — добавить entry «2026-05-18 Anthropic dev-tooling: 5 узлов refresh + 5 edge + hookify конфликт 🔴→🟢».
- [ ] **Step 7:** Commit
```bash
git add ../../../memory/ # путь от worktree до user-level memory — see memory location convention
# NB: memory лежит в C:\Users\Administrator\.claude\projects\…\memory — НЕ в репозитории. Memory files правятся через Write, не через git. Commit относится только к репозиторию.
```
**Replan:** memory file commits — N/A. Memory updates делаются через Write, без git. Эта задача не имеет commit-step, только Write-операции.
---
## Task 9: Pre-push + push
**Files:** none (verification + push)
- [ ] **Step 1:** Pre-commit verification (последний раз — должен быть зелёным от atomic commits в Task 1-7):
```bash
cd ".claude/worktrees/anthropic-dev-tooling"
./bin/gitleaks.exe protect --staged --no-banner # 0 leaks ожидается
```
Если квирк #97 «lefthook not in PATH в worktree» — пропустить lefthook, gitleaks вызывать вручную.
- [ ] **Step 2:** Pre-push gitleaks full history:
```bash
./bin/gitleaks.exe detect --no-banner # должен быть 0 leaks
```
- [ ] **Step 3:** Pre-push lychee — **запускать из главного дерева** (`c:/моя/проекты/портал crm/Документация/`, не из worktree — квирк #92, относительные пути ломаются из worktree):
```bash
cd "c:/моя/проекты/портал crm/Документация"
./bin/lychee.exe --offline --no-progress . 2>&1 | tail -5
# ожидается 0 broken
```
- [ ] **Step 4:** Push:
```bash
cd ".claude/worktrees/anthropic-dev-tooling"
git push origin feat/anthropic-dev-tooling:main
```
Pattern `<ветка>:main` — разрешённый в `~/.claude/settings.json` `Bash(git push origin main:*)` (хотя тут он `<ветка>:main`, проверить permissions; если deny — ручной push заказчиком).
- [ ] **Step 5:** Verify push:
```bash
git fetch origin
git rev-parse origin/main # должен совпадать с HEAD worktree
```
- [ ] **Step 6:** Update `project_state.md` post-push с новым origin/main HEAD SHA.
- [ ] **Step 7:** Сообщить заказчику: «эпик ADT закрыт, push прошёл, новые версии v2.14/v3.13/v1.27/v2.14 на origin/main».
---
## Verification Plan
После каждой task (atomic commit) — короткая локальная проверка:
- Task 3: `grep "Итого формализованных позиций.*60" docs/Tooling_v8_3.md` → 1 match
- Task 4: `grep -c "skill-creator\|plugin-dev\|hookify\|claude-code-setup\|context7" docs/Plugin_stack_rules_v1.md` → ≥5
- Task 5: `grep "authoring-tooling\|dev-support" docs/Pravila_raboty_Claude_v1_1.md` → ≥2
- Task 6: `grep "v2.14" CLAUDE.md` → ≥2 (шапка + §0/§9)
- Task 7: smoke карты — Playwright или Edge
Перед claim «эпик закрыт» — invoke `superpowers:verification-before-completion`.
---
## Risk register (post-execution)
- **Push permissions:** `Bash(git push origin main:*)` allowed; `<ветка>:main` — under same pattern? Verify Task 9 Step 4. Если deny — pause, ручной push заказчиком.
- **lychee из worktree:** квирк #92 — relative paths ломаются. **Mitigation:** Step 3 из главного дерева.
- **Wholesale rebase нужен:** если за время выполнения origin/main продвинется (parallel session) — Task 9 Step 4 fail, нужен rebase + retry. Mitigation: эпик короткий, parallel sessions сейчас нет (single Claude Code instance).
- **Memory file path mistake** в Task 8: memory лежит на user-level, не в репозитории — учтено в Task 8 Replan.
- **adr-judge job 9 in lefthook:** ADR-010 проходит regex-валидацию? Verify Task 2.
@@ -0,0 +1,156 @@
# Discovery Interview Skill — Integration Plan
> **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:** Интегрировать проектный vendored-скил `discovery-interview` (режимы FEATURE + SYSTEM) в «мозг» Лидерры с полной «Тяжёлой» церемонией.
**Architecture:** Vendored-скил в `.claude/skills/`, триггерится по `description`. Два режима разведены с C10-скилом `process-analysis` по слою-источнику (app-код / голова заказчика / мета-слой). Полная нормативная регистрация: Tooling #55, PSR_v1 R10.1, Pravila §13.2, CLAUDE.md, ADR-009, узел automation-graph.
**Tech Stack:** Markdown skill-файлы, `skill-creator` (авторинг + eval триггера), проектная нормативка, vis.js automation-graph.
**Спека:** `docs/superpowers/specs/2026-05-18-discovery-interview-design.md`. Все границы DI1–DI6 — §5 спеки.
---
## File Structure
**Create:**
- `.claude/skills/discovery-interview/SKILL.md` — скил, 2 режима, триггер-описание.
- `.claude/skills/discovery-interview/references/jtbd-questions.md` — банк JTBD-вопросов.
- `docs/discovery/README.md` — назначение каталога.
- `docs/discovery/templates/discovery-brief.md` — шаблон FEATURE-артефакта.
- `docs/discovery/templates/system-snapshot.md` — шаблон SYSTEM-артефакта.
- `docs/adr/ADR-009-discovery-interview-tooling.md` — ADR (формат Nygard, 7 секций).
**Modify:**
- `docs/Tooling_v8_3.md` — §4.30 (#55) + §0 счётчики + шапка v2.13.
- `docs/Plugin_stack_rules_v1.md` — R10.1 строка + версия v3.12.
- `docs/Pravila_raboty_Claude_v1_1.md` — §13.2 абзац + версия v1.26.
- `CLAUDE.md` — §3 title-counter, §1 row 2b, §3.3 строка, §6 абзац, §9 запись, §0 cross-refs, шапка v2.13.
- `docs/CHANGELOG_claude_md.md` — запись v2.13.
- `.claude/skills/process-analysis/SKILL.md` — +1 строка взаимного SKIP в «Границы».
- `docs/automation-graph.html` — узел `discovery_interview` + рёбра.
- `cspell-words.txt` — новые термины при необходимости.
---
## Task 1 — Skill `discovery-interview` (SKILL.md + references) + eval
**Files:**
- Create: `.claude/skills/discovery-interview/SKILL.md`
- Create: `.claude/skills/discovery-interview/references/jtbd-questions.md`
- [ ] **Step 1: SKILL.md frontmatter**`name: discovery-interview` + `description` (зафиксировано, изменять только по результату eval):
```
Структурированное интервью-discovery ПЕРЕД проектированием. Два режима. FEATURE — заказчик описывает проблему/боль/цель без готового решения («менеджеры жалуются на…», «сделки теряются», «хочу чтобы…»): JTBD-интервью вскрывает проблему до решения, отдаёт discovery-brief в brainstorming. SYSTEM — запрос ориентации по проекту («сориентируй», «где мы сейчас», «что в тулчейне/карте», «catch-up по…»): синтез по мета-слою (карта, CLAUDE.md, MEMORY, Открытые_вопросы, Tooling, git log). SKIP — чёткий директив на реализацию («интегрируй X», «закрой находку Y», «поправь Z»): это не discovery. SKIP — анализ бизнес-процесса из кода («как устроен процесс X», «process discovery», «где узкое место»): это skill process-analysis. Триггеры — «discovery interview», «проведи discovery», «сориентируй по проекту», расплывчатый проблемный запрос.
```
- [ ] **Step 2: SKILL.md тело** — секции: «Несущий принцип — 3 слоя-источника» (таблица из §2.1 спеки); «Режим FEATURE» (триггер/SKIP/JTBD-процесс/discovery-brief/хэндофф в brainstorming); «Режим SYSTEM» (триггер/SKIP/scope-интервью/синтез/запрет читать `app/`-код/system-snapshot); «JTBD-дисциплина» (прошлое поведение, один вопрос, 5×почему, не наводящие); «Границы» (DI1–DI4 + взаимный SKIP с `process-analysis`).
- [ ] **Step 3: references/jtbd-questions.md** — банк вопросов: проблема, текущий обходной путь, цена боли (время/деньги/частота), сигнал успеха, ограничения; формулировки в прошедшем времени.
- [ ] **Step 4 (eval — тест триггера):** через `skill-creator` собрать кейс-сет «должен сработать / не должен» (вкл. спорные: «сделай discovery» → должен; «как устроен процесс сделок» → НЕ должен, process-analysis; «интегрируй openapi-mcp» → НЕ должен, директив; «сориентируй по карте» → должен SYSTEM). Прогнать eval, замерить точность.
- [ ] **Step 5:** при промахах — итерировать `description` (Step 1) и повторить eval, пока точность чистая. Если коллизия с `process-analysis` не уходит — fallback: переименовать скил (имя без «discovery»), зафиксировать в ADR-009.
- [ ] **Step 6: Commit**`git add .claude/skills/discovery-interview/``feat(discovery): add discovery-interview skill — FEATURE + SYSTEM modes`.
---
## Task 2 — `docs/discovery/` каталог + шаблоны
**Files:**
- Create: `docs/discovery/README.md`
- Create: `docs/discovery/templates/discovery-brief.md`
- Create: `docs/discovery/templates/system-snapshot.md`
- [ ] **Step 1: README.md** — назначение каталога: home SYSTEM-snapshot'ов (`YYYY-MM-DD-*.md`); FEATURE-brief здесь не хранится — он вливается секцией в спеку brainstorming. Ссылка на скил и спеку.
- [ ] **Step 2: templates/discovery-brief.md** — разделы: Проблема · JTBD · Текущий обходной путь · Цена боли · Сигнал успеха · Ограничения.
- [ ] **Step 3: templates/system-snapshot.md** — разделы: Запрос ориентации (scope) · Состояние · Что открыто · Источники (пины) · Следующий шаг.
- [ ] **Step 4: Commit**`git add docs/discovery/``feat(discovery): add docs/discovery — README + brief/snapshot templates`.
---
## Task 3 — ADR-009
**Files:**
- Create: `docs/adr/ADR-009-discovery-interview-tooling.md`
- [ ] **Step 1:** Написать ADR в формате существующих (см. `ADR-008-business-process-tooling.md` как образец): Status `Accepted` / Date 2026-05-18 / Deciders Дмитрий; Context (зачем discovery-interview, коллизия с C10 `process-analysis`); Decision (2 режима, 3-слойный разрез, `discovery-tooling` категория, §12.2 — не трогается, режим «пользователи» defer); Consequences; Enforcement (None — advisory, проверяется eval'ом и code review).
- [ ] **Step 2: Commit**`git add docs/adr/ADR-009-discovery-interview-tooling.md``docs(discovery): ADR-009 — discovery-interview tooling decision`.
---
## Task 4 — Нормативная регистрация (Tooling + PSR_v1 + Pravila + CLAUDE.md)
Один логический change → один коммит (паттерн C10 `1a49d7b`).
**Files:**
- Modify: `docs/Tooling_v8_3.md` — новый `### 4.30. discovery-interview` (#55, off-phase, discovery-tooling) по образцу §4.28; §0 счётчик 54→55 (74→75), off-phase row +24→+25, итоговая строка; шапка → v2.13 + запись; футер-строка Прил. Н.
- Modify: `docs/Plugin_stack_rules_v1.md` — R10.1 (блок проектных скилов) +строка `discovery-interview`; версия → v3.12 + запись.
- Modify: `docs/Pravila_raboty_Claude_v1_1.md` — §13.2 +абзац «Off-phase discovery-tooling» (как проектный скил, не §12.2); версия → v1.26 + запись.
- Modify: `CLAUDE.md` — §3 title-counter 54→55; §1 priority-chain row 2b counter; §3.3 +строка #55 + footer-счётчик; §6 +абзац discovery-interview; §9 +запись v2.13; §0 cross-refs Tooling v2.13 / PSR_v1 v3.12 / Pravila v1.26; шапка → v2.13. Прямой Edit — worktree-constraint эксцепшн §5 п.10.
- Modify: `docs/CHANGELOG_claude_md.md` — запись v2.13.
- [ ] **Step 1:** re-Read `docs/Pravila_raboty_Claude_v1_1.md` §13.2 (актуальная версия в worktree — v1.25 после C10) перед правкой.
- [ ] **Step 2:** Tooling §4.30 + §0 счётчики + шапка.
- [ ] **Step 3:** PSR_v1 R10.1 + версия.
- [ ] **Step 4:** Pravila §13.2 + версия.
- [ ] **Step 5:** CLAUDE.md 6 точек + шапка; CHANGELOG запись.
- [ ] **Step 6: Verify** — счётчики сходятся во всех 4 файлах (55 формализованных / 75 total / off-phase +25 / 12 off-phase подкатегорий); cross-refs версий взаимно согласованы.
- [ ] **Step 7: Commit**`git add docs/Tooling_v8_3.md docs/Plugin_stack_rules_v1.md docs/Pravila_raboty_Claude_v1_1.md CLAUDE.md docs/CHANGELOG_claude_md.md``docs(discovery): register discovery-tooling — Tooling/PSR/Pravila/CLAUDE.md`.
---
## Task 5 — Граница в `process-analysis` (взаимный SKIP)
**Files:**
- Modify: `.claude/skills/process-analysis/SKILL.md` — секция «Границы», +1 строка.
- [ ] **Step 1:** В «Границы» добавить строку: `**Интервью заказчика про будущую фичу / ориентация по проекту** — скил discovery-interview (вскрытие проблемы до решения; этот скил — про вскрытие as-is процесса из кода).`
- [ ] **Step 2: Commit**`git add .claude/skills/process-analysis/SKILL.md``docs(discovery): process-analysis — reciprocal SKIP boundary to discovery-interview`.
---
## Task 6 — Узел карты `automation-graph.html`
**Files:**
- Modify: `docs/automation-graph.html`
- [ ] **Step 1:** Добавить узел `discovery_interview` в раздел off-phase / discovery-tooling (по образцу узлов C10 из коммита `afcff10`); Паспорт узла (дата внедрения 18.05.2026, использований 0).
- [ ] **Step 2:** Рёбра: `discovery_interview → brainstorming` (хэндофф), `discovery_interview → process_analysis` (ребро-граница), рёбра к governing-правилам (CLAUDE.md / Pravila §13.2).
- [ ] **Step 3: Smoke** — открыть карту через Playwright MCP, проверить 0 JS-ошибок, узел отрисован, нет перекрытий; обновить метрики узлов/рёбер в легенде.
- [ ] **Step 4: Commit**`git add docs/automation-graph.html``feat(map): discovery_interview node — discovery-tooling section`.
---
## Task 7 — Регрессия, push, memory
- [ ] **Step 1:** `/regression quick` (lint/format/type-check) — трогаем markdown/skill/html, код не меняем. Ожидание: GREEN. Failure'ы — выписать с file:line.
- [ ] **Step 2:** invoke `superpowers:verification-before-completion` перед claim «готово».
- [ ] **Step 3:** pre-push — `gitleaks` full-history + `lychee` вручную в worktree (квирк 97 — lefthook не в PATH).
- [ ] **Step 4:** Push — `git push origin worktree-discovery-interview:main`.
- [ ] **Step 5: Memory** — topic-файл `project_discovery_interview.md` + строка в `MEMORY.md` (≤200 символов, следить за лимитом 24.4 КБ).
---
## Порядок и зависимости
Task 1 → 2 → 3 → 4 → 5 → 6 → 7. Task 1 — критический путь (eval-гейт). Tasks 4–6 механические — допустимы субагенты (Haiku/Sonnet, raw output), контроллер верифицирует счётчики и git-базу после каждого. Task 3 (ADR) зависит от результата eval Task 1 (фиксирует rename-fallback, если он сработал).
## Не входит
Режим «интервью конечных пользователей» — defer post-Б-1. Реальный прогон интервью. Переименование скила — только fallback по eval (Task 1 Step 5).
@@ -0,0 +1,995 @@
# Parallel Sessions Coordination — Implementation Plan
> **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:** Лечим два класса параллельных-сессий инцидентов (субагенты теряются между worktree / нормативка дрейфует) — добавляем Pravila §15 hard-rule, заявочный лог `docs/sessions/CURRENT.md`, PreToolUse-хук `tools/subagent-prompt-prefix.mjs`, references-wrapper к скилу subagent-driven-development.
**Architecture:** 4 артефакта, 0 новых плагинов / MCP. Pravila §15 — корневое правило. CURRENT.md — координация scope/version-claims. Хук — авто-инжект git-safety заголовка в каждый Task-prompt. Wrapper-скил — verify-чеклист контроллера.
**Tech Stack:** Markdown (нормативка + лог), Node 22 ESM (`tools/*.mjs` с `node --test`), git, lefthook (pre-commit), Bash (на Windows через Git Bash).
**Spec:** [docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md](../specs/2026-05-18-parallel-sessions-coordination-design.md)
**Branch:** `feat/parallel-sessions-coordination` (создана от origin/main `b40f2c8`, верифицирована pre-flight — `git log HEAD..origin/main` пуст).
---
## File Structure
**Создаются:**
- `docs/sessions/README.md` — описание формата CURRENT.md, лайфциклов, конфликт-резолюции.
- `docs/sessions/CURRENT.md` — заявочный лог + retro-claim для активных worktrees на момент имплементации.
- `tools/subagent-prompt-prefix.mjs` — PreToolUse-хук на Task, инжектит cwd/branch/HEAD заголовок.
- `tools/subagent-prompt-prefix.test.mjs``node --test` test-suite.
- `.claude/skills/subagent-driven-development/SKILL.md` — wrapper-скил с проектным verify-протоколом (references-обёртка над marketplace-скилом).
- `.claude/skills/subagent-driven-development/references/git-safety-checklist.md` — pre/post-subagent чеклист, формат GIT REPORT.
**Модифицируются:**
- `docs/Pravila_raboty_Claude_v1_1.md` — добавить §15 (15.1 + 15.2 + 15.3), bump header v1.26 → v1.27, add §10 changelog entry.
- `CLAUDE.md` — §1 priority chain footer-абзац (cross-ref на §15), §0 row Pravila version v1.26 → v1.27. Через `/claude-md-management:claude-md-improver`.
- `.claude/settings.json` — добавить PreToolUse block `matcher: "Task"`.
- `cspell-words.txt` — добавить транслитерации появляющиеся в хуке/wrapper-скиле (по факту падений).
---
## Task 1: Pravila §15 hard-rule
**Files:**
- Modify: `docs/Pravila_raboty_Claude_v1_1.md` (add §15 after §14, bump header version, add §10 changelog entry)
- [ ] **Step 1.1: Verify §15 still free**
Run:
```bash
grep -nE '^## 1[5-9]\.|^## 2[0-9]\.' docs/Pravila_raboty_Claude_v1_1.md
```
Expected: empty (no §15 collision). If non-empty — STOP, разбор.
- [ ] **Step 1.2: Find insertion point after §14**
Run:
```bash
grep -nE '^## (14|15|11)\.' docs/Pravila_raboty_Claude_v1_1.md
```
Expected: line for `## 14. Ruflo Queen routing — hard rule (триггер queen/королева)` (was line 820 at design time; verify актуально). Find end-of-§14 boundary (next `^##` heading или EOF).
- [ ] **Step 1.3: Add §15 content**
Insert after the closing line of §14 (before next `##` heading or EOF). Exact text:
```markdown
## 15. Параллельные сессии — hard rule (субагенты + git, нормативка + pre-flight sync)
Действует с 18.05.2026. **Hard rule**: §9 «Отступления» к §15 не применяется (как §12 и §14).
### 15.1 Субагенты + git
Git-коммит-задачи субагенту (любой `Task`-инвокейшн, чей prompt содержит `git commit`, `git push`, `git stage`, `git checkout`, `git switch`, `git merge`, `git rebase`, либо где явно ожидается коммит в результате) — **только модель Sonnet или Opus**, никогда Haiku. Контроллер, делегирующий git-операцию Haiku-субагенту — нарушение §15.1, фиксируется в feedback того же уровня, что §12.
Исключение — read-only git-операции (`git log`, `git status`, `git diff`, `git rev-parse`, `git branch --show-current`, `git worktree list`) — разрешены любой модели.
Прецедент-источник: Sprint 6 (17.05.2026) — Haiku-субагенты угнали ветку параллельной сессии, устранено через `git reflog` + `reset`. Корневая причина — отсутствие верификации HEAD/branch после Task-инвокации. Verify-протокол — `.claude/skills/subagent-driven-development/references/git-safety-checklist.md`.
### 15.2 Нормативные правки + pre-flight sync
Любая правка файлов из списка «нормативка» (см. ниже) выполняется **только** на актуальной базе `origin/main`. Pre-flight обязателен:
```bash
git fetch origin && git log HEAD..origin/main --oneline
```
Если есть untracked commits на `origin/main`, ребейз/merge **до начала правки**, не после.
Параллельная нормативная правка на устаревшей базе — нарушение §15.2. Признак нарушения: коммит правит файл, чья последняя версия на `origin/main` новее, чем версия в parent коммите правки.
**Список «нормативка» — 8 позиций:**
1. `docs/Pravila_raboty_Claude_v1_1.md`
2. `CLAUDE.md`
3. `docs/Tooling_v8_3.md`
4. `docs/Plugin_stack_rules_v1.md`
5. `memory/MEMORY.md` (и все `memory/*.md`)
6. `docs/Открытые_вопросы_v8_3.md`
7. `docs/adr/*.md` (glob — collision на ADR-NNN номере = тот же класс, что version-bump нормативки)
8. `db/schema.sql` (параллельные миграции из разных сессий = реальный риск; запись в `db/CHANGELOG_schema.md` сама не защищает от version-base дрейфа)
Расширение списка — отдельная правка §15.2, не «по ощущениям».
Дополнительно: при параллельных активных сессиях контроллер обязан добавить запись в `docs/sessions/CURRENT.md` до первой нормативной правки (claim) — формат и жизненный цикл записи описаны в `docs/sessions/README.md`. Конфликт-резолюция (file overlap / section overlap / version-claim collision) — там же.
### 15.3 Cross-refs в других файлах
- **CLAUDE.md §1 priority chain** — §15 рядом с §12 и §14 как hard-rule (см. footer-абзац после цепочки).
- **PSR_v1** — не правится: §15 не про координацию плагинов, а про координацию сессий.
- **Tooling** — не правится.
```
- [ ] **Step 1.4: Bump Pravila header v1.26 → v1.27**
Find first occurrence of `v1.26` in the file header (~lines 110) and replace one instance with `v1.27`. Update date if needed — `от 18.05.2026` stays.
Run check после правки:
```bash
head -10 docs/Pravila_raboty_Claude_v1_1.md
```
Expected: header содержит `v1.27 от 18.05.2026`.
- [ ] **Step 1.5: Add §10 changelog entry**
Find `## 10. История версий` (was line 561). Add at the **top** of the version list (newest first per existing pattern; verify pattern in §10 head — if oldest-first, append at bottom; the entry text is the same):
```markdown
**v1.27 от 18.05.2026** — Параллельные сессии: координация. +§15 hard-rule (15.1 субагенты+git Sonnet/Opus only, 15.2 нормативка+pre-flight sync, 15.3 cross-refs). §15 третье hard-rule после §12 и §14; список «нормативка» — 8 позиций. Лечит два класса инцидентов параллельных-сессий: (A) субагенты теряются между worktree (Sprint 6 прецедент), (B) нормативка/MEMORY дрейфует (Tooling v2.11 collision 17.05.2026). Спек — `docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md`, план — `docs/superpowers/plans/2026-05-18-parallel-sessions-coordination.md`.
```
- [ ] **Step 1.6: Verify Pravila correctness**
Run:
```bash
grep -cE '^## 15\.' docs/Pravila_raboty_Claude_v1_1.md
grep -cE '^### 15\.[123]' docs/Pravila_raboty_Claude_v1_1.md
grep -c 'v1.27' docs/Pravila_raboty_Claude_v1_1.md
```
Expected: `1`, `3`, `≥2` (header + §10 entry).
- [ ] **Step 1.7: Commit**
```bash
git add docs/Pravila_raboty_Claude_v1_1.md
git commit -m "feat(pravila): §15 hard-rule — параллельные сессии (субагенты+git, нормативка+pre-flight sync)
Bump Pravila v1.26 → v1.27 + §10 changelog entry. §15 третье hard-rule
после §12 (Superpowers) и §14 (Ruflo Queen). §15 лечит два класса
инцидентов параллельных Claude-сессий — субагенты путают ветки/worktree
(Sprint 6) и нормативка/MEMORY дрейфует (Tooling v2.11 collision 17.05.2026).
Cross-refs to CLAUDE.md §1 — отдельная правка через
/claude-md-management:claude-md-improver (Task 5 плана).
Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md
Plan: docs/superpowers/plans/2026-05-18-parallel-sessions-coordination.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
```
Pre-commit chain должен пройти: gitleaks 0, markdownlint 0, cspell 0 (если новые транслитерации появятся — добавить в `cspell-words.txt` отдельным fixup-commit'ом до основного коммита).
---
## Task 2: docs/sessions/ — каталог + README + CURRENT.md retro-claim
**Files:**
- Create: `docs/sessions/README.md`
- Create: `docs/sessions/CURRENT.md`
- [ ] **Step 2.1: Resolve active worktrees**
Run:
```bash
git worktree list --porcelain
```
Expected: список worktree (на 18.05.2026 — 16 штук). Сохранить вывод для retro-claim записей.
- [ ] **Step 2.2: Create docs/sessions/README.md**
Полное содержимое (никаких placeholder'ов):
```markdown
# docs/sessions/ — координация параллельных Claude-сессий
**Источник правила:** Pravila §15.2 (раздел про CURRENT.md в конце текста §15.2).
## Назначение
`docs/sessions/CURRENT.md` — заявочный лог активных параллельных Claude-сессий проекта. Решает класс инцидентов «нормативка/MEMORY дрейфует» (см. spec — `docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md`).
## Когда писать в CURRENT.md
Перед **первой** нормативной правкой в сессии (правки файлов из списка §15.2 — Pravila, CLAUDE.md, Tooling, PSR_v1, MEMORY.md, Открытые_вопросы, docs/adr/*, db/schema.sql). Запись добавляется отдельным атомарным коммитом `sessions: claim <topic>` — до plan-документа и до первой содержательной правки.
## Формат записи
```markdown
## session: YYYY-MM-DD-<topic-kebab>
- branch: <git branch --show-current>
- worktree: <git rev-parse --show-toplevel>
- started: <ISO 8601 with timezone>
- scope-files:
- <relative path> [§/раздел/строка]
- ...
- version-claims:
- <file-or-topic>: <from> → <to>
- ...
- status: in-progress | closed-<commit-sha>
- closes: <relative path к plan-документу>
```
`scope-files` — какие нормативные файлы и в каких секциях правит сессия. `version-claims` — какие новые версии (Tooling 2.X, Pravila 1.Y и т.п.) или номера (ADR-NNN) сессия резервирует.
## Жизненный цикл
- **claim** — добавить запись со `status: in-progress` + атомарный коммит `sessions: claim <topic>`.
- **check** — pre-flight перед нормативной правкой: `Read docs/sessions/CURRENT.md` + проверить пересечение `scope-files` / `version-claims` с активными записями.
- **release** — на закрытии (после push на main) изменить `status: closed-<commit-sha>` (запись остаётся в CURRENT.md — append-only-вариант).
Closed-записи переезжают в `docs/sessions/archive/YYYY-MM.md` через ≥30 дней после закрытия (ручная архивация раз в месяц, не cron).
## Конфликт-резолюция
| Тип пересечения | Реакция |
|---|---|
| Файловое пересечение (одинаковый файл, разные секции) | **soft-warn** — продолжать можно, но pre-flight fetch перед каждым коммитом обязателен (§15.2). |
| Section-пересечение (одна и та же секция §X.Y) | **hard-stop** — координация с заказчиком до начала правки. |
| Version-claim collision (две сессии заявили один номер) | **hard-stop** — кто claim'нул раньше (по `started`-timestamp), тот его и берёт. Вторая сессия сдвигается на +1. |
## Pre-flight snippet (для plan-документов и скила subagent-driven-development)
```bash
# Перед нормативной правкой:
git fetch origin && git log HEAD..origin/main --oneline
grep -A 20 'status: in-progress' docs/sessions/CURRENT.md
```
## Что мы НЕ делаем (явный YAGNI)
- Pre-commit hook на CURRENT.md — добавим только если будут зафиксированы инциденты игнорирования.
- TTL / auto-expire записей — добавим, если файл реально засорится.
- Machine-readable JSON-формат — markdown достаточен, парсится grep/sed.
- Интеграция с GitHub Issues — отдельная тема, не блокер.
```
- [ ] **Step 2.3: Create docs/sessions/CURRENT.md с retro-claim**
Структура с заголовком + текущей сессией parallel-sessions-coordination + retro-claim записями для каждой активной worktree из Step 2.1.
Для текущей сессии (заполнить gотовыми значениями):
```markdown
# CURRENT.md — активные Claude-сессии
> Формат и жизненный цикл записей: [docs/sessions/README.md](README.md).
> Pravila §15.2 — описание правила в нормативке.
## session: 2026-05-18-parallel-sessions-coordination
- branch: feat/parallel-sessions-coordination
- worktree: c:/моя/проекты/портал crm/Документация
- started: 2026-05-18T09:30+03:00
- scope-files:
- docs/Pravila_raboty_Claude_v1_1.md §15 (new)
- CLAUDE.md §1 (cross-ref), §0 (Pravila version row)
- tools/subagent-prompt-prefix.mjs (new)
- .claude/settings.json (PreToolUse Task block)
- .claude/skills/subagent-driven-development/ (new wrapper-skill)
- docs/sessions/README.md, CURRENT.md (new — этот файл)
- version-claims:
- Pravila: 1.26 → 1.27
- status: in-progress
- closes: docs/superpowers/plans/2026-05-18-parallel-sessions-coordination.md
---
## Retro-claim'ы активных worktrees (snapshot 2026-05-18)
Per Pravila §15.2 — backfill для существующих параллельных сессий. Эти записи retroactive, scope/version-claims заполнены best-effort из последних коммитов worktree-веток. Активные сессии при возобновлении работы обновляют свой блок.
```
Дальше — по одной записи на каждую worktree из Step 2.1 (кроме основной `Документация`, которая = текущая сессия). Для каждой записи:
- `branch`: имя ветки из `git worktree list`
- `worktree`: путь
- `started`: `2026-05-18T00:00+03:00` (best-effort backfill, не точный)
- `scope-files`: best-effort из последнего коммита ветки (`git log -1 --name-only <branch>`). Если scope непонятен — `- <unknown — backfill>`
- `version-claims`: `- <none verified — backfill>` если непонятно
- `status`: `in-progress (backfilled)` если HEAD ветки не на origin/main, иначе `closed-<sha> (backfilled)`
Например (шаблон для одной retro-записи; повторить для каждой worktree):
```markdown
## session: 2026-05-XX-<topic-from-branch-name>
- branch: <worktree-branch-name>
- worktree: <worktree path>
- started: 2026-05-18T00:00+03:00 (backfill)
- scope-files:
- <best-effort from git log -1 --name-only>
- version-claims:
- <none verified — backfill>
- status: in-progress (backfilled) | closed-<sha> (backfilled)
- closes: <unknown — backfill>
```
- [ ] **Step 2.4: Verify created files**
Run:
```bash
ls -la docs/sessions/
wc -l docs/sessions/README.md docs/sessions/CURRENT.md
grep -c '^## session:' docs/sessions/CURRENT.md
```
Expected: оба файла существуют; CURRENT.md содержит ≥1 запись (текущая) + retro-claim для каждой worktree из Step 2.1.
- [ ] **Step 2.5: Commit**
```bash
git add docs/sessions/
git commit -m "feat(sessions): CURRENT.md + README — заявочный лог параллельных Claude-сессий
Создаём docs/sessions/ — координация per Pravila §15.2 (claim/check/release
жизненный цикл, конфликт-резолюция). CURRENT.md содержит текущую сессию
parallel-sessions-coordination + retro-claim записи для существующих
активных worktrees (16 штук на 2026-05-18).
Backfill scope/version-claims заполнен best-effort; активные сессии
обновят свой блок при возобновлении работы.
Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
```
---
## Task 3: Hook tests (TDD — failing first)
**Files:**
- Create: `tools/subagent-prompt-prefix.test.mjs`
- [ ] **Step 3.1: Write the failing test file**
Полное содержимое (`node --test` runner, паттерн один-в-один с `tools/ruflo-recall-hook.test.mjs`):
```javascript
#!/usr/bin/env node
/**
* Tests for tools/subagent-prompt-prefix.mjs — PreToolUse Task git-safety header inject.
*
* Per Pravila §15.1 — hook injects cwd/branch/HEAD/worktree-root into каждый Task-prompt.
* FAIL-OPEN: any error → return {continue: true} без модификации.
*
* Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md §4
*/
import { test } from 'node:test';
import { strict as assert } from 'node:assert';
import { spawnSync } from 'node:child_process';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';
const __dirname = dirname(fileURLToPath(import.meta.url));
const HOOK_PATH = join(__dirname, 'subagent-prompt-prefix.mjs');
function runHook(stdinJson) {
return spawnSync('node', [HOOK_PATH], {
input: JSON.stringify(stdinJson),
encoding: 'utf8',
timeout: 5000,
});
}
test('hook injects SUBAGENT GIT-SAFETY HEADER into Task prompt', () => {
const result = runHook({
tool_name: 'Task',
tool_input: { prompt: 'do something' },
});
assert.equal(result.status, 0, `stderr: ${result.stderr}`);
const out = JSON.parse(result.stdout);
assert.ok(out.hookSpecificOutput, 'has hookSpecificOutput');
assert.equal(out.hookSpecificOutput.hookEventName, 'PreToolUse');
assert.equal(out.hookSpecificOutput.permissionDecision, 'allow');
const newPrompt = out.hookSpecificOutput.updatedInput.prompt;
assert.match(newPrompt, /=== SUBAGENT GIT-SAFETY HEADER/);
assert.match(newPrompt, /=== END SUBAGENT GIT-SAFETY HEADER ===/);
assert.match(newPrompt, /do something/, 'preserves original prompt');
});
test('hook injects real cwd, branch, HEAD values', () => {
const result = runHook({
tool_name: 'Task',
tool_input: { prompt: 'noop' },
});
assert.equal(result.status, 0);
const out = JSON.parse(result.stdout);
const newPrompt = out.hookSpecificOutput.updatedInput.prompt;
// cwd — absolute path
assert.match(newPrompt, /Working directory \(cwd\): [A-Za-z]:[\\/]|Working directory \(cwd\): \//);
// branch — non-empty
assert.match(newPrompt, /Branch \(git branch --show-current\): \S+/);
// HEAD — 40-char SHA
assert.match(newPrompt, /Parent commit \(git rev-parse HEAD\): [0-9a-f]{40}/);
});
test('hook passes through non-Task tools without modification', () => {
const result = runHook({
tool_name: 'Edit',
tool_input: { file_path: '/foo', old_string: 'a', new_string: 'b' },
});
assert.equal(result.status, 0);
const out = JSON.parse(result.stdout);
// Non-Task → either {continue: true} OR no updatedInput
if (out.hookSpecificOutput) {
assert.equal(out.hookSpecificOutput.updatedInput, undefined);
} else {
assert.equal(out.continue, true);
}
});
test('hook fail-open on malformed stdin', () => {
const result = spawnSync('node', [HOOK_PATH], {
input: 'not-json',
encoding: 'utf8',
timeout: 5000,
});
assert.equal(result.status, 0, `should not crash; stderr: ${result.stderr}`);
// Either {continue: true} or empty output — both acceptable fail-open
});
test('hook fail-open when git not available', () => {
const result = spawnSync('node', [HOOK_PATH], {
input: JSON.stringify({ tool_name: 'Task', tool_input: { prompt: 'x' } }),
encoding: 'utf8',
timeout: 5000,
env: { ...process.env, PATH: '' }, // strip PATH → git not found
});
assert.equal(result.status, 0, `should not crash when git missing; stderr: ${result.stderr}`);
});
```
- [ ] **Step 3.2: Verify tests FAIL (hook doesn't exist yet)**
Run:
```bash
node --test tools/subagent-prompt-prefix.test.mjs
```
Expected: ALL tests FAIL — `Cannot find module '.../subagent-prompt-prefix.mjs'` or similar ENOENT. Это **ожидаемое** — TDD red-phase.
- [ ] **Step 3.3: Commit (TDD: failing test первым)**
```bash
git add tools/subagent-prompt-prefix.test.mjs
git commit -m "test(hooks): subagent-prompt-prefix — failing tests (TDD red)
5 тестов для Task git-safety inject хука:
- inject SUBAGENT GIT-SAFETY HEADER в Task-prompt
- inject real cwd/branch/HEAD/worktree-root
- passes through non-Task tools
- fail-open on malformed stdin
- fail-open when git unavailable
Tests FAIL — hook implementation в следующем коммите (TDD green-phase).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
```
---
## Task 4: Hook implementation (TDD green)
**Files:**
- Create: `tools/subagent-prompt-prefix.mjs`
- [ ] **Step 4.1: Write hook implementation**
Полное содержимое (паттерн из `tools/ruflo-recall-hook.mjs``execFile`, FAIL-OPEN, ESM):
```javascript
#!/usr/bin/env node
/**
* PreToolUse hook — git-safety header inject for Task tool.
*
* For каждый Task-инвокейшн контроллера: дописывает в начало tool_input.prompt
* заголовок с cwd / branch / parent SHA / worktree-root + правилами поведения
* (rule 1–5). Это компенсирует класс инцидентов «субагент путает ветку/worktree»
* (Sprint 6, Pravila §15.1).
*
* FAIL-OPEN: любая ошибка / тайм-аут / git-не-в-PATH → {continue: true} без
* модификации; хук НИКОГДА не блокирует Task.
*
* Non-Task tools — pass-through без модификации.
*
* Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md §4
* Rule: docs/Pravila_raboty_Claude_v1_1.md §15.1
*/
import { execFile } from 'node:child_process';
import { promisify } from 'node:util';
const execFileP = promisify(execFile);
const GIT_TIMEOUT_MS = 1500;
/** Read all stdin into a string. */
async function readStdin() {
let buf = '';
for await (const chunk of process.stdin) buf += chunk;
return buf;
}
/** Parse hook input JSON; return null on any parse error. */
function parseHookInput(raw) {
try { return JSON.parse(raw); } catch { return null; }
}
/** Run a single fixed-args git command; return trimmed stdout, or null on any error. */
async function gitCmd(args) {
try {
const { stdout } = await execFileP('git', args, { timeout: GIT_TIMEOUT_MS, encoding: 'utf8' });
return stdout.trim();
} catch {
return null;
}
}
/** Build the safety header block. Returns null if any of the 4 git values can't be resolved. */
async function buildHeader() {
const cwd = process.cwd();
const [branch, head, top] = await Promise.all([
gitCmd(['branch', '--show-current']),
gitCmd(['rev-parse', 'HEAD']),
gitCmd(['rev-parse', '--show-toplevel']),
]);
if (!branch || !head || !top) return null;
return [
'=== SUBAGENT GIT-SAFETY HEADER (Pravila §15.1, auto-injected) ===',
`Working directory (cwd): ${cwd}`,
`Branch (git branch --show-current): ${branch}`,
`Parent commit (git rev-parse HEAD): ${head}`,
`Worktree root (git rev-parse --show-toplevel): ${top}`,
'',
'ОБЯЗАТЕЛЬНЫЕ ПРАВИЛА:',
'1. Все git-операции выполняй ТОЛЬКО внутри cwd выше. Если pwd ≠ cwd — STOP, верни ошибку.',
'2. ЗАПРЕЩЕНО: `git checkout <branch>`, `git switch <branch>`, `git checkout -b`, `git branch -m`, `git worktree add/remove`, `git push --force`, `git reset --hard`.',
'3. После КАЖДОГО `git commit` — выполни `git rev-parse HEAD` и `git branch --show-current`, выпиши результат в ответ. Это обязательная часть отчёта.',
'4. Если обнаружил, что находишься не в той ветке/worktree — STOP, не правь ничего, верни ошибку с raw output `git status` и `git branch --show-current`.',
'5. Если задача не требует git-операций (только Edit/Read/Grep) — этот блок информационный, follow rule 1.',
'',
'=== END SUBAGENT GIT-SAFETY HEADER ===',
'',
].join('\n');
}
/** Emit fail-open response and exit 0. */
function failOpen() {
process.stdout.write(JSON.stringify({ continue: true }));
process.exit(0);
}
async function main() {
const raw = await readStdin();
const input = parseHookInput(raw);
if (!input) return failOpen();
// Non-Task — pass-through
if (input.tool_name !== 'Task') return failOpen();
const originalPrompt = input.tool_input?.prompt;
if (typeof originalPrompt !== 'string') return failOpen();
const header = await buildHeader();
if (!header) {
// git unavailable / not in worktree — fail-open per spec §4.5 edge-case 3
process.stderr.write('[subagent-prompt-prefix] git resolution failed — passing through\n');
return failOpen();
}
const newPrompt = header + originalPrompt;
process.stdout.write(JSON.stringify({
hookSpecificOutput: {
hookEventName: 'PreToolUse',
permissionDecision: 'allow',
permissionDecisionReason: 'git-safety header injected (Pravila §15.1)',
updatedInput: { prompt: newPrompt },
},
}));
}
main().catch(() => failOpen());
```
- [ ] **Step 4.2: Run tests — verify GREEN**
Run:
```bash
node --test tools/subagent-prompt-prefix.test.mjs
```
Expected: ALL 5 tests PASS (`# pass 5 / # fail 0`).
Если какой-то тест падает — STOP, фикс реализации (НЕ теста), повторить.
- [ ] **Step 4.3: Smoke test inject вручную**
Run:
```bash
echo '{"tool_name":"Task","tool_input":{"prompt":"hello"}}' | node tools/subagent-prompt-prefix.mjs | python -m json.tool
```
Expected: JSON с `hookSpecificOutput.updatedInput.prompt`, начинающимся `=== SUBAGENT GIT-SAFETY HEADER`, с реальными cwd/branch/HEAD значениями.
- [ ] **Step 4.4: Commit**
```bash
git add tools/subagent-prompt-prefix.mjs
git commit -m "feat(hooks): subagent-prompt-prefix — PreToolUse git-safety inject (TDD green)
Per Pravila §15.1 — инжектит cwd/branch/HEAD/worktree-root + правила
поведения в каждый Task-prompt. FAIL-OPEN на любой ошибке (git
не в PATH, malformed stdin, non-Task tools).
Все 5 тестов из subagent-prompt-prefix.test.mjs PASS.
Регистрация в .claude/settings.json — Task 6 плана.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
```
---
## Task 5: CLAUDE.md cross-ref через claude-md-management
**Files:**
- Modify: `CLAUDE.md` (через плагин, не прямой Edit)
- [ ] **Step 5.1: Запустить /claude-md-management:claude-md-improver**
Через слэш-команду в Claude Code. Передать конкретные правки:
> Обнови CLAUDE.md под добавление Pravila §15:
>
> 1. **§0 cross-ref row Pravila** — `v1.26``v1.27`. Сводный комментарий в скобках после версии: «(v1.27 от 18.05.2026 — §15 hard-rule: параллельные сессии (15.1 субагенты+git, 15.2 нормативка+pre-flight sync, 15.3 cross-refs); третье hard-rule после §12 и §14)».
>
> 2. **§1 priority chain** — добавить **footer-абзац** после блок-схемы цепочки (после слов «...alongside CLAUDE.md как корневая карта Claude Code.»). Текст footer-абзаца:
>
> > **Hard-rules вне §9 «Отступления»** (Pravila): §12 (Superpowers — инвокация skill ПЕРВОЙ), §14 (Ruflo Queen routing — триггер queen/королева), **§15** (параллельные сессии — 15.1 субагенты+git Sonnet/Opus only, 15.2 нормативка+pre-flight sync с 8-позиционным списком, 15.3 cross-refs). Эти три параграфа Pravila — explicit override-floor под §9; transitive hard-rule через §13 — координация Plugin_stack_rules_v1.
>
> 1. **§9 «История версий»** — добавить запись v2.14 (или next-free version) с описанием изменений согласно §6 шаблону предыдущих записей.
Плагин сам бамп'нет шапку CLAUDE.md (v2.13 → v2.14) и сделает commit per §5 п.10.
- [ ] **Step 5.2: Verify after plugin run**
Run:
```bash
git log -1 --stat
grep -c 'v1.27' CLAUDE.md
grep -c '§15' CLAUDE.md
```
Expected: latest коммит трогает только CLAUDE.md; `v1.27` встречается ≥1 раз; `§15` встречается ≥2 раз (§0 + §1 footer).
---
## Task 6: Register hook в .claude/settings.json
**Files:**
- Modify: `.claude/settings.json` — добавить новый `PreToolUse` block с `matcher: "Task"`
- [ ] **Step 6.1: Найти существующий PreToolUse секцию**
Run:
```bash
grep -n '"PreToolUse"' .claude/settings.json
```
Expected: одна строка (например `"PreToolUse": [`).
- [ ] **Step 6.2: Добавить новый matcher block**
Внутри массива `PreToolUse` добавить **новый** объект-block (НЕ внутри существующего `matcher: "Edit|Write"` block, отдельный объект массива):
```json
{
"matcher": "Task",
"hooks": [
{
"type": "command",
"command": "node \"C:/моя/проекты/портал crm/Документация/tools/subagent-prompt-prefix.mjs\""
}
]
}
```
Точный путь — абсолютный (паттерн из существующих ruflo-хуков в этом же файле). Запятая после предыдущего объекта массива обязательна — `Edit|Write` объект должен оканчиваться `},`.
- [ ] **Step 6.3: Validate JSON**
Run:
```bash
node -e "JSON.parse(require('fs').readFileSync('.claude/settings.json','utf8')); console.log('OK')"
```
Expected: `OK`. Если ошибка — STOP, ловить trailing comma / unbalanced brace.
- [ ] **Step 6.4: Smoke test end-to-end**
Перезапустить Claude Code (хук перечитывается на старте сессии). В новой сессии запустить тривиальный Task — субагент должен в ответе содержать `=== SUBAGENT GIT-SAFETY HEADER ===` в начале промпта (можно проверить, попросив субагента выписать первые 10 строк своего промпта).
Если перезапуск Claude Code невозможен в текущем рабочем потоке — отметить шаг как «verified at next session start» в коммит-сообщении.
- [ ] **Step 6.5: Commit**
```bash
git add .claude/settings.json
git commit -m "chore(hooks): register subagent-prompt-prefix PreToolUse Task hook
Регистрирует tools/subagent-prompt-prefix.mjs как PreToolUse-хук
matcher:'Task'. JSON валиден (node -e JSON.parse). End-to-end smoke
verified at next session start (хук перечитывается на старте сессии).
Per Pravila §15.1 (третье hard-rule).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
```
---
## Task 7: Wrapper-скил subagent-driven-development
**Files:**
- Create: `.claude/skills/subagent-driven-development/SKILL.md`
- Create: `.claude/skills/subagent-driven-development/references/git-safety-checklist.md`
- [ ] **Step 7.1: Create SKILL.md (wrapper)**
Полное содержимое:
```markdown
---
name: subagent-driven-development
description: Project-local wrapper для superpowers:subagent-driven-development — добавляет обязательный git-safety verify-протокол per Pravila §15.1. Использовать вместо marketplace-варианта при работе с git-коммит-задачами в субагентах.
---
# Subagent-Driven Development (project wrapper)
Этот скил — проектная обёртка над marketplace-скилом `superpowers:subagent-driven-development`. Дополняет его обязательным git-safety verify-протоколом per Pravila §15.1.
## Когда использовать
Когда нужно делегировать задачу субагенту через Task tool — особенно git-коммит-задачи (Sprint 6 прецедент: Haiku-субагенты угнали ветку параллельной сессии).
## Что делать
1. **Откройте marketplace-скил** `superpowers:subagent-driven-development` для общего workflow (fresh subagent per task + two-stage review).
2. **Перед каждой Task-инвокацией** прочитайте и выполните pre-spawn-чеклист — [references/git-safety-checklist.md](references/git-safety-checklist.md) §A.
3. **После каждой Task-инвокации** прочитайте и выполните post-subagent-чеклист — там же §B.
4. **Hard-rule §15.1** — git-коммит-задача = модель Sonnet/Opus, никогда Haiku. Read-only git-операции (`log`, `status`, `diff`, `rev-parse`, `branch --show-current`, `worktree list`) разрешены любой модели.
Хук `tools/subagent-prompt-prefix.mjs` (зарегистрирован в `.claude/settings.json`) автоматически инжектит git-safety заголовок в каждый Task-prompt — это **первая** линия защиты. Чеклист из этого скила — **вторая** линия (защита со стороны контроллера).
## Cross-refs
- Pravila §15.1 — hard-rule субагенты + git.
- Spec: `docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md` §5.
- Memory: `memory/feedback_subagent_git_reliability.md`.
```
- [ ] **Step 7.2: Create references/git-safety-checklist.md**
Полное содержимое:
```markdown
# Git-safety Checklist для контроллера субагентов
Per Pravila §15.1 — выполнять каждый раз при делегировании задачи через Task tool.
## §A. Pre-spawn чеклист (до Task-инвокации)
1. **Резолвите 4 значения** (запишите у себя для post-check):
```bash
git branch --show-current # → ожидаемая ветка
git rev-parse HEAD # → pre-spawn parent SHA
git rev-parse --show-toplevel # → worktree root
pwd # → cwd
```
1. **Выберите модель** субагенту:
- Задача требует `git commit`/`push`/`stage`/`checkout`/`switch`/`merge`/`rebase`? → **Sonnet или Opus**, никогда Haiku (§15.1).
- Только read-только `git log`/`status`/`diff`/`rev-parse` ИЛИ только Edit/Read/Grep? → любая модель.
2. **Если задача правит нормативку из списка §15.2** (Pravila / CLAUDE.md / Tooling / PSR_v1 / MEMORY.md / Открытые_вопросы / docs/adr/* / db/schema.sql):
```bash
git fetch origin && git log HEAD..origin/main --oneline
```
Не пусто → **ребейз/merge до инвокации**, не после. Pre-flight также проверить `docs/sessions/CURRENT.md` на конфликт scope-files / version-claims.
## §B. Post-subagent чеклист (сразу после возврата субагента)
1. **`git rev-parse HEAD`** — сравнить с pre-spawn parent SHA.
- Равно → субагент не коммитил (OK для Edit-задач без commit).
- Отличается ровно одним коммитом, чей parent = pre-spawn HEAD → OK для commit-задач.
- **Иначе → STOP, разбор инцидента.**
2. **`git branch --show-current`** — сравнить с pre-spawn branch.
- Не равно → **STOP, разбор инцидента** (Sprint 6 паттерн).
3. **`git log -1 --format='%s%n%P'`** — проверить subject + parent последнего коммита.
- Subject соответствует задаче?
- Parent = pre-spawn HEAD?
4. Если несколько коммитов — ручная проверка subject'ов каждого.
## §C. Red-flag-список — любой = hard-stop разбор
- `branch ≠ ожидаемая`;
- `parent коммита ≠ pre-spawn HEAD` (висячий коммит / попадание на чужую ветку);
- HEAD двинулся, но субагент в отчёте об этом не упомянул;
- в diff'е есть файлы вне scope задачи.
## §D. Обязательный формат отчёта субагента
Субагент в конце ответа выписывает блок:
```
=== GIT REPORT ===
cwd: <pwd>
branch: <git branch --show-current>
HEAD: <git rev-parse HEAD>
HEAD^: <git rev-parse HEAD^>
status: <git status --short>
=== END GIT REPORT ===
```
Отсутствие блока = контроллер считает результат недостоверным и запускает §B-чеклист сам через Bash.
## §E. Соотношение с code-review
Двухстадийное review (Pravila §4.5 / PSR_v1 R10) сохраняется. Git-safety-чеклист **не заменяет** code-review — он стоит **до** него (нет смысла ревьюить diff, если он не в той ветке).
```
- [ ] **Step 7.3: Verify скил**
Run:
```bash
ls -la .claude/skills/subagent-driven-development/
ls -la .claude/skills/subagent-driven-development/references/
```
Expected: SKILL.md + references/git-safety-checklist.md существуют.
- [ ] **Step 7.4: Commit**
```bash
git add .claude/skills/subagent-driven-development/
git commit -m "feat(skills): subagent-driven-development project wrapper + git-safety-checklist
Project-local обёртка над marketplace-скилом superpowers:subagent-driven-development.
Добавляет обязательный pre/post-subagent git-safety verify-протокол
per Pravila §15.1 (Sprint 6 прецедент-источник: Haiku-субагенты
угнали ветку параллельной сессии).
Состав:
- SKILL.md — точка входа, ссылка на marketplace + §A/§B/§C из checklist.
- references/git-safety-checklist.md — pre-spawn / post-subagent / red-flags / GIT REPORT format / code-review boundary.
Хук tools/subagent-prompt-prefix.mjs — первая линия защиты (auto-inject),
этот checklist — вторая линия (контроллер verify).
Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md §5.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
```
---
## Task 8: Final regression + push
**Files:** none (verification + push only)
- [ ] **Step 8.1: Update CURRENT.md status — release**
Прочитать `docs/sessions/CURRENT.md`, изменить запись текущей сессии:
- `status: in-progress``status: closed-<последний commit SHA из git log -1>`
Это **append-only** правка в смысле жизненного цикла — запись остаётся, только меняется статус.
- [ ] **Step 8.2: Commit status change**
```bash
git add docs/sessions/CURRENT.md
git commit -m "chore(sessions): release parallel-sessions-coordination session
status: in-progress → closed-<sha>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
```
- [ ] **Step 8.3: Verify everything is staged correctly**
Run:
```bash
git status
git log --oneline origin/main..HEAD
```
Expected: working tree clean (кроме dirty файлов вне нашего scope: `.gitignore`, `app/dev-indices.json`, `_demo_*` — не трогаем); `git log` показывает 8 atomic commits (по одному на task'у, + spec-commit `235b1d4` из brainstorming).
- [ ] **Step 8.4: Pre-push full regression**
Run параллельно (в одном tool-сообщении):
```bash
./bin/gitleaks.exe detect --source . --redact -v
```
Expected: 0 leaks (full history scan).
```bash
./bin/lychee.exe --no-progress 'docs/**/*.md' '*.md'
```
Expected: 0 broken links.
(Pest --parallel / Vitest — пропускаем: scope не трогает PHP/JS-код приложения, только tools/+docs/+.claude/. Если settings.json правка влияет на запуск сессии — это не testable в этом репо.)
- [ ] **Step 8.5: Push to origin (только после явного «делай push» от заказчика)**
```bash
git push origin feat/parallel-sessions-coordination:feat/parallel-sessions-coordination
```
Затем — либо PR через GitHub MCP, либо прямой FF-merge на main по решению заказчика. PR-вариант предпочтителен из-за объёма (8 atomic commits + новая нормативка §15).
- [ ] **Step 8.6: Update memory `MEMORY.md`**
Через `/claude-md-management:revise-claude-md` (capture session-learnings) ИЛИ ручной Edit `memory/MEMORY.md` + создание `memory/project_parallel_sessions.md`. Важные факты:
- Pravila §15 — третье hard-rule (после §12, §14).
- `docs/sessions/CURRENT.md` — claim/check/release координация.
- Хук `tools/subagent-prompt-prefix.mjs` — PreToolUse Task auto-inject.
- Wrapper-скил `.claude/skills/subagent-driven-development/`.
- Прецедент Sprint 6 → исторический корень §15.1.
---
## Self-Review
**1. Spec coverage** — каждая секция spec'а покрыта:
- spec §0 Контекст — упомянут в Goal плана.
- spec §1 Архитектура — 4 артефакта → tasks 1, 2, 3+4+6, 7.
- spec §2 Pravila §15 — Task 1 целиком (15.1/15.2/15.3 + список 8).
- spec §3 CURRENT.md — Task 2 (формат + lifecycle + retro-claim).
- spec §4 Хук — Tasks 3 (TDD red) + 4 (green) + 6 (register).
- spec §5 Verify-протокол — Task 7 (wrapper-skill + references).
- spec §6 Тесты+migration — Tasks 3+4 (хук-тесты), Task 2 (retro-claim migration), Task 8 (final regression).
- spec §7 Ограничения — учтены в pre-flight (§15 свободен verified) и в Task 7 (references-wrapper вместо vendor-патча — confirmed `.claude/skills/subagent-driven-development/` отсутствует).
- spec §8 Acceptance — все 7 пунктов адресованы tasks.
**2. Placeholder scan** — все шаги содержат конкретный код / точную команду / ожидаемый вывод. Никаких «TBD / implement later / add validation».
**3. Type consistency** — формат хука (JSON output структура) consistent между Task 3 (тесты) и Task 4 (имплементация): `hookSpecificOutput.updatedInput.prompt`, `hookEventName: 'PreToolUse'`, `permissionDecision: 'allow'`. GIT REPORT формат (`cwd / branch / HEAD / HEAD^ / status`) consistent между Task 4 (header instructs subagent) и Task 7 (checklist §D).
**4. Гарантии TDD** — Task 3 явно требует RED-фазу (тесты падают), Task 4 — GREEN. Атомарные коммиты RED-then-GREEN сохраняют TDD-историю.
---
## Risks / Out-of-scope
- **Smoke-test перезапуска сессии** (Task 6 Step 6.4) — может не сработать в текущем рабочем потоке (если плановщик хочет провести все таски в одной сессии). Mitigation: «verified at next session start» отметка в commit'е.
- **Retro-claim accuracy** (Task 2 Step 2.3) — `scope-files` для existing worktrees заполнены best-effort из `git log -1 --name-only`. Точность ограничена; активные сессии при возобновлении обновят свой блок. Spec §6.2 явно фиксирует «§15 действует с момента введения, не ретроактивно».
- **CLAUDE.md правки через плагин** (Task 5) — `/claude-md-management:claude-md-improver` может предложить другие версии bump'а или другую формулировку footer-абзаца — это нормально, плагин — owner CLAUDE.md (§5 п.10).
- **Out-of-scope** (явный YAGNI из spec §6.3): реестр зарезервированных версий, pre-commit hook на CURRENT.md, JSON-формат CURRENT.md, запрет параллельных сессий, изменения PSR_v1/Tooling, subagent-без-git (вариант C).
@@ -0,0 +1,171 @@
# Anthropic Dev-Tooling Formalization — Design
**Date:** 2026-05-18
**Topic:** Формализация 5 Anthropic-плагинов уже включённых в `~/.claude/settings.json` user-level, но без номера в реестре Tooling §3.3 / PSR_v1 R10.1.
**Deciders:** Дмитрий
**Method:** аудит «мозга» через discovery-interview (SYSTEM-режим, 2026-05-18). Решение по варианту (а) — формализовать все 5, риски закрыть предварительно.
---
## Goal
Закрыть **L1-паттерн** «плагин фактически включён в settings.json без формализации в правилах» (зафиксирован 2026-05-10 на UPM/21st; повторился 2026-05-13 на Sentry/Redis MCP). За неделю интеграционных эпиков (A6/D3/C9/A11/A3/A4/deptrac/C10/discovery) реестр Tooling вырос с 35 до 55 позиций, но **5 Anthropic dev-плагинов** оставались формализационным долгом — они есть в карте (iter7 audit 16.05.2026), но не в Tooling/PSR/Pravila.
Превратить долг в полноценные позиции #56#60 с двумя новыми off-phase подкатегориями, по проверенному паттерну C10/A11/A3.
---
## Context
**5 плагинов в `~/.claude/settings.json` `enabledPlugins` без номера:**
1. `skill-creator@claude-plugins-official` (Anthropic) — создание скилов, performance-метрики, оптимизация описаний для триггеринга
2. `plugin-dev@claude-plugins-official` (Anthropic) — конструктор плагинов: 8 sub-skills (plugin-structure / agent-development / skill-development / command-development / hook-development / mcp-integration / plugin-settings) + 2 агента (agent-creator, plugin-validator, skill-reviewer)
3. `hookify@claude-plugins-official` (Anthropic) — генератор хуков из анализа транскриптов или явных инструкций (`/hookify` + skill `writing-rules` + агент `conversation-analyzer`)
4. `claude-code-setup@claude-plugins-official` (Anthropic) — анализатор кодовой базы + рекомендации Claude Code automations (`/claude-automation-recommender`)
5. `context7@claude-plugins-official` (Anthropic) — MCP-документация для библиотек/фреймворков (актуальные доки React/Laravel/Vue/Prisma/Tailwind/…)
**Карта (`docs/automation-graph.html`)** иметь 5 соответствующих узлов: `skill_creator`, `plugin_dev`, `hookify_plugin`, `claude_setup`, `context7` — добавлены в iter7 audit-actualization 16.05.2026. Узлы **есть**, но nd()-блоки не несут номера/правил, и edge к `psr_v1` «R10.1 блок 1» — отсутствуют. Один из узлов (`hookify_plugin`) уже носит 🔴-конфликт `hookify_plugin ↔ hk_pre_claude` (карта строка 1844).
**Project-level `.mcp.json`** — все 9 MCP формализованы (#2/#3/#10/#25/#34/#35/#45/#47 + ruflo §4.10). User-level `.claude.json` `mcpServers` — только `magic` (#32). Project `.claude/settings.json` hooks — описаны в Pravila §14 / Tooling §14. Утечек инвентаря вне 5 пунктов выше **нет**.
**Прецеденты формализации post-факт:**
- 2026-05-10 (UPM #31 + 21st Magic MCP #32) — после явного вопроса заказчика «хочу добавить плагины»
- 2026-05-13 (Sentry MCP #34 + Redis MCP #35) — retrospective в v1.92 после PR #3 merge
- 2026-05-17/18 (A6/D3/C9/A11/A3/A4/deptrac/C10/discovery) — проактивная сектор-за-сектором формализация
---
## Decisions
### D1: Две off-phase подкатегории, не одна
Семантика разная — нельзя свалить в одну категорию:
- **authoring-tooling** (создание Claude-артефактов): `skill-creator` #56, `plugin-dev` #57, `hookify` #58
- **dev-support** (поддержка/документация Claude-разработки): `claude-code-setup` #59, `context7` #60
Это даёт более чистые правила в R10.1 и более точные триггеры в Pravila §13.2.
### D2: hookify — отдельное hard-правило в R10.1 (закрывает 🔴-конфликт)
Текущее состояние: 🔴-конфликт `hookify_plugin ↔ hk_pre_claude` на карте (плагин hookify может перезаписать существующие хуки в `~/.claude/settings.json` без diff).
Правило закрытия:
> hookify вызывается **только по явному `/hookify`**, не проактивно. Перед генерацией хука — обязательный pre-check на коллизию с уже-зарегистрированными хуками в `~/.claude/settings.json` (особенно: economy-mode / skill-marker / skill-check / state-guard / postcompact / verifier — это 6-компонентная архитектура runtime-enforcement, никакие из них не должны перезаписываться). При обнаружении коллизии — остановка с пометкой «hookify не может выполнить генерацию автоматически — требуется ручное согласование изменений в settings.json».
После правила: 🔴 → 🟢 (закрыто правилом).
### D3: skill-creator ↔ plugin-dev:skill-development — граница
Оба умеют создавать скилы. Граница:
- **skill-creator** — для **standalone** скилов (`.claude/skills/<name>/`), c performance-метриками и benchmarking. Использовать первым при создании нового **проектного** скила.
- **plugin-dev:skill-development** — для скилов **внутри marketplace-плагина**, который ты разрабатываешь. Использовать только при работе над собственным Claude-плагином (не наш кейс на 2026-05-18).
Дополнительно: **вендоренные сторонние скилы** (`.claude/skills/mermaid/`, `data-scientist/`, `ccpm/`) и **self-authored проектные** (`audit-portal/`, `regression/`, `process-modeling/`, `process-analysis/`, `discovery-interview/`) — модифицируются **прямым Edit**, не через skill-creator (он может предложить переписать как новый, потерять провенанс).
### D4: context7 ↔ WebFetch ↔ WebSearch — граница источников документации
Текущая практика: я обращался к context7 на A11/A3/discovery эпиках для актуальных доков (Laravel/Pest/Vue), но это нигде не документировано.
Правило в R10.1 dev-support:
- **context7** — первый выбор для документации **известной библиотеки** (Laravel, Vue, React, Pest, Vuetify, Tailwind, …). MCP отдаёт актуальную версию из upstream, обходит cutoff training data.
- **WebFetch** — fallback на конкретный URL (GitHub README, ADR-документ внешнего проекта).
- **WebSearch** — поиск без знания URL, либо актуальные события/статьи.
### D5: claude-code-setup — read-only анализатор
`/claude-automation-recommender` — анализирует кодовую базу и предлагает плагины/хуки/скилы. Правило:
- Рекомендации **фильтровать** через R0 stack-gate + R10.1 (R0.6 hard-стопы — брендовое UI, ru-стек, уже формализованное и т.п.).
- **Не устанавливать** ничего по рекомендации без явного согласования с заказчиком.
- Использование read-only/advisory — не trigger'ит R6.0/R6.1/R14.
### D6: ADR-010 — новый ADR-документ
По образцу ADR-004 (C9 project-management) / ADR-005 (deptrac) / ADR-006 (A4 design) / ADR-007 (A11 ml-ai) / ADR-008 (C10 business-process) / ADR-009 (discovery-interview). Содержание: формализация retrospective, split на 2 подкатегории, locked границы D2-D5.
Альтернатива (retrospective без ADR, как Sentry/Redis #34/#35 в v1.92) — отвергается: тут 5 позиций и 2 новые подкатегории, decision-grain выше — ADR обязателен.
### D7: Карта — refresh, не add
Узлы skill_creator / plugin_dev / hookify_plugin / claude_setup / context7 в карте **есть** (iter7 16.05). Нужно:
- Обновить лейблы 4 узлов-правил (Pravila/CLAUDE.md/PSR_v1/Tooling) на новые версии **v1.27 / v2.14 / v3.13 / v2.14** (после A6 v1.24/v2.10/v3.10/v2.10 дрейф копится — последний refresh `de66b8b` 17.05; за C10 и discovery + сейчас за this эпик)
- Каждому из 5 узлов — обновить nd() с номером (#56-#60), категорией, ограничениями, edge к `psr_v1` «R10.1 блок 1»
- Конфликт `hookify_plugin ↔ hk_pre_claude` — 🔴 → 🟢 с rule «D2 правило в R10.1»
- NODE_META.changed → 18.05.2026 для всех 5
- tooling-узел nd() count: «70 / 50» → «75 / 55» (после регистрации 5 позиций) — но это уже стало неактуально (последний refresh говорит 70/50, после C10 и discovery — реально 75/55 уже). Verify Task 7.
- `NODE_SECTION` — узлы остаются в текущих разделах (E7), не перетегируются (REU4 паттерн)
- Метрики карты — 124/130 (узлы и рёбра без изменений в количестве; только nd-наполнение + 5 новых edge к psr_v1 = 124/135)
### D8: Memory — single-bump
После эпика — update `feedback_plugin_paired_stack.md` (active versions + 6-я off-phase подкатегория — wait, после A11 их уже 10, после C10 11, после discovery 12, после нас 13). MEMORY.md и project_state.md — стандартные version bumps.
---
## Conflict audit — locked
Полный аудит R1–R14 проведён в discovery-сессии 2026-05-18. Сводка:
| # | Риск | Severity | Locked resolution |
|---|---|---|---|
| R1 | hookify может перезаписать settings.json (🔴) | 🟡 → 🟢 после правила | D2 — отдельное правило pre-check в R10.1 |
| R2 | plugin-dev может предложить переделать наши self-authored скилы | 🟡 | D3 — граница «standalone vs marketplace; вендоренное/self-authored — direct Edit» |
| R3 | skill-creator ↔ plugin-dev:skill-development overlap | 🟢 | D3 — граница |
| R4 | context7 ↔ WebFetch ↔ WebSearch overlap | 🟢 | D4 — приоритет |
| R5 | claude-code-setup может предложить установить плагин | 🟢 | D5 — read-only фильтр |
| R6 | Карта: 5 узлов есть, без номеров и edge | 🟢 | D7 — refresh + 5 новых edge |
| R7 | Категоризация в одну подкатегорию запутает | 🟢 | D1 — две подкатегории |
| R8 | User-level настройки на 16 параллельных проектах машины | 🟢 | Формализация в Лидерра-нормативке не ломает другие проекты |
| R9 | Кодовая регрессия | 🟢 | Её нет — только текстовая нормативка; pre-commit + pre-push стандарт |
| R10 | Темп: 5 позиций в один эпик | 🟢 | Норм — посильно по образцу A11 (3) / C10 (4) |
| R11 | ADR нужен? | 🟢 | D6 — да, ADR-010 |
| R12 | Memory upd | 🟢 | D8 — стандартный bump |
| R13 | Версии нормативки | 🟢 | Tooling v2.13→v2.14 / PSR v3.12→v3.13 / Pravila v1.26→v1.27 / CLAUDE.md v2.13→v2.14 |
| R14 | Конфликт-аудит пометки в Tooling §3.3 | 🟢 | По образцу AK1/MK1/ML3/LINT1 — короткие SC1-SC5 / PD1-PD3 / HK1-HK3 / CCS1 / CTX1 |
---
## File structure
| File | Action | Responsibility |
|---|---|---|
| `docs/adr/ADR-010-anthropic-dev-tooling.md` | Create | Формализация retrospective decision, split 2 подкатегории, locked границы D2-D5 |
| `docs/Tooling_v8_3.md` | Modify | Прил. Н — 2 новых subsection (§4.31 authoring-tooling, §4.32 dev-support); §4.31-§4.35 5 позиций (#56-#60); §0 счётчик 55→60 |
| `docs/Plugin_stack_rules_v1.md` | Modify | R10.1 Блок 1 — +5 строк с ролями и triggers; hookify-special note (D2); §0 +entry v3.13 |
| `docs/Pravila_raboty_Claude_v1_1.md` | Modify | §13.2 — +2 абзаца (authoring-tooling + dev-support); §0 +entry v1.27 |
| `CLAUDE.md` | Modify (через `/claude-md-management:claude-md-improver` ИЛИ прямой Edit в worktree — §5 п.10 worktree-эксцепшн, прецедент A11/C10/discovery v2.10/v2.12/v2.13) | §3 title 55→60; §1 priority chain row 2b 55→60; §3.3 +5 строк #56-#60; §3.3 footer 55→60 + 13 off-phase подкатегорий; §0 cross-refs Pravila v1.27 / PSR v3.13 / Tooling v2.14; §6 +абзац интеграции; §9 +entry v2.14; шапка v2.13 → v2.14 |
| `docs/CHANGELOG_claude_md.md` | Modify | Entry v2.14 |
| `docs/automation-graph.html` | Modify | 5 узлов (skill_creator/plugin_dev/hookify_plugin/claude_setup/context7) — refresh nd() с номерами + edge к `psr_v1`; 4 узла-правила — refresh лейблы под новые версии; конфликт hookify ⊥ hk_pre_claude 🔴→🟢; tooling-узел nd() count refresh |
| `MEMORY.md` + `feedback_plugin_paired_stack.md` + `project_state.md` + `reference_archive.md` | Modify | Standard bumps + new memory `project_anthropic_dev_tooling.md` для этой интеграции |
**Files NOT modified:**
- `~/.claude/settings.json` — настройки не трогаем (плагины уже включены)
- `~/.claude.json` — то же
- `.mcp.json` — не затронут (только context7 — но он `enabledPlugins`, не MCP-сервер в .mcp.json)
- `lefthook.yml` — нет хуков от этих плагинов в pre-commit/pre-push
- Test files — кодовой регрессии нет
---
## Severable scope
**Core scope (Task 19):** ADR-010 + 4 normative files + map refresh + memory + pre-push + push. Закрывает эпик целиком.
**Out of scope (defer):**
- Изменение `enabledPlugins` (выключение/включение) — это вариант (б)/(в), отвергнут заказчиком в пользу (а)
- Изменение хуков hookify в `.claude/settings.json` — формализуем правило, не код
- Создание `docs/<category>/README.md` (как сделано в A11 `docs/ml/`, C10 `docs/process/`, discovery `docs/discovery/`) — для authoring-tooling и dev-support **не нужно**: это infrastructure-категория, не имеет проектных артефактов (как и claude-md-management #33 не имеет `docs/claude-md/`). Pravila §13.2 абзаца + Tooling subsection достаточно.
---
## Sequencing
Worktree уже создан: `.claude/worktrees/anthropic-dev-tooling`, branch `feat/anthropic-dev-tooling`, базовый коммит origin/main `b40f2c8` (последний — discovery-interview map node).
Все 9 tasks плана исполняются в этой ветке последовательно (механика суб-агентов разрешена, но git-задачи — контроллер Sonnet, никакого Haiku-commit, урок Sprint 3F/5/6). Push: `git push origin feat/anthropic-dev-tooling:main` после pre-push (gitleaks-full-history + lychee).
@@ -0,0 +1,133 @@
# Discovery Interview — интеграция skill: дизайн
**Дата:** 18.05.2026
**Статус:** Принят (brainstorming-сессия 18.05.2026 — заказчик одобрил «Тяжёлый» вариант + режимы FEATURE & SYSTEM)
**Раздел карты:** новая 12-я off-phase подкатегория `discovery-tooling`
**Связано:** ADR-009, план `docs/superpowers/plans/2026-05-18-discovery-interview-integration.md`
## 1. Контекст и проблема
При запросе новой фичи Claude склонен сразу уходить в решение (`brainstorming`
solution-leaning). Расплывчатые/проблемные запросы заказчика («менеджеры
жалуются на X», «сделки теряются») требуют сначала вскрыть **проблему** — JTBD,
текущий обходной путь, цену боли — до проектирования.
Аналогично у заказчика нет быстрого способа получить **синтезированную
ориентацию** по состоянию проекта (карта / тулчейн / открытые вопросы):
CLAUDE.md и MEMORY грузятся пассивно, `audit-portal` даёт тяжёлый качественный
вердикт, не ориентацию, карта — статичный граф.
discovery interview — техника продуктового / customer discovery: структурированное
интервью, вскрывающее проблему до решения (Blank — customer development, Torres —
continuous discovery, JTBD).
## 2. Решение
Skill `discovery-interview` — проектный vendored-скил в `.claude/skills/`, два режима:
- **FEATURE** — интервью заказчика перед фичей.
- **SYSTEM** — интервью-ориентация по мета-слою проекта.
Режим «интервью конечных пользователей» — **не входит**, defer post-Б-1 (нет живых
пользователей Лидерры; дублировал бы `design:user-research` /
`product-management:synthesize-research`).
### 2.1. Несущий принцип — разрез по трём слоям-источникам
Параллельная сессия 17.05.2026 закрыла раздел C10 карты и создала skill
`process-analysis` (#53), чей режим 1 называется «process discovery». Чтобы
`discovery-interview` не стал дублем (§5 п.6 CLAUDE.md), способности разведены по
**слою-источнику данных**:
| Способность | Слой-источник | Метод |
|---|---|---|
| `process-analysis` (C10 #53) | app-код — `routes/`, `app/Jobs`, `audit_*` | реконструкция бизнес-процесса из кода |
| discovery-interview **FEATURE** | голова заказчика | интервью человека |
| discovery-interview **SYSTEM** | мета-слой — карта, CLAUDE.md, MEMORY, Открытые_вопросы, Tooling, git log | интервью + синтез |
Три непересекающихся слоя-источника → метод не дублируется → §5 п.6 соблюдён.
Объединяющая нить скила — структурированное интервью **человека**;
`process-analysis` человека не интервьюирует вообще.
## 3. Режим FEATURE
- **Триггер:** запрос проблемной формы — боль / жалоба / цель без готового решения.
- **SKIP:** чёткий директив («интегрируй X», «закрой находку Y», «поправь Z»).
- **Процесс:** JTBD-интервью — прошлое поведение вместо гипотетики, один вопрос за
раз, 5׫почему» до корня, не наводящие вопросы.
- **Артефакт:** discovery-brief — проблема / JTBD / текущий обходной путь / цена
боли / сигнал успеха / ограничения.
- **Хэндофф:** brief → `brainstorming` как проблемная секция спеки; brainstorming
забирает её и **не перезадаёт** уже выясненные вопросы.
## 4. Режим SYSTEM
- **Триггер:** запрос ориентации — «сориентируй по проекту», «где мы сейчас», «что
в тулчейне / карте», «catch-up по X».
- **SKIP:** «как устроен процесс …», «process discovery», «где узкое место» — это
`process-analysis`.
- **Процесс:** короткое интервью — уточнить, что именно ориентировать (scope) →
синтез по мета-слою → ответ.
- **Запрет:** SYSTEM **не читает `app/`-код** — это исключительный метод
`process-analysis`. Источники SYSTEM — только мета-слой.
- **Артефакт:** system-snapshot → `docs/discovery/YYYY-MM-DD-*.md`.
## 5. Границы (конфликт-аудит)
- **DI1** FEATURE ↔ `brainstorming` — FEATURE покрывает только проблемное поле,
условный триггер + SKIP на директив, чистый хэндофф.
- **DI2** SYSTEM ↔ `process-analysis` — разрез по слою-источнику; SYSTEM запрещено
читать `app/`-код.
- **DI3** SYSTEM ↔ `audit-portal` / карта — SYSTEM = активный синтез-ответ на запрос
ориентации, не качественный вердикт (`audit-portal`) и не статичный дамп
(карта / MEMORY).
- **DI4** триггер-коллизия слова «discovery» — лексическое разведение триггеров
(мои триггеры не используют голое «discovery» / «процесс») + взаимный SKIP в
«Границах» `discovery-interview` и `process-analysis`.
- **DI5** over-firing от «1%-правила» using-superpowers — консервативные триггеры,
явные SKIP-примеры, eval триггер-описания через `skill-creator`.
- **DI6** режим «интервью пользователей» — defer post-Б-1.
- **§12.2:** discovery-interview — *проектный* скил (как `audit-portal`,
`regression`), не Superpowers-скил → регистрируется в Pravila §13.2, **не** в
§12.2 (§12.2 — карта Superpowers-скилов). Триггерится штатным механизмом
using-superpowers по `description`.
## 6. Эффективность
«Максимальная эффективность в использовании» = скил точно срабатывает в нужный
момент и молчит в ненужный. Рычаги:
1. Консервативный триггер — FEATURE срабатывает только на проблемных запросах.
2. Явные SKIP-примеры в `description` — против «1%-правила».
3. Чистый хэндофф в `brainstorming` — без дубля вопросов.
4. JTBD-дисциплина зашита в теле SKILL.md.
5. Персистентные артефакты — FEATURE-brief в спеке, SYSTEM-snapshot в `docs/discovery/`.
Контроль — eval триггер-описания через `skill-creator`: кейс-сет «должен / не
должен сработать», включая спорные («сделай discovery», «как у нас дела») →
итерировать описание, пока точность чистая. Fallback при остаточной коллизии с
`process-analysis` — переименование скила (имя без слова «discovery»).
## 7. Интеграционный footprint («Тяжёлый» вариант)
- Skill `.claude/skills/discovery-interview/``SKILL.md` + `references/`.
- `docs/discovery/` — home SYSTEM-snapshot'ов + `README.md` + шаблоны.
- `docs/adr/ADR-009-discovery-interview-tooling.md`.
- Tooling Прил. Н **v2.13** — инструмент **#55**, **§4.30**, новая 12-я off-phase
подкатегория `discovery-tooling`; счётчик 54→55 формализованных (74→75 total),
off-phase row +24→+25.
- PSR_v1 **v3.12** — R10.1.
- Pravila **v1.26** — §13.2 (как проектный скил; §12.2 не трогается — см. DI §12.2).
- CLAUDE.md **v2.13** — §3 title-counter, §1 row 2b counter, §3.3 строка, §6 абзац,
§9 запись, §0 cross-refs. Правка прямым Edit — worktree-constraint эксцепшн §5
п.10 (прецедент A11 v2.10 / ADR-006 v2.11).
- `docs/automation-graph.html` — узел `discovery_interview`, рёбра к
`brainstorming` + governing-правилам + ребро-граница к `process-analysis`.
- `.claude/skills/process-analysis/SKILL.md` — +1 строка в «Границы» (взаимный
SKIP) как разрешение реального overlap.
## 8. Не входит
- Режим «интервью конечных пользователей» — defer post-Б-1.
- Реальный прогон интервью при интеграции (скил создаётся, не исполняется).
- Переименование скила — только fallback по результату eval (Фаза 2).
@@ -0,0 +1,275 @@
# Параллельные сессии: координация — дизайн
**Дата:** 2026-05-18
**Автор:** Claude (Opus 4.7, brainstorming с Дмитрием, экономия 5%)
**Статус:** черновик → ревью заказчика → writing-plans
**Связано:** Pravila §12 / §14 (hard rules), memory `feedback_subagent_git_reliability.md`, Sprint 6 инцидент.
---
## 0. Контекст и проблема
При параллельной работе нескольких Claude-сессий на одном репозитории — что является ежедневной нормой проекта (на 18.05.2026 в `git worktree list` 16 активных worktrees) — наблюдаются два класса инцидентов:
**Класс A — субагенты теряются между worktree.**
Запущенный из контроллера субагент (особенно Haiku) путает рабочую директорию или ветку: коммитит в чужую ветку, делает orphan-коммит, не возвращает git-state в отчёте. Прецедент — Sprint 6: Haiku-субагенты угнали ветку параллельной сессии, инцидент устранён через `git reflog` + `reset`. Корневая причина — контроллер не верифицирует HEAD/branch после Task-инвокации.
**Класс B — нормативка/MEMORY дрейфует.**
Параллельные сессии правят один и тот же набор файлов (Pravila / CLAUDE.md / Tooling / PSR_v1 / MEMORY.md / `Открытые_вопросы_*.md`) и претендуют на один version-номер. Прецедент — 17.05.2026: ADR-006 D4 и C10 одновременно претендовали на Tooling v2.11, C10 пришлось переномеровать в v2.12 (видно в шапке CLAUDE.md). За неделю 18.05.2026 разделы A11/A3/A4/A6/C9/C10/discovery-interview — все 7 — трогали один набор из 4 нормативных файлов.
Обе проблемы — следствие одного: **параллельность без явного контракта на scope**.
## 1. Архитектура
Решение из 4 артефактов, без новых плагинов / MCP-серверов:
1. **Pravila §15** (новое hard-rule) — два пункта: §15.1 (субагенты + git), §15.2 (нормативка + pre-flight sync). Hard-rule = §9 «Отступления» не применяется (как §12 и §14).
2. **`docs/sessions/CURRENT.md`** — заявочный лог активных параллельных сессий.
3. **`.claude/hooks/subagent-prompt-prefix.mjs`** — PreToolUse-хук, инжектящий в каждый `Task`-prompt заголовок git-safety.
4. **Verify-протокол** в скиле `superpowers:subagent-driven-development` — pre-spawn + post-subagent чеклист контроллера.
Зависимости: артефакт 1 (Pravila §15) — корень всех правил; артефакты 2–4 ссылаются на §15.1 / §15.2 как enforcement floor.
## 2. Pravila §15 — текст обоих пунктов
### §15.1 Субагенты + git
> Git-коммит-задачи субагенту (любой `Task`-инвокейшн, чей prompt содержит `git commit`, `git push`, `git stage`, `git checkout`, `git switch`, `git merge`, `git rebase`, либо где явно ожидается коммит в результате) — **только модель Sonnet или Opus**, никогда Haiku. Контроллер, делегирующий git-операцию Haiku-субагенту — нарушение §15.1, фиксируется в feedback того же уровня, что §12.
>
> Исключение — read-only git-операции (`git log`, `git status`, `git diff`, `git rev-parse`, `git branch --show-current`, `git worktree list`) — разрешены любой модели.
### §15.2 Нормативные правки + pre-flight sync
> Любая правка файлов из списка «нормативка» (см. ниже) выполняется **только** на актуальной базе `origin/main`. Pre-flight обязателен: `git fetch origin && git log HEAD..origin/main --oneline` — если есть untracked commits на origin/main, ребейз/merge **до начала правки**, не после.
>
> Параллельная нормативная правка на устаревшей базе — нарушение §15.2. Признак нарушения: коммит правит файл, чья последняя версия на `origin/main` новее, чем версия в parent коммите правки.
>
> **Список «нормативка» — 8 позиций:**
>
> 1. `docs/Pravila_raboty_Claude_v1_1.md`
> 2. `CLAUDE.md`
> 3. `docs/Tooling_v8_3.md`
> 4. `docs/Plugin_stack_rules_v1.md`
> 5. `memory/MEMORY.md` (и все `memory/*.md`)
> 6. `docs/Открытые_вопросы_v8_3.md`
> 7. `docs/adr/*.md` (glob — collision на ADR-NNN номере = тот же класс, что version-bump нормативки)
> 8. `db/schema.sql` (параллельные миграции из разных сессий = реальный риск; запись в `db/CHANGELOG_schema.md` сама не защищает от version-base дрейфа)
>
> Расширение списка — отдельная правка §15.2, не «по ощущениям».
### §15.3 Cross-refs в других файлах
- **CLAUDE.md §1 priority chain** — упомянуть §15 рядом с §12 и §14 как hard-rules (footer-абзац после цепочки).
- **PSR_v1** — не правится (§15 не про координацию плагинов, а про координацию сессий).
- **Tooling** — не правится.
## 3. `docs/sessions/CURRENT.md` — заявочный лог
### 3.1 Формат
Один markdown-файл, append-only, парсимый. Запись на каждую активную параллельную сессию:
```markdown
## session: 2026-05-18-discovery-interview
- branch: worktree-discovery-interview
- worktree: c:/моя/проекты/портал crm/Документация-discovery
- started: 2026-05-18T14:30+03:00
- scope-files:
- docs/Tooling_v8_3.md §4.30
- docs/Pravila_raboty_Claude_v1_1.md §13.2
- docs/Plugin_stack_rules_v1.md R10.1
- CLAUDE.md §3.3 #55
- docs/adr/009-*.md (new)
- version-claims:
- Tooling: 2.12 → 2.13
- Pravila: 1.25 → 1.26
- PSR_v1: 3.11 → 3.12
- CLAUDE.md: 2.12 → 2.13
- status: in-progress
- closes: docs/superpowers/plans/2026-05-18-discovery-interview-integration.md
```
### 3.2 Жизненный цикл записи
- **claim** — на старте сессии (до первой нормативной правки) контроллер добавляет запись + атомарный коммит `sessions: claim <topic>`. Отдельный коммит от plan-документа.
- **check** — pre-flight перед своей правкой: `Read docs/sessions/CURRENT.md` + scan записей со `status: in-progress`. Конфликт = пересечение `scope-files` ИЛИ `version-claims` с активной соседней сессией.
- **release** — на закрытии (push на main) контроллер меняет `status: closed-<commit-sha>`. Append-only-вариант (closed-записи остаются). Closed-записи переезжают в `docs/sessions/archive/YYYY-MM.md` через ≥30 дней после закрытия (ручная архивация раз в месяц, не cron).
### 3.3 Конфликт-резолюция
1. **Файловое пересечение** (две сессии правят один и тот же файл, не обязательно одну секцию) — **soft-warn**, продолжать можно, но pre-flight fetch перед каждым коммитом обязателен (§15.2).
2. **Section-пересечение** (одна и та же секция §X.Y) — **hard-stop**, координация с заказчиком до начала правки.
3. **Version-claim collision** (две сессии заявили один номер) — **hard-stop**, кто claim'нул раньше (по timestamp в CURRENT.md) — тот его и берёт; вторая сессия сдвигается на +1.
### 3.4 Что НЕ включаем (YAGNI)
- TTL / auto-expire записей — добавим, если файл реально засорится.
- Machine-readable JSON-формат — markdown достаточен, парсится `grep`/`sed`.
- Интеграция с GitHub Issues — отдельная тема, не блокер.
- Pre-commit hook на проверку CURRENT.md — добавим только если будут зафиксированы инциденты игнорирования.
### 3.5 Pre-flight snippet (для plan-документов и скила)
```bash
# Перед нормативной правкой:
git fetch origin && git log HEAD..origin/main --oneline
grep -A 20 'status: in-progress' docs/sessions/CURRENT.md
```
## 4. Хук `.claude/hooks/subagent-prompt-prefix.mjs`
### 4.1 Тип и matcher
Тип хука — **PreToolUse**, matcher `Task`. Перехватывает `tool_input.prompt`, дописывает в начало обязательный заголовок git-safety, возвращает модифицированный prompt через стандартный JSON-output API хук-системы Claude Code:
```json
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "git-safety header injected (Pravila §15.1)",
"updatedInput": { "prompt": "<header>\n\n<original prompt>" }
}
}
```
Точный формат API подтвердить против реально работающих `tools/ruflo-queen-hook.mjs` / `tools/ruflo-recall-hook.mjs` на этапе имплементации.
### 4.2 Тело заголовка
```text
=== SUBAGENT GIT-SAFETY HEADER (Pravila §15.1, auto-injected) ===
Working directory (cwd): <absolute path>
Branch (git branch --show-current): <branch-name>
Parent commit (git rev-parse HEAD): <sha>
Worktree root (git rev-parse --show-toplevel): <path>
ОБЯЗАТЕЛЬНЫЕ ПРАВИЛА:
1. Все git-операции выполняй ТОЛЬКО внутри cwd выше. Если pwd ≠ cwd — STOP, верни ошибку.
2. ЗАПРЕЩЕНО: `git checkout <branch>`, `git switch <branch>`, `git checkout -b`, `git branch -m`, `git worktree add/remove`, `git push --force`, `git reset --hard`.
3. После КАЖДОГО `git commit` — выполни `git rev-parse HEAD` и `git branch --show-current`, выпиши результат в ответ. Это обязательная часть отчёта.
4. Если обнаружил, что находишься не в той ветке/worktree — STOP, не правь ничего, верни ошибку с raw output `git status` и `git branch --show-current`.
5. Если задача не требует git-операций (только Edit/Read/Grep) — этот блок информационный, follow rule 1.
=== END SUBAGENT GIT-SAFETY HEADER ===
<здесь — оригинальный prompt контроллера>
```
### 4.3 Резолюция переменных
Хук резолвит 4 значения сам в момент инжекта — не из контроллера. Резолв через стандартный Node child-process API c fixed-string `git`-командами (без подстановки user-input в shell — все аргументы статичны: `git rev-parse HEAD`, `git rev-parse --show-toplevel`, `git branch --show-current`, `pwd`/`process.cwd()`). Контроллер мог быть запущен в одной директории, но Task инвокируется по факту в ней же — хук берёт `process.cwd()` рантайма.
### 4.4 Какие модели затрагиваются
Заголовок инжектится для **всех** Task-инвокаций (универсально). §15.1 (Sonnet-only для git) — **не в хук**, а в Pravila + чеклист скила (Секция 5). Хук не знает, является ли задача git-задачей: анализ prompt'а — ненадёжный signal, пусть это решает контроллер.
### 4.5 Edge-cases
1. **Task без git** (только read/edit) — заголовок присутствует, безвреден (rule 5 нейтрализует).
2. **Контроллер уже включил похожий заголовок** — двойная защита, не проблема.
3. **Хук упал** (например, `git` не в PATH) — возвращает `{"continue": true}` без модификации prompt'а + логирует stderr. Не блокирующий: лучше Task без заголовка, чем сломанный Task.
4. **Несколько worktree в разных терминалах** — каждый запуск Claude Code имеет свой cwd, хук резолвит локально.
### 4.6 Объём и latency
~60 строк JS, паттерн один-в-один с `tools/ruflo-queen-hook.mjs` / `tools/ruflo-recall-hook.mjs`. Latency ~510 мс на Task (3 локальных `git`-вызова).
## 5. Verify-протокол в скиле `subagent-driven-development`
### 5.1 Где живёт
Добавочный чеклист-блок в скиле `superpowers:subagent-driven-development`:
- если скил вендорится в `.claude/skills/` — патчится напрямую;
- если только marketplace-скил без локальной копии — добавляем `references/git-safety-checklist.md` рядом + одну строку «обязательный verify-блок после каждого субагента» в проектную обёртку. Фактический способ решается при имплементации (см. §7 ограничения).
### 5.2 Pre-spawn чеклист (до Task-инвокации)
1. Резолвить и записать: cwd, branch, parent SHA, worktree root — те же 4 значения, что инжектит хук. Контроллер хранит их у себя для post-check.
2. Если задача git-коммит → выбрать model `sonnet` или `opus`. **Никогда** `haiku` (§15.1).
3. Если задача правит нормативку из списка §15.2 → pre-flight `git fetch && git log HEAD..origin/main --oneline`. Не пусто → ребейз до инвокации, не после.
### 5.3 Post-subagent чеклист (сразу после возврата)
1. `git rev-parse HEAD` — сравнить с pre-spawn parent SHA. Ожидание: либо равно (субагент не коммитил), либо отличается **ровно одним коммитом** на pre-spawn HEAD.
2. `git branch --show-current` — сравнить с pre-spawn branch. Не равно → **STOP**, разбор инцидента (Sprint 6 паттерн).
3. `git log -1 --format='%s%n%P'` — проверить subject (соответствует задаче?) + parent (родитель = pre-spawn HEAD?).
4. Если субагент коммитил несколько коммитов — не запрещено, но требует ручной проверки subject'ов.
### 5.4 Red-flag-список (любой = hard-stop разбор)
- branch ≠ ожидаемая;
- parent коммита ≠ pre-spawn HEAD (= висячий коммит / попадание на чужую ветку);
- HEAD двинулся, но субагент в отчёте об этом не упомянул;
- в diff'е есть файлы вне scope задачи.
### 5.5 Формат отчёта субагента
Субагент обязан выписать в конце ответа блок:
```
=== GIT REPORT ===
cwd: <pwd>
branch: <git branch --show-current>
HEAD: <git rev-parse HEAD>
HEAD^: <git rev-parse HEAD^>
status: <git status --short>
=== END GIT REPORT ===
```
Отсутствие блока = контроллер считает результат недостоверным и запускает 5.3-чеклист сам через Bash.
### 5.6 Соотношение с code-review
Двухстадийное review сохраняется (Pravila §4.5 / R10 PSR_v1): сильная модель делает code-review артефакта субагента. Git-safety-чеклист **не заменяет** code-review, он стоит **до** него (нет смысла ревьюить diff, если он не в той ветке).
## 6. Тесты, migration, контракт записи
### 6.1 Тесты самих защит
| Защита | Тест | Ожидание |
|---|---|---|
| Хук (inject) | `echo '{"tool_input":{"prompt":"X"}}' \| node .claude/hooks/subagent-prompt-prefix.mjs` | `updatedInput.prompt` начинается с `=== SUBAGENT GIT-SAFETY HEADER ===`; cwd/branch/HEAD — реальные |
| Хук — failure-mode | временно сломать (`mv .git → .git.bak`) → запустить хук | `{"continue":true}`, без модификации; Task не должен крашиться |
| Verify-протокол (5.3) | Task субагенту с prompt `"do nothing, run git status, return"` | в ответе субагента — блок `=== GIT REPORT ===`; контроллер сверяет HEAD до/после — должны быть равны |
| §15.1 enforcement | Ручной dry-run: попытаться делегировать `git commit` Haiku-субагенту | согласно чеклисту контроллер отказывается и перенаправляет Sonnet'у |
| §15.2 pre-flight | Симулировать diverged state: `git fetch` + сделать divergence → попытаться правнуть Pravila | pre-flight snippet ловит, требует rebase |
| CURRENT.md claim collision | Две параллельные сессии: добавить запись с тем же version-claim | вторая сессия должна вручную увидеть конфликт через grep `version-claims` |
Никакой автоматизации сверх этого (no pre-commit hook, no CI check) — YAGNI. Если CURRENT.md начнёт игнорироваться — добавим pre-commit grep отдельной правкой.
### 6.2 Migration существующих параллельных worktrees
На момент 18.05.2026 — 16 активных worktree (`git worktree list`). Шаги:
1. После merge §15 + хука + CURRENT.md на `main` — каждая активная worktree-сессия делает `git fetch` + ребейз на свежий `main` (получает §15 + хук).
2. Каждая активная сессия дописывает свою запись в CURRENT.md одним коммитом (`sessions: backfill claim <topic>`) — не блокирует работу, retro-claim.
3. Существующие version-collision'ы (A11 / C9 / A4 / discovery — последние 2 недели) **не пересматриваем**; §15 действует **с момента введения**, не ретроактивно.
### 6.3 Что НЕ делаем сейчас (явный YAGNI)
- Реестр зарезервированных версий — пропущен;
- pre-commit hook на CURRENT.md — пропущен;
- машинно-читаемый JSON-формат CURRENT.md — пропущен;
- запрет параллельных сессий — нет, параллельность — норма проекта;
- изменения PSR_v1 / Tooling — не требуются, §15 — внутри Pravila;
- subagent-без-git (вариант C из брейншторма) — отложен до повторного инцидента после A+B.
## 7. Ограничения / что не верифицировано в дизайне
- **Не верифицировал** через grep, что в Pravila нет пересекающихся правил под номером §15 — проверено в формате headings `## 13. ... / ## 14. ...`, §15 свободен. Подтверждено на этапе brainstorming.
- **Не верифицировал** API хук-системы Claude Code на актуальной версии CLI — формат `updatedInput` в PreToolUse для Task tool требует подтверждения против реально работающих `tools/ruflo-queen-hook.mjs` / `tools/ruflo-recall-hook.mjs` перед написанием хука. Задача имплементации, не дизайна.
- **Не верифицировал**, что `subagent-driven-development` скил вендорится в `.claude/skills/`. Может быть только маркетплейс-скил без локальной копии — фактический способ патчинга решится при имплементации (Секция 5.1).
- **Не верифицировал** Windows-специфику резолва `git`-команд через Node child-process в хуке — на Windows работало для `ruflo-queen-hook.mjs`, должно работать и здесь.
## 8. Acceptance criteria (для writing-plans)
Дизайн считается реализованным, когда:
1. Pravila §15 (15.1 + 15.2) добавлен, версия Pravila bumped, CHANGELOG entry есть.
2. `docs/sessions/CURRENT.md` создан, формат описан в README рядом, в нём есть retro-claim запись для всех активных worktrees на момент имплементации (Migration §6.2; на дату дизайна — 16 штук).
3. `.claude/hooks/subagent-prompt-prefix.mjs` написан, зарегистрирован в `.claude/settings.json`, прошёл тесты 6.1 (рукопись + failure-mode + e2e Task).
4. Скил `subagent-driven-development` патчен (5.1) — verify-протокол доступен контроллеру.
5. CLAUDE.md §1 cross-ref на §15 добавлен.
6. Pre-commit gitleaks + Pest/Vitest GREEN; gitleaks-full-history + lychee — перед push.
7. Регрессия Pest --parallel / Vitest — 0 регрессий vs baseline.
+109
View File
@@ -0,0 +1,109 @@
#!/usr/bin/env node
/**
* PreToolUse hook git-safety header inject for Task tool.
*
* For каждый Task-инвокейшн контроллера: дописывает в начало tool_input.prompt
* заголовок с cwd / branch / parent SHA / worktree-root + правилами поведения
* (rule 15). Это компенсирует класс инцидентов «субагент путает ветку/worktree»
* (Sprint 6, Pravila §15.1).
*
* FAIL-OPEN: любая ошибка / тайм-аут / git-не-в-PATH {continue: true} без
* модификации; хук НИКОГДА не блокирует Task.
*
* Non-Task tools pass-through без модификации.
*
* Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md §4
* Rule: docs/Pravila_raboty_Claude_v1_1.md §15.1
*/
import { execFile } from 'node:child_process';
import { promisify } from 'node:util';
const execFileP = promisify(execFile);
const GIT_TIMEOUT_MS = 1500;
/** Read all stdin into a string. */
async function readStdin() {
let buf = '';
for await (const chunk of process.stdin) buf += chunk;
return buf;
}
/** Parse hook input JSON; return null on any parse error. */
function parseHookInput(raw) {
try { return JSON.parse(raw); } catch { return null; }
}
/** Run a single fixed-args git command; return trimmed stdout, or null on any error. */
async function gitCmd(args) {
try {
const { stdout } = await execFileP('git', args, { timeout: GIT_TIMEOUT_MS, encoding: 'utf8' });
return stdout.trim();
} catch {
return null;
}
}
/** Build the safety header block. Returns null if any of the 4 git values can't be resolved. */
async function buildHeader() {
const cwd = process.cwd();
const [branch, head, top] = await Promise.all([
gitCmd(['branch', '--show-current']),
gitCmd(['rev-parse', 'HEAD']),
gitCmd(['rev-parse', '--show-toplevel']),
]);
if (!branch || !head || !top) return null;
return [
'=== SUBAGENT GIT-SAFETY HEADER (Pravila §15.1, auto-injected) ===',
`Working directory (cwd): ${cwd}`,
`Branch (git branch --show-current): ${branch}`,
`Parent commit (git rev-parse HEAD): ${head}`,
`Worktree root (git rev-parse --show-toplevel): ${top}`,
'',
'ОБЯЗАТЕЛЬНЫЕ ПРАВИЛА:',
'1. Все git-операции выполняй ТОЛЬКО внутри cwd выше. Если pwd ≠ cwd — STOP, верни ошибку.',
'2. ЗАПРЕЩЕНО: `git checkout <branch>`, `git switch <branch>`, `git checkout -b`, `git branch -m`, `git worktree add/remove`, `git push --force`, `git reset --hard`.',
'3. После КАЖДОГО `git commit` — выполни `git rev-parse HEAD` и `git branch --show-current`, выпиши результат в ответ. Это обязательная часть отчёта.',
'4. Если обнаружил, что находишься не в той ветке/worktree — STOP, не правь ничего, верни ошибку с raw output `git status` и `git branch --show-current`.',
'5. Если задача не требует git-операций (только Edit/Read/Grep) — этот блок информационный, follow rule 1.',
'',
'=== END SUBAGENT GIT-SAFETY HEADER ===',
'',
].join('\n');
}
/** Emit fail-open response and exit 0. */
function failOpen() {
process.stdout.write(JSON.stringify({ continue: true }));
process.exit(0);
}
async function main() {
const raw = await readStdin();
const input = parseHookInput(raw);
if (!input) return failOpen();
// Non-Task — pass-through
if (input.tool_name !== 'Task') return failOpen();
const originalPrompt = input.tool_input?.prompt;
if (typeof originalPrompt !== 'string') return failOpen();
const header = await buildHeader();
if (!header) {
// git unavailable / not in worktree — fail-open per spec §4.5 edge-case 3
process.stderr.write('[subagent-prompt-prefix] git resolution failed — passing through\n');
return failOpen();
}
const newPrompt = header + originalPrompt;
process.stdout.write(JSON.stringify({
hookSpecificOutput: {
hookEventName: 'PreToolUse',
permissionDecision: 'allow',
permissionDecisionReason: 'git-safety header injected (Pravila §15.1)',
updatedInput: { prompt: newPrompt },
},
}));
}
main().catch(() => failOpen());
+96
View File
@@ -0,0 +1,96 @@
#!/usr/bin/env node
/**
* Tests for tools/subagent-prompt-prefix.mjs PreToolUse Task git-safety header inject.
*
* Per Pravila §15.1 hook injects cwd/branch/HEAD/worktree-root into каждый Task-prompt.
* FAIL-OPEN: any error return {continue: true} без модификации.
*
* Spec: docs/superpowers/specs/2026-05-18-parallel-sessions-coordination-design.md §4
*/
import { test } from 'node:test';
import { strict as assert } from 'node:assert';
import { spawnSync } from 'node:child_process';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';
const __dirname = dirname(fileURLToPath(import.meta.url));
const HOOK_PATH = join(__dirname, 'subagent-prompt-prefix.mjs');
function runHook(stdinJson) {
return spawnSync('node', [HOOK_PATH], {
input: JSON.stringify(stdinJson),
encoding: 'utf8',
timeout: 5000,
});
}
test('hook injects SUBAGENT GIT-SAFETY HEADER into Task prompt', () => {
const result = runHook({
tool_name: 'Task',
tool_input: { prompt: 'do something' },
});
assert.equal(result.status, 0, `stderr: ${result.stderr}`);
const out = JSON.parse(result.stdout);
assert.ok(out.hookSpecificOutput, 'has hookSpecificOutput');
assert.equal(out.hookSpecificOutput.hookEventName, 'PreToolUse');
assert.equal(out.hookSpecificOutput.permissionDecision, 'allow');
const newPrompt = out.hookSpecificOutput.updatedInput.prompt;
assert.match(newPrompt, /=== SUBAGENT GIT-SAFETY HEADER/);
assert.match(newPrompt, /=== END SUBAGENT GIT-SAFETY HEADER ===/);
assert.match(newPrompt, /do something/, 'preserves original prompt');
});
test('hook injects real cwd, branch, HEAD values', () => {
const result = runHook({
tool_name: 'Task',
tool_input: { prompt: 'noop' },
});
assert.equal(result.status, 0);
const out = JSON.parse(result.stdout);
const newPrompt = out.hookSpecificOutput.updatedInput.prompt;
// cwd — absolute path
assert.match(newPrompt, /Working directory \(cwd\): [A-Za-z]:[\\/]|Working directory \(cwd\): \//);
// branch — non-empty
assert.match(newPrompt, /Branch \(git branch --show-current\): \S+/);
// HEAD — 40-char SHA
assert.match(newPrompt, /Parent commit \(git rev-parse HEAD\): [0-9a-f]{40}/);
});
test('hook passes through non-Task tools without modification', () => {
const result = runHook({
tool_name: 'Edit',
tool_input: { file_path: '/foo', old_string: 'a', new_string: 'b' },
});
assert.equal(result.status, 0);
const out = JSON.parse(result.stdout);
// Non-Task → either {continue: true} OR no updatedInput
if (out.hookSpecificOutput) {
assert.equal(out.hookSpecificOutput.updatedInput, undefined);
} else {
assert.equal(out.continue, true);
}
});
test('hook fail-open on malformed stdin', () => {
const result = spawnSync('node', [HOOK_PATH], {
input: 'not-json',
encoding: 'utf8',
timeout: 5000,
});
assert.equal(result.status, 0, `should not crash; stderr: ${result.stderr}`);
// Either {continue: true} or empty output — both acceptable fail-open
});
test('hook fail-open when git not available', () => {
// Cross-platform: set PATH to node's own directory only — node spawns OK,
// git not in node's bin dir → ENOENT → hook fail-opens per spec §4.5.
// (Previous approach `PATH: ''` kills node.exe spawn resolution on Windows.)
const nodeDir = dirname(process.execPath);
const result = spawnSync('node', [HOOK_PATH], {
input: JSON.stringify({ tool_name: 'Task', tool_input: { prompt: 'x' } }),
encoding: 'utf8',
timeout: 5000,
env: { PATH: nodeDir, PATHEXT: process.env.PATHEXT || '.EXE' },
});
assert.equal(result.status, 0, `should not crash when git missing; stderr: ${result.stderr}`);
});