# Фикс (wall): резолв ID узлов → имена в скил-контексте наставника

## Цель

На ревью плана наставник получает рекомендацию роутера как голые ID узлов (#4, #6) и не может
оценить их уместность — в живом вердикте он буквально пишет «не могу подтвердить их содержание».
Скил-сверка наставника при этом полая. Сделать скил-контекст человекочитаемым: резолвить каждый
рекомендованный ID в «#N — имя» через уже загруженный реестр, чтобы наставник реально судил
уместность скилов.

## Решение

- `renderSkillContext` (tools/mentor-seam.mjs) принимает дополнительный вход — реестр — и рендерит
  каждый ID рекомендации как `#N — имя` (через `registry.indexById.get(id)`, `node.name || node.slug`),
  вместо голого `#N`.
- `onPlanWrite` (tools/on-plan-write.mjs) прокидывает уже доступный ему `registry` в
  `renderSkillContext` (реестр он получает параметром, для classify).
- Fail-safe: неизвестный ID / реестр отсутствует / битая запись → откат на голый `#N` (не падать,
  не выдумывать имя).

## Границы

- `classify` (мозг роутера), вердикт наставника, судья, печать — НЕ трогаем.
- Меняем только слой рендера скил-контекста + проброс реестра в него.
- Граф `nodes.yaml` и карточки — НЕ меняем (только читаем имена/описания).

## Исполнение под способ-B стеной

Фикс исполняется ПОД способ-B стеной по TDD: план переоформлен в линейный wall-исполнимый скрипт
(`docs/superpowers/plans/2026-06-13-mentor-skill-resolve-wall-plan.md`), где каждое действие
(правка теста → vitest RED → правка исходника → vitest GREEN → полная регрессия) — отдельный шаг
плана в порядке исполнения. Шаги без `ref` (TDD-микрошаги самодостаточны).

## Критерий приёмки

- `renderSkillContext` с реестром резолвит `#N` → имя; без реестра/неизвестный ID → голый `#N`
  (fail-safe), не бросает.
- `onPlanWrite` передаёт реестр в `renderSkillContext`; промпт наставника несёт имена скилов,
  а не голые номера.
- Регрессия tools-only зелёная (база 3901), скил-сверочные тесты обновлены.

```verified-context-json
[{"id":"1","kind":"EXTRACTED","claim":"renderSkillContext склеивает рекомендацию сырыми ID","ref":"tools/mentor-seam.mjs:58","anchor":"export function renderSkillContext"},
{"id":"2","kind":"EXTRACTED","claim":"onPlanWrite строит skillContext без registry","ref":"tools/on-plan-write.mjs:55","anchor":"renderSkillContext({ declared: declaredSkills"},
{"id":"3","kind":"EXTRACTED","claim":"реестр с именами узлов загружается loadRegistry (node.name есть)","ref":"tools/registry-load.mjs:18","anchor":"export function loadRegistry"},
{"id":"4","kind":"EXTRACTED","claim":"узел #4 имеет name markdownlint-cli2","ref":"docs/registry/nodes.yaml:40","anchor":"name: \"markdownlint-cli2\""}]
```
