# Машина 7 — Фаза 3: skill-журналер (PostToolUse) + seed-allow реактивных навыков (§4.2 SE-K, §12)

> **For agentic workers:** REQUIRED SUB-SKILL: владелец запретил субагентов → исполнять ИНЛАЙН через `superpowers:executing-plans`.

**Goal:** Журнал М1 начинает ловить КАЖДЫЙ Skill-вызов (seed/ad-hoc/планный) — основа K2 судьи М4 (навык-по-журналу, не по тексту). Реактивные дисциплинарные навыки (systematic-debugging/TDD/requesting-code-review/verification) добавлены в seed-allow стены (иначе стена рубит их «вне плана»).

**Architecture:** Новый PostToolUse-хук `enforce-skill-journaler` пишет op:'Skill' в action-journal независимо от членства в плане (seed/observe/escape стеной НЕ журналятся — SE-K). Дедуп vs wall-pre-write плановых Skill (стена пишет op:'Skill' на plan-step). Мост `extractSkillCalls(entries)→string[]` журнал→`skillTakenByJournal` (K2). Спека §4.2 (coverage/todowrite через журнал-факт), §12 (skill-журнал инвариант), несущая зависимость SE-K.

**Tech Stack:** Node ESM, vitest tools-only, pure-core + thin-main, action-journal (хеш-цепочка, journalAppend), PostToolUse-хук.

**Квирки:** vitest через Bash; git через PowerShell `-F`; for-of+it(); tdd-gate (test перед prod) + tdd-real-test-verifier (it(+expect(+ссылка на prod). `<wt>` = `c:\моя\проекты\портал crm\Документация\.claude\worktrees\brainrepo`.

**audit-context-building:** action-journal.mjs (`journalAppend({payload,key,sessionId,runtimeDir,nowMs,fsImpl})`, payload-shape `{op,object,step,at}`, loadJournal), enforce-supreme-gate.mjs (SEED_SKILLS:20=['writing-plans','brainstorming','discovery-interview']; runGate журналит op:'Skill' только на plan-step allow), judge-gate-floor.mjs:117 (`skillTakenByJournal({requiredSkills,journalSkillCalls})`, journalSkillCalls=string[]), enforce-hook-helpers FAIL_CLOSE_DISCIPLINE_HOOKS (Фаза 0, NB enforce-skill-journaler в Фазе 3).

---

## Дизайн-решения (locked)
- **D1 — PostToolUse-журналер.** SE-K: seed/observe/escape стеной НЕ журналятся → новый PostToolUse(Skill)-хук пишет op:'Skill' для ВСЕХ Skill-вызовов. PostToolUse (навык уже отработал — факт записываем после).
- **D2 — дедуп vs wall.** Стена на plan-step Skill уже пишет op:'Skill' (PreToolUse). PostToolUse-журналер видит её как последнюю запись цепи → пропускает (`shouldJournalSkill`: last entry op==='Skill' && object===skill → skip). Seed/ad-hoc: стена не писала → last entry ≠ этот Skill → журналер пишет.
- **D3 — мост K2.** `extractSkillCalls(entries)→string[]` (object всех op:'Skill' записей) — журнал → `journalSkillCalls` → `skillTakenByJournal`. Это и есть acceptance «журнал видит навык».
- **D4 — seed-allow реактивных.** SEED_SKILLS +`systematic-debugging`/`test-driven-development`/`requesting-code-review`/`verification-before-completion` (их зовут на внезапный баг/ревью без предварительного плана — стена не должна рубить «вне плана»).
- **D5 — fail-CLOSE-список.** `enforce-skill-journaler` → FAIL_CLOSE_DISCIPLINE_HOOKS (P-7, для манифеста Фазы 6). Сам main best-effort (PostToolUse не блокирует — навык уже отработал); fail-CLOSE-ность реализуется в потреблении K2 (Фаза 4).

## Файлы
- Create: `tools/enforce-skill-journaler.mjs` (`shouldJournalSkill`, `extractSkillCalls`, best-effort main); Test `tools/enforce-skill-journaler.test.mjs`
- Modify: `tools/enforce-supreme-gate.mjs` (SEED_SKILLS +4); Test `tools/enforce-supreme-gate.test.mjs`
- Modify: `tools/enforce-hook-helpers.mjs` (FAIL_CLOSE_DISCIPLINE_HOOKS +enforce-skill-journaler); Test `tools/enforce-hook-helpers.test.mjs`

## Задачи
- **3.1** skill-журналер pure (`shouldJournalSkill` дедуп + `extractSkillCalls` мост) + интеграция с `skillTakenByJournal`. Test: дедуп tail; extract; end-to-end K2 видит зажурналенный seed-навык.
- **3.2** SEED_SKILLS +4 реактивных. Test: isSeed для systematic-debugging/TDD/requesting-code-review/verification → true; не-seed (coder) → false (регресс).
- **3.3** FAIL_CLOSE_DISCIPLINE_HOOKS +enforce-skill-journaler. Test: список содержит, disjoint цел.
- **3.4** Регрессия ≥ baseline (3074+2) + гейт (sharp-edges: дедуп не теряет seed? extract не ловит чужой op? / variant / regression / verify).

## Acceptance Фазы 3
seed/ad-hoc Skill → op:'Skill' в журнал (дедуп плановых) → `extractSkillCalls`→`skillTakenByJournal` видит; реактивные навыки seed-allowed (стена не рубит); журналер в FAIL_CLOSE-списке (манифест Фазы 6); регрессия ≥ baseline. → разблокирует Фазу 4 (поглощение дисциплины K2). NB: регистрация PostToolUse-хука в settings.json — шаг владельца (Фаза 8).
