# Машина 7 — Фаза 4: поглощение поведенческой дисциплины в М4 (§4.2) — SCOPED (4a/4b/4c)

> **For agentic workers:** REQUIRED SUB-SKILL: владелец запретил субагентов → ИНЛАЙН через `superpowers:executing-plans`. **Самый большой объём эпика** — спека предписывает 3 под-фазы. Перед КАЖДОЙ под-фазой развернуть детальный bite-sized план через `superpowers:writing-plans` (читать поглощаемый хук целиком — audit-context-building).

**Goal:** Поведенческая дисциплина (coverage / todowrite / decomposition / rationalization / self-debrief / plan / verify) поглощена в М4 и проверяется ЖУРНАЛ-ФАКТОМ (M1 хеш-цепочка + skill-журналер Фазы 3), а НЕ текстом контроллера. `[Pre]` строго PreToolUse (предотвращение), `[Stop]` — детекция. Закрывает Класс 1 / SE3 (уболтать текстом нельзя).

**Architecture:** М4 пол (judge-gate-floor) уже несёт примитивы: K2 `skillTakenByJournal`, Гейт-2 `specToPlanCoverage`+`k5CriterionCheck`, Гейт-3 `criteriaGreenMatched`+`fingerprintFresh`+`greenSignaturesValid`. Оркестратор (judge-orchestrator) несёт `runGateFunction`/`runGateLadder`/`finalGate`/`a2CaseSelect`/`logVerdict`/`appealStep`/`judgeHealth`. Фаза 3 дала `extractSkillCalls` (журнал→`journalSkillCalls`). Фаза 4 = WIRING этих примитивов в PreToolUse/Stop-обёртки, питающиеся ЖУРНАЛОМ, + D31 пост-оценщик + halt-counter.

**Tech Stack:** Node ESM, vitest tools-only, pure-core+thin-main, action-journal (extractSkillCalls), judge-gate-floor/judge-orchestrator (существующие примитивы).

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

**audit-context-building (выполнено для 4a):**
- `judge-gate-floor.mjs` — пол-примитивы (выше).
- `judge-orchestrator.mjs` — `runGateFunction({floorSteps,runEngine})`, `runGateLadder` (try/catch шаг→fail-closed), `finalGate({judgeDecision,floorBlocked})` (пол перевешивает; снять только явный floorBlocked===false), `a2CaseSelect` (destructive→несколько голосов / divergence→1), `logVerdict`, `gate3Terminal`.
- `enforce-coverage-verify.mjs` (Stop) — сейчас TEXT: `parseCoverageLine(assistantText)` + `turnToolUses` Skill-match; fail-OPEN (catch→block:false); override-based. → перенацелить на журнал-K2 + fail-CLOSE.
- `enforce-todowrite-skill-verifier.mjs` (Stop) — `extractSkillToolCalls(transcript)` (transcript tool_use, не журнал) + `hardSyncCheck`; fail-OPEN. → журнал-факт (extractSkillCalls) + fail-CLOSE.
- **НЕ читаны (читать при подходе к 4b):** `enforce-decomposition-detector.mjs`, `enforce-rationalization-audit.mjs`, `enforce-self-debrief-detector.mjs`.

---

## §4.2 mapping → под-фазы (трассировка)
| Дисциплина | Машина / форма | Под-фаза |
|---|---|---|
| Coverage = реальный навык (`coverage-verify`/`memory-coverage`) `[Pre+Stop]` | М4 журнал-K2 (`skillTakenByJournal` ← `extractSkillCalls`) + fail-CLOSE | **4a** |
| TodoWrite заявил навык (`todowrite-skill-verifier`) `[Pre]` | М4 журнал-K2 + fail-CLOSE; строго PreToolUse | **4a** |
| План перед prod-кодом (`tdd-gate` #6) | М4 Гейт-2 (`specToPlanCoverage`) + М2 стена (действие=шаг плана) | **4c** |
| Проверка перед commit/push (`verify-before-push`/`verify-record`) | М4 Гейт-3 (`criteriaGreenMatched`+fingerprint+green-sig) + М5 GREEN | **4c** |
| Скрытое дробление (`decomposition-detector`) `[Stop]` | М4 Гейт-1 look-ahead (обещанные навыки ← журнал); no-op хук удалить | **4b** |
| Рационализация (`rationalization-audit`) `[Stop]` | М4 D31 пост-оценщик + halt-counter; детектор-языка = мягкий сигнал | **4b** |
| Self-debrief без retro (`self-debrief-detector`) | М4 дисциплина (уже fail-CLOSE; влить в судью) | **4b** |

## Под-фаза 4a — Pre/Stop coverage+todowrite через журнал-K2 (fail-CLOSE)
**Дизайн:** новые/переключённые обёртки читают action-journal (loadJournal→`extractSkillCalls`) и гейтят через `skillTakenByJournal` (K2), НЕ через transcript-текст. coverage: skill-канал требует навык в ЖУРНАЛЕ (не в assistantText). todowrite: заявленный навык должен быть в ЖУРНАЛЕ. Обёртки → fail-CLOSE (`disciplineOutcome` Фазы 0). `[Pre]` todowrite строго PreToolUse.
**Acceptance:** coverage skill:X без журнал-записи X → block (даже если текст содержит coverage-строку); с журнал-записью → pass. todowrite заявил X, журнал без X → block. Журнал-факт, не текст.
**Файлы (план при подходе):** перенацелить `enforce-coverage-verify`/`enforce-todowrite-skill-verifier` на journal+K2+disciplineOutcome; тесты.

## Под-фаза 4b — Stop-дисциплина (decomposition / rationalization D31 / self-debrief)
**Дизайн:** decomposition → Гейт-1 look-ahead (обещанные навыки сверяются с журналом, не текстом); rationalization → D31 пост-оценщик (структурный слот в М4: нельзя продолжить, не заполнив, с якорем) + halt-counter (язык-детектор остаётся мягким сигналом в оценщик); self-debrief → влить в дисциплину судьи. Читать 3 хука целиком ПЕРЕД правкой.
**Acceptance:** per §4.2 строка — дисциплина ловится журнал-фактом/структурным слотом, не текстом; `[Stop]` помечены Stop (не выдавать за Pre).
**Риск:** не сломать существующее поведение хуков; rationalization D31 — самый тонкий (структурные слоты оценщика).

## Под-фаза 4c — Гейты (Гейт-2 план-требование, Гейт-3 verify-привязка)
**Дизайн:** Гейт-2 (`specToPlanCoverage`+`k5CriterionCheck`) врезать в требование «prod-код только под шагом запечатанного плана» (синергия с М2 стеной); Гейт-3 (`criteriaGreenMatched`+`fingerprintFresh`+`greenSignaturesValid`) врезать в «проверка перед commit/push = подписанный зелёный по критерию» (синергия М5 GREEN). Это WIRING существующих пол-примитивов в judge-gate обёртку.
**Acceptance:** prod-правка без покрытия шагом плана → Гейт-2 NO-GO; commit/push без подписанного зелёного критерия → Гейт-3 NO-GO; verify-привязка структурная.

## §12 CI-инварианты Фазы 4 (P-6, после поглощения)
- structural-тест: нет `if(result.ok)` truthy — только `=== true` в дисциплине (consensus/finalGate уже `=== false`/`=== true`).
- grep-инвариант: нет `assistantText.includes(marker) → block:false` (текст-байпас вырезан).
- escape≠protection: поглощённая дисциплина НЕ несёт override-вокабуляра (escape — единственная дверь, М6).

## Гейт закрытия Фазы 4
Каждая под-фаза: audit-context-building (читать поглощаемый хук) → TDD → sharp-edges (после опасных) → закрытие: audit→sharp-edges→variant-analysis→regression(≥baseline)→verification. §12 structural+grep+escape инварианты — финальный тест-гейт фазы.

## Acceptance Фазы 4
Вся §4.2-дисциплина в М4 через журнал-факт/Гейты (не текст); `[Pre]`/`[Stop]` корректны; §12 инварианты зелёные; регрессия ≥ baseline. → разблокирует Фазу 5 (normative-канал) + чистку Класса 6 (мёртвый findOverride / врущие сообщения) в Фазе 8.
