# Машина 3 — журнал вопросов и решений по ходу автономной сборки (2026-06-04, ночь)

> Владелец дал мандат: «делай полностью Машину 3; где упрёшься в вопрос — не останавливайся, запиши вопрос и делай дальше что можешь». Этот файл — все вопросы/допущения, которые возникли и которые НАДО показать владельцу утром. Каждое допущение помечено `[ДОПУЩЕНИЕ]`, каждый открытый вопрос — `[ВОПРОС]`.

## Контекст
- На чём стоит: Машина 1 (фундамент, собрана) + Машина 2 (стена/замок, собрана).
- Порядок: 3-A контракты скилов → 3-B граф узлов из реестра → 3-C машина охвата A/B/C/D → 3-D движок роутера (+K4 + волны) → 3-E очередь одобрений.
- Принцип: механика — чистый TDD (контроллер строит сам); рассуждение роутера — LLM, вызов мокается, проверки вокруг механические («умный не баран»). Портативность — без project-хардкода.

## Журнал

### 3-A (контракты скилов) — СОБРАНО
- `[ВОПРОС]` Гард-рейлы G1–G3/G5–G6 в спеке поимённо НЕ перечислены (назван только G4 — хеш-страж дрейфа). Реализован G4 + механические валидаторы формы. Остальные G — уточнить при сборке 3-C/3-D или у владельца.
- `[ДОПУЩЕНИЕ]` `PREVIEW_FORMS` = `none/outline/mockup/sample/dry-run/diagram` — выведен из духа L1, дословно в спеке не зафиксирован. Расширяемый.
- `[ДОПУЩЕНИЕ]` Контракты лежат `docs/registry/contracts/*.contract.json` рядом с `nodes.yaml`. Массовое наполнение контрактов для всех ~86 узлов — отдельная задача данных, НЕ код 3-A (собраны 2 образца: own writing-plans + external operations:process-doc).
- `[СТЫК]` Само-ослабление контракта (убрал нужду/критерий → блок + да владельца) — Машина 5, НЕ 3-A (только схема здесь).

### 3-B (граф узлов) — СОБРАНО
- `[ДОПУЩЕНИЕ]` Явных рёбер «близнецы/конфликты» в схеме реестра НЕТ. Близнецы выведены = общий `subcategory`; связи-подсказки = со-членство в `chains`; конфликты = опциональное `attributes.conflicts_with` (пусто, если не задано). Free-text `boundaries` НЕ парсим (ненадёжно). Явные конфликт-рёбра — наполнение позже.
- `[ДОПУЩЕНИЕ]` Члены цепочек вида `superpowers:brainstorming` могут не резолвиться в отдельный узел (суб-скилы superpowers не отдельные узлы) → в связях-подсказках пропускаются. Граф корректен для зарегистрированных узлов.

### 3-C (машина охвата) — СОБРАНО
- `[ДОПУЩЕНИЕ]` Сопоставление need↔produce — по нормализованной строке (lower/trim; равенство или подстрока для просьб). Семантическое сопоставление («spec»≈«требования») — рассуждение роутера (3-D), НЕ механика. Машина охвата честно ловит ТОЧНЫЕ дыры/сироты/циклы.
- `[ДОПУЩЕНИЕ]` Извлечение «просьб цели» из текста (C) — мягкий край, выполняется выше (роутер/владелец); 3-C принимает готовый массив просьб.

### 3-D (движок роутера) — границы автономной сборки (ВАЖНО для владельца)
- `[РЕШЕНИЕ — отложено до Машины 4] K4-поправка к стене (узкое Write-исключение в decideMode)` НЕ активируется в этой сессии. Канон M3 §1 прямо: «ВКЛЮЧАТЬ исключение можно только ПОСЛЕ того, как K1/M4 реальны». Машина 4 (гейт-1/печать) ещё НЕ построена → включишь сейчас = либо инертно, либо дыра (фальшивый артефакт некому отбраковать). Поэтому 3-D строит движок роутера, но `enforce-supreme-gate.decideMode` НЕ трогает. Активация K4 — отдельным шагом после Машины 4.
- `[РЕШЕНИЕ — отложено] Live-wiring роутера` (регистрация в settings.json + реальные вызовы Sonnet вместо моков) — шаг владельца (settings.json Claude'у закрыт) + режим D28 «сперва тихо, не вживую». 3-D строит и тестирует движок с МОКнутым llmCall (как router-classifier); живой вызов через `callAnthropicAPI` готов, но не регистрируется.
- `[РЕШЕНИЕ — отложено] Перенос «волн» (дерево указателей шага)` в живой `enforce-supreme-gate.main()` НЕ делается сейчас (трогает рабочий код Машины 2 + указатель пока линейный достаточен — на прямых планах). Построен СТЕНДОВЫЙ модуль дерева-указателя (мех., оттестирован), готов к замене линейного при живом роутере. Live-замена — отдельный шаг.
- `[ДОПУЩЕНИЕ] Нюх 5.3 / интервьюер 4.4 / самопроверка 5.4` — вшиты в system-инструкции брейнсторма роутера (рассуждение модели). Отдельные МЕХАНИЧЕСКИЕ детекторы «нюха на размытость» не строились жёстко (мягкий край, LLM-суждение). Механическая часть анти-обмана — валидатор трассы (пустой слот=флаг) + заземление (выдумка=отклонение).

### 3-E (очередь обучения) — СОБРАНО
- `[РЕШЕНИЕ — отложено] Доставка в живую инфру` — врезка `statusSignal` в `tools/status-md-generator.mjs` + раздела «На одобрение» (`renderApprovalSection`) в `.claude/skills/brain-retro/SKILL.md` НЕ делается тихо ночью (owner-facing surface, режим D28). Рендер/сигнал — готовые функции, ждут врезки с одобрения.
- `[ИНВАРИАНТ соблюдён] Hard-rule «наполнение только по да владельца, иначе никак»` — `enqueue` всегда pending; в фонд только `applyApprovalBatch` с явным approve; разведка rate=0 по умолчанию, проба=вопрос владельцу. Подтверждено инвариант-тестами.

---

## СВОДКА СБОРКИ МАШИНЫ 3 (2026-06-04, ночь) — ВСЕ 5 ПОД-ПЛАНОВ СОБРАНЫ
Порядок выдержан: 3-A → 3-B → 3-C → 3-D → 3-E. Всё по TDD (тест→RED→прод→GREEN), контроллер строил сам. Финальная регрессия tools-only **2212 GREEN / 2 skipped**. 14 коммитов на ветке `worktree-brainrepo` (НЕ запушено — ждёт «да» владельца на push).

| Под-план | Модули | Тесты | Коммиты |
|---|---|---|---|
| 3-A контракты | skill-contract.mjs + skill-contract-registry.mjs + 2 образца | 28 | f82cefae, a905abd1, 53db0ee2 |
| 3-B граф узлов | node-graph.mjs (поверх loadRegistry) | 20 | 750f406c, 699da97d |
| 3-C охват A/B/C/D | coverage-machine.mjs | 19 | 8df8d056, 80ebec9e |
| 3-D движок роутера | router-engine.mjs + step-pointer.mjs | 35 | 3a80bdde, 28b129ed, ed89028b |
| 3-E очередь обучения | router-learning-queue.mjs + router-exploration.mjs | 19 | 4cb17fc4, dcf772ba, a27a848d |

**FOLLOW-UP для владельца (НЕ сделано осознанно — нужны Машина 4 / шаг владельца):**
1. **Машина 4** (судья: гейт-1 K1 печать + гейт-2 K5 + апелляция + оценщик). Без неё K4-исключение, live-роутер, наполнение очереди — не активируются.
2. **K4-поправка к стене** (узкое Write-исключение в `decideMode`) — включить ПОСЛЕ Машины 4.
3. **Live-wiring роутера** — регистрация в settings.json (шаг владельца) + замена мокнутого llmCall на `callAnthropicAPI` + режим D28 «сперва тихо».
4. **Перенос волн** — заменить линейный `step_ptr` в `enforce-supreme-gate.main()` на `step-pointer` (дерево).
5. **Доставка 3-E** — врезать `statusSignal`/`renderApprovalSection` в STATUS-генератор + brain-retro SKILL.md.
6. **Наполнение контрактов** — написать контракты для остальных ~84 узлов реестра (данные, не код).
7. **Явные конфликт-рёбра** (`attributes.conflicts_with`) в реестре — наполнить (сейчас пусто → conflictsOf даёт []).
8. **Push** ветки `worktree-brainrepo` в origin — по «да».

---

## АУДИТ МАШИНЫ 3 против канона (2026-06-05, утро) — находки + фикс-сет

Адверсари-сверка по факту (построчно, спека §2/§3 + решение C-13). Механический фундамент 3-A/3-B/3-C и hard-rule 3-E — логика цела, багов в алгоритмах нет; 2212 тестов зелёные. Бреши — на стыке промпта роутера со спекой + один недостроенный гард-рейл контракта.

### Самопоправка
Утренняя пометка «G1–G6 не определены в спеке» — **СНЯТА как ошибочная**. G1–G6 полностью расписаны в решении **C-13** (`2026-06-04-router-mentor-m2-decisions-handoff.md`, стр. 116–121) — это шесть гард-рейлов адаптера ЧУЖИХ скилов. При сборке 3-A не сверился с источником.

### Расклад G1–G6 (адаптер чужих скилов)
- **G1** этикетка про сам скил, без проектных фактов — ⚠️ держится дисциплиной + нейтральной схемой; механической проверки нет → **фикс 5 (опц.)**.
- **G2** лениво (адаптер только для реально используемого) — ✅ соблюдено практикой (2 образца, не 86).
- **G3** детерминированная диспетчеризация (есть+свежий→точно; нет/устарел→мягко, молча не доверять) — ⚠️ **частично**: куски есть (`buildRegistry`+дрейф→`soft-reasoning`), единой функции «по id → точно|мягко» нет → **фикс 4**.
- **G4** хеш-страж дрейфа — ✅ построено (`checkContractDrift`).
- **G5** честная рамка (мягкость→одноразовое авторство+ярлык+страж) — ✅ соблюдено конструкцией.
- **G6** адаптер под журналом М1 + сверка судьёй — ⏸ ждёт Машину 1/4 (не зона 3-A).

### ФИКС-СЕТ (одобрено владельцем: блок А 1–4 + блок В 5)
1. **Заземление семенных навыков** (3-B/3-D, `resolveNode`): резолв по префиксу до `:` ПОСЛЕ суффикса → `superpowers:writing-plans`→узел `superpowers` #19. Чинит L1-цепочку (0 рёбер) + роутер (отклонял свои навыки). Суффикс-резолв сохраняется (`superpowers:architecture-patterns`→#38).
2. **look-ahead + контракты в промпт роутера** (3-D, `buildRouterPrompt`+`runRouter`): принимать контракты, тащить needs/key-decisions вызываемых навыков вперёд. Канон §3.
3. **Нюх 5.3 + интервьюер 4.4 в текст промпта** (3-D): анти-обманная тройка (механически был только 5.2).
4. **G3-диспетчер** (3-A, `skill-contract-registry`): `dispatchContract(registry, skill)` → `{mode:'exact'|'soft-reasoning'}`, отсутствует/дрейф → soft.
5. **G1-страж** (3-A, `skill-contract`): `checkContractNeutrality(contract, {projectTerms})` — мягкая проверка против ИНЪЕЦИРУЕМОГО списка проектных терминов (портативно, без хардкода).

### Корректно отложено (не бреши)
K4-поправка / live-wiring / перенос волн / доставка 3-E / G6 / наполнение контрактов ~84 узлов / конфликт-рёбра — ждут Машину 4 или шаг владельца.

---

## ОТЛОЖЕНО ПО МАШИНЕ 3 — ИТОГОВАЯ СВОДКА (зафиксировано 2026-06-05, после фикс-сета 1–5)

Машина 3 собрана и проаудирована; фикс-сет 1–5 влит (коммиты `14230814`→`b94f7d24`, регрессия 2222 GREEN). **Сознательно отложено** (каждое — ждёт Машину 4 или явный шаг владельца, НЕ брешь):

1. **Машина 4 (судья)** — гейт-1 (печать артефакта K1) + гейт-2 (план K5) + апелляция + оценщик. Корень: без неё не активируются K4 / live-роутер / наполнение очереди.
2. **K4-поправка к стене** — узкое Write-исключение в `enforce-supreme-gate.decideMode`. Включать ТОЛЬКО после Машины 4 (канон M3 §1: фальшивый артефакт некому отбраковать до судьи).
3. **Live-wiring роутера** — регистрация в `.claude/settings.json` (шаг владельца) + замена мокнутого `llmCall` на `callAnthropicAPI` + режим D28 «сперва тихо».
4. **Перенос «волн»** — линейный `step_ptr` в `enforce-supreme-gate.main()` → дерево `step-pointer` (стендовый модуль готов, оттестирован).
5. **Доставка 3-E** — `statusSignal` в `tools/status-md-generator.mjs` + `renderApprovalSection` в `.claude/skills/brain-retro/SKILL.md` (функции готовы, ждут врезки с одобрения).
6. **G6** (адаптер чужого скила под журналом М1 + сверка судьёй) — зона Машин 1/4.
7. **Наполнение контрактов** ~84 узлов реестра — данные, не код (собраны 2 образца).
8. **Явные конфликт-рёбра** `attributes.conflicts_with` — данные (сейчас пусто → `conflictsOf` даёт []).
9. **Push** ветки `worktree-brainrepo` в origin — по «да» владельца.

**Готово и НЕ требует возврата:** 3-A (схема+G1/G4-страж), 3-B (граф+заземление), 3-C (охват A/B/C/D), 3-D (движок+трасса+заземление+нюх/интервьюер/look-ahead), 3-E (очередь hard-rule+разведка rate=0).

