Claude Skill

diagnose

Диагностика ступени мастерства (Диагност R28, FORM.089 §6.1 v5.0) прямо в VS Code / claude.ai. До 6 вопросов, ~3 мин. Сохраняет cp-профиль в цифровой двойник (browser) или Neon (VS Code). Запускай когда: пилот говорит «пройди диагностику», «какая моя ступень», «/diagnose» — или П

LLM Mart · 0 points · 14 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download TserenTserenov-FMT-exocortex-template-.claude_skills_diagnose-52c884b.zip · 7 KB
Part of tserentserenov/fmt-exocortex-template — 50 skills

Install

skills CLI npx skills add https://github.com/TserenTserenov/FMT-exocortex-template/tree/main/.claude/skills/diagnose
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install tserentserenov-fmt-exocortex-template@llmmart
Git git clone https://github.com/TserenTserenov/FMT-exocortex-template.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole tserentserenov/fmt-exocortex-template collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

/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» — или ПРОАКТИВНО когда видишь пустой cp_profile.

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

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

Определить интерфейс (ПЕРВЫМ действием)

Браузер (claude.ai): инструмент Bash недоступен → сохранение через learning_ctx_record_cp_assessment (канонический журнал). VS Code / локальный: Bash доступен → сохранение в Neon через psycopg2 (+ локальный fallback).

Проверка: попробовать Bash. Если недоступен — работаем в браузерном режиме.

Algorithm

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

Браузерный режим

Вызвать mcp__claude_ai_IWE__learning_ctx_get_onboarding_state (читает из того же канона learning.cp_assessments, куда пишет Шаг 5).

  • has_diagnosis: true → показать текущий cp_stage, предложить пройти заново (кнопка «Повторить»). Инструмент не отдаёт assessed_at — точный 7-дневный кулдаун (как в VS Code режиме) здесь не проверить; решение «повторять или нет» оставить пилоту.
  • --check → показать и завершить.
  • has_diagnosis: false → продолжить с Шага 1.

VS Code режим

source ~/.config/aist/env
python3 -c "
import os, json
try:
    import psycopg2
    conn = psycopg2.connect(os.environ['NEON_LEARNING_URL'])
    cur = conn.cursor()
    cur.execute('''SELECT stage, bottleneck_slot, recommended_stream, assessed_at, valid_until
                   FROM learning.cp_assessments
                   WHERE account_id = %s::uuid
                   ORDER BY assessed_at DESC LIMIT 1''',
                (os.environ['DT_USER_ID'],))
    row = cur.fetchone()
    conn.close()
    if row:
        stage, bottleneck, stream, assessed_at, valid_until = row
        print(json.dumps({'stage': stage, 'bottleneck': bottleneck, 'stream': stream,
                          'assessed_at': str(assessed_at)[:10], 'valid_until': str(valid_until)[:10]}))
    else:
        print('null')
except Exception as e:
    print(f'error: {e}')
"

Кулдаун: 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 — ритм и мастерство коррелируют):

scores['cp.skl'] = scores['cp.rhy']

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

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

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

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

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

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 дней)

Затем сохранить — путь зависит от интерфейса:

Браузерный режим (claude.ai) — сохранить через learning_ctx_record_cp_assessment

Вычислить occurred_at (сейчас, ISO UTC). Сгенерировать event_id для идемпотентности: diagnose-browser-<occurred_at> (ISO-время без разделителей допустимо, важно только не повторить в рамках одной сессии).

Вызвать mcp__claude_ai_IWE__learning_ctx_record_cp_assessment (пишет в канонический журнал learning.cp_assessments, тот же, что и VS Code режим ниже — не в личный цифровой двойник):

  • 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

Если вызов вернул успех → сообщить: ✅ Профиль сохранён (без упоминания «цифровой двойник» — запись идёт в общий журнал). Если ошибка → показать профиль в чате и попросить пользователя скопировать его вручную.

VS Code режим — сохранить в Neon через Bash

source ~/.config/aist/env
CP_SCORES='<JSON с финальными scores>' \
CP_Q_COUNT=<число заданных вопросов> \
python3 -c "
import os, json, datetime as dt_lib

scores_raw = os.environ['CP_SCORES']
q_count    = int(os.environ.get('CP_Q_COUNT', '5'))
account_id = os.environ.get('DT_USER_ID', '')
url        = os.environ.get('NEON_LEARNING_URL', '')

ALL_SLOTS     = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.iwe', 'cp.int', 'cp.agt']
MANDATORY     = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.int', 'cp.agt']
scores = json.loads(scores_raw)
vals   = {s: int(scores.get(s, 2)) for s in ALL_SLOTS}

# derive cp.skl from cp.rhy (FORM.089 §6.1 v5.0)
vals['cp.skl'] = vals['cp.rhy']

stage  = min(vals[s] for s in MANDATORY)
bn     = 'none' if stage >= 4 else min(MANDATORY, key=lambda s: vals[s])
stream = 'РР' if stage == 5 else 'S' + str(max(1, min(4, stage)))
valid  = dt_lib.datetime.now(dt_lib.timezone.utc) + dt_lib.timedelta(days=180)

saved = False
if url and account_id:
    try:
        import psycopg2
        conn = psycopg2.connect(url)
        cur  = conn.cursor()
        cur.execute(
            '''INSERT INTO learning.cp_assessments
               (account_id, stage, bottleneck_slot, recommended_stream, skip_to_stage,
                cp_scores, source, interface, questions_count, rcs_version, valid_until)
               VALUES (%s::uuid, %s, %s, %s, %s, %s::jsonb, %s, %s, %s, %s, %s)
               RETURNING id''',
            (account_id, stage, bn, stream, stage, json.dumps(vals),
             'self_report', 'vscode', q_count, 'v5.0', valid)
        )
        row_id = cur.fetchone()[0]
        conn.commit()
        conn.close()
        print(f'OK neon id={row_id}')
        saved = True
    except Exception as e:
        print(f'neon error: {e}')

if not saved:
    import pathlib
    d = pathlib.Path.home() / '.aist' / 'cp-assessments'
    d.mkdir(parents=True, exist_ok=True)
    path = d / (dt_lib.date.today().isoformat() + '.json')
    path.write_text(json.dumps({'account_id': account_id, 'stage': stage,
        'bottleneck_slot': bn, 'recommended_stream': stream,
        'cp_scores': vals, 'source': 'self_report', 'interface': 'vscode',
        'questions_count': q_count, 'rcs_version': 'v5.0',
        'valid_until': valid.isoformat()}, indent=2))
    print(f'saved local: {path}')
"

Если вывод содержит OK neon — профиль в Neon. Если saved local — сохранён локально.

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

После показа результата — предложить:

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

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

Ситуация Действие
Пилот не отвечает числом 1-5 Переспросить: «Выбери цифру от 1 до 5»
Пилот хочет пропустить вопрос Присвоить дефолт 2 (conservative), перейти дальше
Менее 4 mandatory-ответов Показать «Диагностика не завершена», предложить /diagnose заново
learning_ctx_record_cp_assessment недоступен Показать профиль в чате, попросить скопировать
psycopg2 не установлен (VS Code) Сохранить в ~/.aist/cp-assessments/YYYY-MM-DD.json
Профиль уже есть (< 7 дней) Показать и спросить: «Пройти заново?»

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

Claude должен предложить /diagnose без явного запроса когда:

  1. В learning_ctx_get_onboarding_state — has_diagnosis: false или cp_stage = null
  2. В day-open IWE-данные пустые или stage = null
  3. Пилот говорит «с чего начать», «как мне развиваться», «что делать дальше» — без контекста ступени

Формулировка предложения:

Вижу, что cp-профиль не заполнен (или устарел).
Хочешь пройти диагностику ступени? ~3 мин, 5 вопросов — скажи «да» или /diagnose.
Files (fmt-exocortex-template)
  • SKILL.md 19.8 KB
    ---
    name: diagnose
    description: "Диагностика ступени мастерства (Диагност R28, FORM.089 §6.1 v5.0) прямо в VS Code / claude.ai. До 6 вопросов, ~3 мин. Сохраняет cp-профиль в канонический журнал learning.cp_assessments — через MCP-инструмент (browser) или напрямую в Neon (VS Code). Запускай когда: пилот говорит «пройди диагностику», «какая моя ступень», «/diagnose» — или ПРОАКТИВНО когда видишь пустой cp_profile или нового пользователя без данных."
    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» — или ПРОАКТИВНО когда видишь пустой cp_profile.
    
    ## Контракт скилла
    
    - **Вход:** пилот вызвал `/diagnose`, или Claude видит пустой cp_profile.
    - **Выход:** cp-профиль в чате + сохранение (путь зависит от интерфейса — см. Шаг 5).
    - **Время:** ≤3 мин (5-6 вопросов).
    - **Не делает:** не даёт рекомендации по развитию (это Навигатор R27), не строит персональное руководство.
    
    ## Определить интерфейс (ПЕРВЫМ действием)
    
    **Браузер (claude.ai):** инструмент Bash недоступен → сохранение через `learning_ctx_record_cp_assessment` (канонический журнал).
    **VS Code / локальный:** Bash доступен → сохранение в Neon через psycopg2 (+ локальный fallback).
    
    Проверка: попробовать Bash. Если недоступен — работаем в браузерном режиме.
    
    ## Algorithm
    
    ## Шаг 0. Проверить существующий профиль
    
    ### Браузерный режим
    
    Вызвать `mcp__claude_ai_IWE__learning_ctx_get_onboarding_state` (читает из того же канона `learning.cp_assessments`, куда пишет Шаг 5).
    
    - `has_diagnosis: true` → показать текущий `cp_stage`, предложить пройти заново (кнопка «Повторить»). Инструмент не отдаёт `assessed_at` — точный 7-дневный кулдаун (как в VS Code режиме) здесь не проверить; решение «повторять или нет» оставить пилоту.
    - `--check` → показать и завершить.
    - `has_diagnosis: false` → продолжить с Шага 1.
    
    ### VS Code режим
    
    ```bash
    source ~/.config/aist/env
    python3 -c "
    import os, json
    try:
        import psycopg2
        conn = psycopg2.connect(os.environ['NEON_LEARNING_URL'])
        cur = conn.cursor()
        cur.execute('''SELECT stage, bottleneck_slot, recommended_stream, assessed_at, valid_until
                       FROM learning.cp_assessments
                       WHERE account_id = %s::uuid
                       ORDER BY assessed_at DESC LIMIT 1''',
                    (os.environ['DT_USER_ID'],))
        row = cur.fetchone()
        conn.close()
        if row:
            stage, bottleneck, stream, assessed_at, valid_until = row
            print(json.dumps({'stage': stage, 'bottleneck': bottleneck, 'stream': stream,
                              'assessed_at': str(assessed_at)[:10], 'valid_until': str(valid_until)[:10]}))
        else:
            print('null')
    except Exception as e:
        print(f'error: {e}')
    "
    ```
    
    **Кулдаун:** 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 дней)
    ```
    
    Затем сохранить — путь зависит от интерфейса:
    
    ### Браузерный режим (claude.ai) — сохранить через learning_ctx_record_cp_assessment
    
    Вычислить `occurred_at` (сейчас, ISO UTC). Сгенерировать `event_id` для идемпотентности: `diagnose-browser-<occurred_at>` (ISO-время без разделителей допустимо, важно только не повторить в рамках одной сессии).
    
    Вызвать `mcp__claude_ai_IWE__learning_ctx_record_cp_assessment` (пишет в канонический журнал `learning.cp_assessments`, тот же, что и VS Code режим ниже — не в личный цифровой двойник):
    - **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`
    
    Если вызов вернул успех → сообщить: `✅ Профиль сохранён` (без упоминания «цифровой двойник» — запись идёт в общий журнал).
    Если ошибка → показать профиль в чате и попросить пользователя скопировать его вручную.
    
    ### VS Code режим — сохранить в Neon через Bash
    
    ```bash
    source ~/.config/aist/env
    CP_SCORES='<JSON с финальными scores>' \
    CP_Q_COUNT=<число заданных вопросов> \
    python3 -c "
    import os, json, datetime as dt_lib
    
    scores_raw = os.environ['CP_SCORES']
    q_count    = int(os.environ.get('CP_Q_COUNT', '5'))
    account_id = os.environ.get('DT_USER_ID', '')
    url        = os.environ.get('NEON_LEARNING_URL', '')
    
    ALL_SLOTS     = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.iwe', 'cp.int', 'cp.agt']
    MANDATORY     = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.int', 'cp.agt']
    scores = json.loads(scores_raw)
    vals   = {s: int(scores.get(s, 2)) for s in ALL_SLOTS}
    
    # derive cp.skl from cp.rhy (FORM.089 §6.1 v5.0)
    vals['cp.skl'] = vals['cp.rhy']
    
    stage  = min(vals[s] for s in MANDATORY)
    bn     = 'none' if stage >= 4 else min(MANDATORY, key=lambda s: vals[s])
    stream = 'РР' if stage == 5 else 'S' + str(max(1, min(4, stage)))
    valid  = dt_lib.datetime.now(dt_lib.timezone.utc) + dt_lib.timedelta(days=180)
    
    saved = False
    if url and account_id:
        try:
            import psycopg2
            conn = psycopg2.connect(url)
            cur  = conn.cursor()
            cur.execute(
                '''INSERT INTO learning.cp_assessments
                   (account_id, stage, bottleneck_slot, recommended_stream, skip_to_stage,
                    cp_scores, source, interface, questions_count, rcs_version, valid_until)
                   VALUES (%s::uuid, %s, %s, %s, %s, %s::jsonb, %s, %s, %s, %s, %s)
                   RETURNING id''',
                (account_id, stage, bn, stream, stage, json.dumps(vals),
                 'self_report', 'vscode', q_count, 'v5.0', valid)
            )
            row_id = cur.fetchone()[0]
            conn.commit()
            conn.close()
            print(f'OK neon id={row_id}')
            saved = True
        except Exception as e:
            print(f'neon error: {e}')
    
    if not saved:
        import pathlib
        d = pathlib.Path.home() / '.aist' / 'cp-assessments'
        d.mkdir(parents=True, exist_ok=True)
        path = d / (dt_lib.date.today().isoformat() + '.json')
        path.write_text(json.dumps({'account_id': account_id, 'stage': stage,
            'bottleneck_slot': bn, 'recommended_stream': stream,
            'cp_scores': vals, 'source': 'self_report', 'interface': 'vscode',
            'questions_count': q_count, 'rcs_version': 'v5.0',
            'valid_until': valid.isoformat()}, indent=2))
        print(f'saved local: {path}')
    "
    ```
    
    Если вывод содержит `OK neon` — профиль в Neon. Если `saved local` — сохранён локально.
    
    ## Шаг 6. Следующий шаг
    
    После показа результата — предложить:
    ```
    Следующий шаг:
    → Навигатор, как развивать [bottleneck по-русски]? — рекомендации по росту
    → /diagnose в боте — синхронизировать профиль
    → /progress в боте — посмотреть полный профиль прогресса
    ```
    
    ## Граничные случаи
    
    | Ситуация | Действие |
    |---|---|
    | Пилот не отвечает числом 1-5 | Переспросить: «Выбери цифру от 1 до 5» |
    | Пилот хочет пропустить вопрос | Присвоить дефолт 2 (conservative), перейти дальше |
    | Менее 4 mandatory-ответов | Показать «Диагностика не завершена», предложить `/diagnose` заново |
    | learning_ctx_record_cp_assessment недоступен | Показать профиль в чате, попросить скопировать |
    | psycopg2 не установлен (VS Code) | Сохранить в `~/.aist/cp-assessments/YYYY-MM-DD.json` |
    | Профиль уже есть (< 7 дней) | Показать и спросить: «Пройти заново?» |
    
    ## Проактивный триггер
    
    Claude должен предложить `/diagnose` **без явного запроса** когда:
    1. В `learning_ctx_get_onboarding_state` — `has_diagnosis: false` или `cp_stage = null`
    2. В `day-open` IWE-данные пустые или `stage = null`
    3. Пилот говорит «с чего начать», «как мне развиваться», «что делать дальше» — без контекста ступени
    
    Формулировка предложения:
    ```
    Вижу, что cp-профиль не заполнен (или устарел).
    Хочешь пройти диагностику ступени? ~3 мин, 5 вопросов — скажи «да» или /diagnose.
    ```
    
    <!-- USER-SPACE -->
    
    <!-- /USER-SPACE -->
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related