---
name: diagnose
description: "Диагностика ступени мастерства (Диагност R28, FORM.089 §6.1 v5.0) прямо в VS Code / claude.ai. До 6 вопросов, ~3 мин. Сохраняет cp-профиль в канонический журнал learning.cp_assessments через MCP-инструмент сервиса учебного контекста — в браузере и в VS Code одинаково. Запускай когда: пилот говорит «пройди диагностику», «какая моя ступень», «/diagnose» — или ПРОАКТИВНО когда learning_ctx_get_my_cp_assessment вернул null или устаревший профиль, или видишь нового пользователя без данных."
argument-hint: "[необязательно: --check для просмотра профиля без нового опроса]"
related: [WP-318, WP-370, DP.ROLE.042, DP.SC.132, PD.FORM.089]
version: 5.0.0
layer: L1
status: active
browser_safe: true
triggers:
  slash: [/diagnose]
  phrases: []
routing:
  executor: sonnet
  deterministic: false
agents: single
interaction: multi-step
gates_required: []
gates_enforced: []
gates_rationale: "операционный скилл; WP Gate применим только при создании нового РП, не для операционных вызовов"
---

# /diagnose — диагностика ступени мастерства

> ⚡ **Алгоритм, не свободный разговор.** Шаги 1-5 последовательно. Ждать ответа после каждого вопроса. Без преждевременных выводов.

> **Алгоритм CAT (FORM.089 §6.1 v5.0):** 5 якорных вопросов + до 1 drill-down, старт со ступени 3.
> WP-370: cp.iwe → информационный (не блокирует ступень), cp.skl выводится из cp.rhy.

## When to use

Диагностика ступени мастерства (Диагност R28, FORM.089 §6.1 v5.0) прямо в VS Code / claude.ai. До 6 вопросов, ~3 минуты. Запускай когда: пилот говорит «пройди диагностику», «какая моя ступень», «/diagnose» — или ПРОАКТИВНО когда прошлой диагностики нет или она устарела.

## Контракт скилла

- **Вход:** пилот вызвал `/diagnose`, или прошлой диагностики нет (`learning_ctx_get_my_cp_assessment` вернул null или устаревший профиль).
- **Выход:** cp-профиль в чате + сохранение через `learning_ctx_record_cp_assessment` (см. Шаг 5).
- **Время:** ≤3 мин (5-6 вопросов).
- **Не делает:** не даёт рекомендации по развитию (это Навигатор R27), не строит персональное руководство.

## Один путь чтения и записи (оба интерфейса)

В браузере (claude.ai) и в VS Code навык работает через одни и те же MCP-инструменты сервиса учебного контекста — Bash, база данных и переменные окружения не нужны:

- **чтение** прошлой диагностики — `learning_ctx_get_my_cp_assessment` (своя последняя самооценка из журнала, с датой);
- **запись** — `learning_ctx_record_cp_assessment` (статус `pending_evaluation`: это самооценка, ступень подтверждает оценщик ступени, не навык).

Навык не пишет в базу напрямую и не сохраняет профиль в локальные файлы или цифровой двойник (WP-578 Ф21.3: у самооценки один писатель). Инструменты недоступны (MCP Aisystant не подключён) — диагностику провести можно, результат показать в чате, но сказать прямо, что он не сохранён, и как подключить MCP.

## Algorithm

## Шаг 0. Проверить существующий профиль

Вызвать `learning_ctx_get_my_cp_assessment` (без параметров).

- Вернул профиль → показать его (формат ниже, дата — `assessed_at`). Если `assessed_at` моложе 7 дней — спросить «Пройти заново?». Если `expired: true` — сказать, что профиль устарел, и предложить пройти заново.
- Вернул `null` → прошлой диагностики нет, продолжить с Шага 1.
- `--check` → показать и завершить.
- **Ошибка инструмента ≠ `null`.** Сказать: «Не смог проверить прошлую диагностику» — и спросить, проходить ли сейчас. Не утверждать, что профиля нет.

**Кулдаун:** 7 дней — мягкий: при свежем профиле показать и спросить «Пройти заново?», решает пользователь.

**Формат вывода существующего профиля:**

```
📊 Текущий cp-профиль (диагностика от YYYY-MM-DD)

Ступень: [название] ([N] из 5)
Приоритет роста: [слот по-русски]
Рекомендованное руководство: [SN]
Действителен до: YYYY-MM-DD

Хочешь пройти диагностику заново?
```

## Шаг 1. Объявить диагностику

Открыть одним сообщением:

```
🔬 Диагностика ступени мастерства

До 5 вопросов с вариантами ответа. Занимает ~3 минуты.
Выбирайте то, что ближе всего к вашей текущей практике.

Готов? Тогда начнём.
```

Ждать ответа («да», «давай», «начнём» или любой другой — сигнал готовности).

## Шаг 2. Фаза 1 — якорные вопросы (все 5)

Задавать по одному, ждать ответ 1-5 после каждого. Записывать в `scores`.

**Вопрос 1 (cp.rhy):**
```
📍 Вопрос 1 из 5

Как вы ведёте учёт времени на саморазвитие и насколько регулярный ритм?
Сколько примерно часов в неделю?

1 — Не выделяю, как пойдёт
2 — Стараюсь, но без ритма (1-2 ч/нед)
3 — Еженедельно явно (3-4 ч/нед)
4 — Ежедневная практика + трекер (5-10 ч/нед)
5 — Автоматизировано + артефакты (10+ ч/нед)
```

**Вопрос 2 (cp.wld):**
```
📍 Вопрос 2 из 5

Как вы принимаете важные решения?
Через интуицию, ценности или системный анализ?

1 — В основном интуитивно
2 — Пробую разные подходы, не сложилось
3 — Через сформулированные принципы / мировоззрение
4 — Системно: цели, ограничения, альтернативы
5 — Передаю свои методы и принципы другим
```

**Вопрос 3 (cp.int):**
```
📍 Вопрос 3 из 5

Применяете ли вы системное мышление — видите ли роли, границы,
интерфейсы, надсистемы в реальных задачах?

1 — Нет опыта
2 — Слышал(а), но не применяю
3 — Базовые различения (роль/функция/граница)
4 — Системный разбор в работе
5 — Формализую модели, учу других
```

**Вопрос 4 (cp.agt):**
```
📍 Вопрос 4 из 5

Насколько часто задачи за последний месяц были инициированы вами лично —
не «спустили», а вы сами увидели и взяли?

1 — Почти всё спущено сверху
2 — Иногда сам(а), редко
3 — Около половины — мои
4 — Большинство задач — моя инициатива
5 — Задаю повестку для других
```

**Вопрос 5 (cp.iwe — информационный, не блокирует ступень):**
```
📍 Вопрос 5 из 5

Насколько у вас настроена среда работы со знаниями —
заметки, база знаний, инструменты (VS Code + Pack + ИИ, или альтернативы)?

1 — Среды нет
2 — Простейшее (заметки в телефоне, папка в облаке)
3 — Базово настроено, пользуюсь регулярно
4 — Несколько сервисов, структура, связи, поиск
5 — Развиваю как систему — Pack/протоколы/агенты
```

После всех 5 вопросов: `scores = {cp.rhy: X, cp.wld: X, cp.int: X, cp.agt: X, cp.iwe: X}`.

**WP-370: cp.skl выводится из cp.rhy** (§6.1 v5.0 — ритм и мастерство коррелируют):
```python
scores['cp.skl'] = scores['cp.rhy']
```

## Шаг 3. Фаза 2 — drill-down (при необходимости)

**MANDATORY_SLOTS = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.int', 'cp.agt']** — cp.iwe исключён.

```python
mandatory_scores = {s: scores[s] for s in MANDATORY_SLOTS}
bottleneck_slot = min(mandatory_scores, key=mandatory_scores.get)
need_drilldown = mandatory_scores[bottleneck_slot] < 3
```

Если `need_drilldown = True` — задать один уточняющий вопрос по bottleneck:

| Bottleneck | Вопрос |
|---|---|
| cp.rhy / cp.skl | «Есть ли у вас «ритуалы» начала/завершения рабочей недели? Или регулярные точки рефлексии?»<br>1-Нет ничего / 2-Иногда делаю итоги / 3-Еженедельный ритуал / 4-Структурированные ритуалы / 5-Полная ОРЗ-практика |
| cp.wld | «Можете назвать 2-3 принципа, которые направляют ваши решения? Насколько они явные?»<br>1-Не сформулированы / 2-Смутное ощущение / 3-Могу назвать 1-2 / 4-Явные, записаны / 5-Работающая система |
| cp.int | «Пробовали ли вы разбирать ситуацию через надсистему и подсистему? Выделять роли, функции, ограничения?»<br>1-Незнакомо / 2-Слышал(а), не применял(а) / 3-Интуитивно / 4-Осознанно / 5-Учу других |
| cp.agt | «Берёте ли вы на себя ответственность за результат, даже если обстоятельства были неблагоприятные?»<br>1-Объясняю обстоятельствами / 2-Иногда беру / 3-Обычно беру / 4-Всегда беру / 5-Задаю стандарты |

Ответ drill-down обновляет соответствующий слот в `scores`. Если bottleneck = cp.skl — обновить cp.rhy, и снова переопределить `scores['cp.skl'] = scores['cp.rhy']`.

## Шаг 4. Вычислить профиль

```python
MANDATORY_SLOTS = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.int', 'cp.agt']

vals = {s: scores.get(s, 2) for s in MANDATORY_SLOTS}
stage = min(vals.values())
bottleneck = 'none' if stage >= 4 else min(vals, key=vals.get)

if stage == 5:
    recommended_stream = 'РР'
else:
    recommended_stream = f'S{max(1, min(4, stage))}'
```

Ступени: 1-Случайный / 2-Практикующий / 3-Систематический / 4-Дисциплинированный / 5-Проактивный

Bottleneck по-русски:
- cp.rhy → «регулярность и ритм занятий»
- cp.wld → «мировоззрение и системный взгляд»
- cp.skl → «учёт времени и собранность»
- cp.iwe → «рабочая среда и инструменты»
- cp.int → «системное мышление»
- cp.agt → «агентность и инициатива»
- 'none' → «Узких мест нет — поддерживайте темп и берите следующие ступени»

Потоки: S1-«Фундамент» / S2-«Систематизация» / S3-«Масштаб» / S4-«Передача» / РР-«Рабочее развитие»

## Шаг 5. Показать результат и сохранить

Сначала показать итог в чате:

```
📊 Результаты диагностики

Ступень: [НАЗВАНИЕ] ([N] из 5)

[Приоритет роста: <bottleneck по-русски>]
ИЛИ
[Узких мест нет — поддерживайте темп.]

Рекомендованное руководство: [SN] — [label]
[При stage=5: «Следующая программа: Рабочее развитие (РР)»]

Профиль по слотам:
cp.rhy [N] | cp.wld [N] | cp.skl [N]
cp.iwe [N] | cp.int [N] | cp.agt [N]

(действителен 180 дней)
```

Затем сохранить — одинаково в браузере и в VS Code.

### Сохранить через learning_ctx_record_cp_assessment

**Одно прохождение — один `event_id`.** Сгенерировать его один раз перед первой попыткой записи: `diagnose-<интерфейс>-<occurred_at>` (например, `diagnose-vscode-20261029T081500Z`), где `occurred_at` — момент завершения опроса (ISO UTC). При повторе после сбоя использовать **тот же `event_id` и тот же набор полей целиком**, включая `occurred_at`: повтор идемпотентен и не создаёт вторую запись. Исправленная самооценка — это новое прохождение и новый `event_id`.

Вызвать `learning_ctx_record_cp_assessment`:
- **event_id:** `<сгенерированный>`
- **stage:** `<N>`
- **cp_scores:** `{"cp.rhy": <N>, "cp.wld": <N>, "cp.skl": <N>, "cp.iwe": <N>, "cp.int": <N>, "cp.agt": <N>}`
- **bottleneck_slot:** `<cp.xxx или 'none'>`
- **recommended_stream:** `<SN или 'РР'>`
- **skip_to_stage:** `<N>`
- **questions_count:** `<число заданных вопросов>`
- **rcs_version:** `v5.0`
- **occurred_at:** `<occurred_at>`
- **written_by:** `browser` в claude.ai, `vscode` в VS Code

**Три исхода — говорить пользователю ровно то, что произошло:**

| Ответ инструмента | Что сказать |
|---|---|
| Успех, в том числе `duplicate: true` | `✅ Профиль сохранён` |
| Ошибка аргументов, авторизации или инструмента нет | «Профиль не сохранён: <причина>». Показать профиль в чате |
| Тайм-аут, обрыв связи | «Сохранение не подтверждено» — повторить один раз тем же вызовом; снова не вышло — показать профиль в чате и предложить повторить позже |

`event_recorded: false` в ответе значит: профиль сохранён, но событие для ленты активности не записалось. Сказать «сохранён», повторить тот же вызов один раз — повтор дописывает событие.

## Шаг 6. Следующий шаг

После показа результата — предложить:
```
Следующий шаг:
→ Навигатор, как развивать [bottleneck по-русски]? — рекомендации по росту
→ /progress в боте — посмотреть полный профиль прогресса
```

## Граничные случаи

| Ситуация | Действие |
|---|---|
| Пилот не отвечает числом 1-5 | Переспросить: «Выбери цифру от 1 до 5» |
| Пилот хочет пропустить вопрос | Присвоить дефолт 2 (conservative), перейти дальше |
| Менее 4 mandatory-ответов | Показать «Диагностика не завершена», предложить `/diagnose` заново |
| Инструменты сервиса учебного контекста недоступны | Провести диагностику, показать профиль в чате, сказать «не сохранено» и как подключить MCP Aisystant |
| Чтение прошлой диагностики вернуло ошибку | «Не смог проверить прошлую диагностику», спросить, проходить ли сейчас |
| Профиль уже есть (< 7 дней) | Показать и спросить: «Пройти заново?» |

## Проактивный триггер

Claude должен предложить `/diagnose` **без явного запроса** когда:
1. `learning_ctx_get_my_cp_assessment` вернул `null` или профиль с `expired: true`
2. В `day-open` IWE-данные пустые или `stage = null`
3. Пилот говорит «с чего начать», «как мне развиваться», «что делать дальше» — без контекста ступени

Формулировка предложения:
```
Вижу, что cp-профиль не заполнен (или устарел).
Хочешь пройти диагностику ступени? ~3 мин, 5 вопросов — скажи «да» или /diagnose.
```

<!-- USER-SPACE -->

<!-- /USER-SPACE -->
