{"slug":"diagnose","title":"diagnose","summary":"Диагностика ступени мастерства (Диагност R28, FORM.089 §6.1 v5.0) прямо в VS Code / claude.ai. До 6 вопросов, ~3 мин. Сохраняет cp-профиль в цифровой двойник (browser) или Neon (VS Code). Запускай когда: пилот говорит «пройди диагностику», «какая моя ступень», «/diagnose» — или П","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-27T16:56:16.198097Z","repo":{"url":"https://github.com/TserenTserenov/FMT-exocortex-template","stars":60,"forks":152,"license":"MIT","updatedAt":"2026-09-24T08:59:39Z"},"bodyHtml":"<hr>\n<h2>name: diagnose\ndescription: \"Диагностика ступени мастерства (Диагност R28, FORM.089 §6.1 v5.0) прямо в VS Code / claude.ai. До 6 вопросов, ~3 мин. Сохраняет cp-профиль в цифровой двойник (browser) или Neon (VS Code). Запускай когда: пилот говорит «пройди диагностику», «какая моя ступень», «/diagnose» — или ПРОАКТИВНО когда видишь пустой cp_profile или нового пользователя без данных.\"\nargument-hint: \"[необязательно: --check для просмотра профиля без нового опроса]\"\nrelated: [WP-318, WP-370, DP.ROLE.042, DP.SC.132, PD.FORM.089]\nversion: 5.0.0\nlayer: L1\nstatus: active\ntriggers:\nslash: [/diagnose]\nphrases: []\nrouting:\nexecutor: sonnet\ndeterministic: false\nagents: single\ninteraction: multi-step\ngates_required: []\ngates_enforced: []\ngates_rationale: \"операционный скилл; WP Gate применим только при создании нового РП, не для операционных вызовов\"</h2>\n<h1>/diagnose — диагностика ступени мастерства</h1>\n<blockquote>\n<p>⚡ <strong>Алгоритм, не свободный разговор.</strong> Шаги 1-5 последовательно. Ждать ответа после каждого вопроса. Без преждевременных выводов.</p>\n</blockquote>\n<blockquote>\n<p><strong>Алгоритм CAT (FORM.089 §6.1 v5.0):</strong> 5 якорных вопросов + до 1 drill-down, старт со ступени 3.\nWP-370: cp.iwe → информационный (не блокирует ступень), cp.skl выводится из cp.rhy.</p>\n</blockquote>\n<h2>When to use</h2>\n<p>Диагностика ступени мастерства (Диагност R28, FORM.089 §6.1 v5.0) прямо в VS Code / claude.ai. До 6 вопросов, ~3 минуты. Запускай когда: пилот говорит «пройди диагностику», «какая моя ступень», «/diagnose» — или ПРОАКТИВНО когда видишь пустой cp_profile.</p>\n<h2>Контракт скилла</h2>\n<ul>\n<li><strong>Вход:</strong> пилот вызвал <code>/diagnose</code>, или Claude видит пустой cp_profile.</li>\n<li><strong>Выход:</strong> cp-профиль в чате + сохранение (путь зависит от интерфейса — см. Шаг 5).</li>\n<li><strong>Время:</strong> ≤3 мин (5-6 вопросов).</li>\n<li><strong>Не делает:</strong> не даёт рекомендации по развитию (это Навигатор R27), не строит персональное руководство.</li>\n</ul>\n<h2>Определить интерфейс (ПЕРВЫМ действием)</h2>\n<p><strong>Браузер (claude.ai):</strong> инструмент Bash недоступен → сохранение через <code>dt_write_digital_twin</code>.\n<strong>VS Code / локальный:</strong> Bash доступен → сохранение в Neon через psycopg2 (+ локальный fallback).</p>\n<p>Проверка: попробовать Bash. Если недоступен — работаем в браузерном режиме.</p>\n<h2>Algorithm</h2>\n<h2>Шаг 0. Проверить существующий профиль</h2>\n<h3>Браузерный режим</h3>\n<p>Вызвать <code>mcp__claude_ai_IWE__dt_read_digital_twin</code> с path <code>1_declarative/cp_profile</code>.</p>\n<p>Если возвращает данные с полем <code>assessed_at</code> — проверить возраст:</p>\n<ul>\n<li>Профиль есть и моложе 7 дней → показать, предложить пройти заново (кнопка «Повторить»).</li>\n<li><code>--check</code> → показать и завершить.</li>\n<li>Нет профиля или старше 7 дней → продолжить с Шага 1.</li>\n</ul>\n<h3>VS Code режим</h3>\n<pre><code>source ~/.config/aist/env\npython3 -c \"\nimport os, json\ntry:\n    import psycopg2\n    conn = psycopg2.connect(os.environ['NEON_LEARNING_URL'])\n    cur = conn.cursor()\n    cur.execute('''SELECT stage, bottleneck_slot, recommended_stream, assessed_at, valid_until\n                   FROM learning.cp_assessments\n                   WHERE account_id = %s::uuid\n                   ORDER BY assessed_at DESC LIMIT 1''',\n                (os.environ['DT_USER_ID'],))\n    row = cur.fetchone()\n    conn.close()\n    if row:\n        stage, bottleneck, stream, assessed_at, valid_until = row\n        print(json.dumps({'stage': stage, 'bottleneck': bottleneck, 'stream': stream,\n                          'assessed_at': str(assessed_at)[:10], 'valid_until': str(valid_until)[:10]}))\n    else:\n        print('null')\nexcept Exception as e:\n    print(f'error: {e}')\n\"\n</code></pre>\n<p><strong>Кулдаун:</strong> 7 дней. При свежем профиле — показать и спросить «Пройти заново?».</p>\n<p><strong>Формат вывода существующего профиля:</strong></p>\n<pre><code>\uD83D\uDCCA Текущий cp-профиль (диагностика от YYYY-MM-DD)\n\nСтупень: [название] ([N] из 5)\nПриоритет роста: [слот по-русски]\nРекомендованное руководство: [SN]\nДействителен до: YYYY-MM-DD\n\nХочешь пройти диагностику заново?\n</code></pre>\n<h2>Шаг 1. Объявить диагностику</h2>\n<p>Открыть одним сообщением:</p>\n<pre><code>\uD83D\uDD2C Диагностика ступени мастерства\n\nДо 5 вопросов с вариантами ответа. Занимает ~3 минуты.\nВыбирайте то, что ближе всего к вашей текущей практике.\n\nГотов? Тогда начнём.\n</code></pre>\n<p>Ждать ответа («да», «давай», «начнём» или любой другой — сигнал готовности).</p>\n<h2>Шаг 2. Фаза 1 — якорные вопросы (все 5)</h2>\n<p>Задавать по одному, ждать ответ 1-5 после каждого. Записывать в <code>scores</code>.</p>\n<p><strong>Вопрос 1 (cp.rhy):</strong></p>\n<pre><code>\uD83D\uDCCD Вопрос 1 из 5\n\nКак вы ведёте учёт времени на саморазвитие и насколько регулярный ритм?\nСколько примерно часов в неделю?\n\n1 — Не выделяю, как пойдёт\n2 — Стараюсь, но без ритма (1-2 ч/нед)\n3 — Еженедельно явно (3-4 ч/нед)\n4 — Ежедневная практика + трекер (5-10 ч/нед)\n5 — Автоматизировано + артефакты (10+ ч/нед)\n</code></pre>\n<p><strong>Вопрос 2 (cp.wld):</strong></p>\n<pre><code>\uD83D\uDCCD Вопрос 2 из 5\n\nКак вы принимаете важные решения?\nЧерез интуицию, ценности или системный анализ?\n\n1 — В основном интуитивно\n2 — Пробую разные подходы, не сложилось\n3 — Через сформулированные принципы / мировоззрение\n4 — Системно: цели, ограничения, альтернативы\n5 — Передаю свои методы и принципы другим\n</code></pre>\n<p><strong>Вопрос 3 (cp.int):</strong></p>\n<pre><code>\uD83D\uDCCD Вопрос 3 из 5\n\nПрименяете ли вы системное мышление — видите ли роли, границы,\nинтерфейсы, надсистемы в реальных задачах?\n\n1 — Нет опыта\n2 — Слышал(а), но не применяю\n3 — Базовые различения (роль/функция/граница)\n4 — Системный разбор в работе\n5 — Формализую модели, учу других\n</code></pre>\n<p><strong>Вопрос 4 (cp.agt):</strong></p>\n<pre><code>\uD83D\uDCCD Вопрос 4 из 5\n\nНасколько часто задачи за последний месяц были инициированы вами лично —\nне «спустили», а вы сами увидели и взяли?\n\n1 — Почти всё спущено сверху\n2 — Иногда сам(а), редко\n3 — Около половины — мои\n4 — Большинство задач — моя инициатива\n5 — Задаю повестку для других\n</code></pre>\n<p><strong>Вопрос 5 (cp.iwe — информационный, не блокирует ступень):</strong></p>\n<pre><code>\uD83D\uDCCD Вопрос 5 из 5\n\nНасколько у вас настроена среда работы со знаниями —\nзаметки, база знаний, инструменты (VS Code + Pack + ИИ, или альтернативы)?\n\n1 — Среды нет\n2 — Простейшее (заметки в телефоне, папка в облаке)\n3 — Базово настроено, пользуюсь регулярно\n4 — Несколько сервисов, структура, связи, поиск\n5 — Развиваю как систему — Pack/протоколы/агенты\n</code></pre>\n<p>После всех 5 вопросов: <code>scores = {cp.rhy: X, cp.wld: X, cp.int: X, cp.agt: X, cp.iwe: X}</code>.</p>\n<p><strong>WP-370: cp.skl выводится из cp.rhy</strong> (§6.1 v5.0 — ритм и мастерство коррелируют):</p>\n<pre><code>scores['cp.skl'] = scores['cp.rhy']\n</code></pre>\n<h2>Шаг 3. Фаза 2 — drill-down (при необходимости)</h2>\n<p><strong>MANDATORY_SLOTS = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.int', 'cp.agt']</strong> — cp.iwe исключён.</p>\n<pre><code>mandatory_scores = {s: scores[s] for s in MANDATORY_SLOTS}\nbottleneck_slot = min(mandatory_scores, key=mandatory_scores.get)\nneed_drilldown = mandatory_scores[bottleneck_slot] &lt; 3\n</code></pre>\n<p>Если <code>need_drilldown = True</code> — задать один уточняющий вопрос по bottleneck:</p>\n<table>\n<thead>\n<tr>\n<th>Bottleneck</th>\n<th>Вопрос</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>cp.rhy / cp.skl</td>\n<td>«Есть ли у вас «ритуалы» начала/завершения рабочей недели? Или регулярные точки рефлексии?»<br>1-Нет ничего / 2-Иногда делаю итоги / 3-Еженедельный ритуал / 4-Структурированные ритуалы / 5-Полная ОРЗ-практика</td>\n</tr>\n<tr>\n<td>cp.wld</td>\n<td>«Можете назвать 2-3 принципа, которые направляют ваши решения? Насколько они явные?»<br>1-Не сформулированы / 2-Смутное ощущение / 3-Могу назвать 1-2 / 4-Явные, записаны / 5-Работающая система</td>\n</tr>\n<tr>\n<td>cp.int</td>\n<td>«Пробовали ли вы разбирать ситуацию через надсистему и подсистему? Выделять роли, функции, ограничения?»<br>1-Незнакомо / 2-Слышал(а), не применял(а) / 3-Интуитивно / 4-Осознанно / 5-Учу других</td>\n</tr>\n<tr>\n<td>cp.agt</td>\n<td>«Берёте ли вы на себя ответственность за результат, даже если обстоятельства были неблагоприятные?»<br>1-Объясняю обстоятельствами / 2-Иногда беру / 3-Обычно беру / 4-Всегда беру / 5-Задаю стандарты</td>\n</tr>\n</tbody>\n</table>\n<p>Ответ drill-down обновляет соответствующий слот в <code>scores</code>. Если bottleneck = cp.skl — обновить cp.rhy, и снова переопределить <code>scores['cp.skl'] = scores['cp.rhy']</code>.</p>\n<h2>Шаг 4. Вычислить профиль</h2>\n<pre><code>MANDATORY_SLOTS = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.int', 'cp.agt']\n\nvals = {s: scores.get(s, 2) for s in MANDATORY_SLOTS}\nstage = min(vals.values())\nbottleneck = 'none' if stage &gt;= 4 else min(vals, key=vals.get)\n\nif stage == 5:\n    recommended_stream = 'РР'\nelse:\n    recommended_stream = f'S{max(1, min(4, stage))}'\n</code></pre>\n<p>Ступени: 1-Случайный / 2-Практикующий / 3-Систематический / 4-Дисциплинированный / 5-Проактивный</p>\n<p>Bottleneck по-русски:</p>\n<ul>\n<li>cp.rhy → «регулярность и ритм занятий»</li>\n<li>cp.wld → «мировоззрение и системный взгляд»</li>\n<li>cp.skl → «учёт времени и собранность»</li>\n<li>cp.iwe → «рабочая среда и инструменты»</li>\n<li>cp.int → «системное мышление»</li>\n<li>cp.agt → «агентность и инициатива»</li>\n<li>'none' → «Узких мест нет — поддерживайте темп и берите следующие ступени»</li>\n</ul>\n<p>Потоки: S1-«Фундамент» / S2-«Систематизация» / S3-«Масштаб» / S4-«Передача» / РР-«Рабочее развитие»</p>\n<h2>Шаг 5. Показать результат и сохранить</h2>\n<p>Сначала показать итог в чате:</p>\n<pre><code>\uD83D\uDCCA Результаты диагностики\n\nСтупень: [НАЗВАНИЕ] ([N] из 5)\n\n[Приоритет роста: &lt;bottleneck по-русски&gt;]\nИЛИ\n[Узких мест нет — поддерживайте темп.]\n\nРекомендованное руководство: [SN] — [label]\n[При stage=5: «Следующая программа: Рабочее развитие (РР)»]\n\nПрофиль по слотам:\ncp.rhy [N] | cp.wld [N] | cp.skl [N]\ncp.iwe [N] | cp.int [N] | cp.agt [N]\n\n(действителен 180 дней)\n</code></pre>\n<p>Затем сохранить — путь зависит от интерфейса:</p>\n<h3>Браузерный режим (claude.ai) — сохранить через dt_write_digital_twin</h3>\n<p>Вычислить <code>assessed_at</code> (сегодняшняя дата ISO) и <code>valid_until</code> (+180 дней).</p>\n<p>Вызвать <code>mcp__claude_ai_IWE__dt_write_digital_twin</code>:</p>\n<ul>\n<li><strong>path:</strong> <code>1_declarative/cp_profile</code></li>\n<li><strong>data:</strong></li>\n</ul>\n<pre><code>{\n  \"stage\": &lt;N&gt;,\n  \"bottleneck_slot\": \"&lt;cp.xxx или 'none'&gt;\",\n  \"recommended_stream\": \"&lt;SN или 'РР'&gt;\",\n  \"skip_to_stage\": &lt;N&gt;,\n  \"cp_scores\": {\n    \"cp.rhy\": &lt;N&gt;, \"cp.wld\": &lt;N&gt;, \"cp.skl\": &lt;N&gt;,\n    \"cp.iwe\": &lt;N&gt;, \"cp.int\": &lt;N&gt;, \"cp.agt\": &lt;N&gt;\n  },\n  \"source\": \"self_report\",\n  \"interface\": \"browser\",\n  \"rcs_version\": \"v5.0\",\n  \"assessed_at\": \"YYYY-MM-DD\",\n  \"valid_until\": \"YYYY-MM-DD\"\n}\n</code></pre>\n<p>Если <code>dt_write_digital_twin</code> вернул успех → сообщить: <code>✅ Профиль сохранён в цифровой двойник</code>.\nЕсли ошибка → показать профиль в чате и попросить пользователя скопировать его вручную.</p>\n<h3>VS Code режим — сохранить в Neon через Bash</h3>\n<pre><code>source ~/.config/aist/env\nCP_SCORES='&lt;JSON с финальными scores&gt;' \\\nCP_Q_COUNT=&lt;число заданных вопросов&gt; \\\npython3 -c \"\nimport os, json, datetime as dt_lib\n\nscores_raw = os.environ['CP_SCORES']\nq_count    = int(os.environ.get('CP_Q_COUNT', '5'))\naccount_id = os.environ.get('DT_USER_ID', '')\nurl        = os.environ.get('NEON_LEARNING_URL', '')\n\nALL_SLOTS     = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.iwe', 'cp.int', 'cp.agt']\nMANDATORY     = ['cp.rhy', 'cp.wld', 'cp.skl', 'cp.int', 'cp.agt']\nscores = json.loads(scores_raw)\nvals   = {s: int(scores.get(s, 2)) for s in ALL_SLOTS}\n\n# derive cp.skl from cp.rhy (FORM.089 §6.1 v5.0)\nvals['cp.skl'] = vals['cp.rhy']\n\nstage  = min(vals[s] for s in MANDATORY)\nbn     = 'none' if stage &gt;= 4 else min(MANDATORY, key=lambda s: vals[s])\nstream = 'РР' if stage == 5 else 'S' + str(max(1, min(4, stage)))\nvalid  = dt_lib.datetime.now(dt_lib.timezone.utc) + dt_lib.timedelta(days=180)\n\nsaved = False\nif url and account_id:\n    try:\n        import psycopg2\n        conn = psycopg2.connect(url)\n        cur  = conn.cursor()\n        cur.execute(\n            '''INSERT INTO learning.cp_assessments\n               (account_id, stage, bottleneck_slot, recommended_stream, skip_to_stage,\n                cp_scores, source, interface, questions_count, rcs_version, valid_until)\n               VALUES (%s::uuid, %s, %s, %s, %s, %s::jsonb, %s, %s, %s, %s, %s)\n               RETURNING id''',\n            (account_id, stage, bn, stream, stage, json.dumps(vals),\n             'self_report', 'vscode', q_count, 'v5.0', valid)\n        )\n        row_id = cur.fetchone()[0]\n        conn.commit()\n        conn.close()\n        print(f'OK neon id={row_id}')\n        saved = True\n    except Exception as e:\n        print(f'neon error: {e}')\n\nif not saved:\n    import pathlib\n    d = pathlib.Path.home() / '.aist' / 'cp-assessments'\n    d.mkdir(parents=True, exist_ok=True)\n    path = d / (dt_lib.date.today().isoformat() + '.json')\n    path.write_text(json.dumps({'account_id': account_id, 'stage': stage,\n        'bottleneck_slot': bn, 'recommended_stream': stream,\n        'cp_scores': vals, 'source': 'self_report', 'interface': 'vscode',\n        'questions_count': q_count, 'rcs_version': 'v5.0',\n        'valid_until': valid.isoformat()}, indent=2))\n    print(f'saved local: {path}')\n\"\n</code></pre>\n<p>Если вывод содержит <code>OK neon</code> — профиль в Neon. Если <code>saved local</code> — сохранён локально.</p>\n<h2>Шаг 6. Следующий шаг</h2>\n<p>После показа результата — предложить:</p>\n<pre><code>Следующий шаг:\n→ Навигатор, как развивать [bottleneck по-русски]? — рекомендации по росту\n→ /diagnose в боте — синхронизировать профиль\n→ /progress в боте — посмотреть полный профиль прогресса\n</code></pre>\n<h2>Граничные случаи</h2>\n<table>\n<thead>\n<tr>\n<th>Ситуация</th>\n<th>Действие</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Пилот не отвечает числом 1-5</td>\n<td>Переспросить: «Выбери цифру от 1 до 5»</td>\n</tr>\n<tr>\n<td>Пилот хочет пропустить вопрос</td>\n<td>Присвоить дефолт 2 (conservative), перейти дальше</td>\n</tr>\n<tr>\n<td>Менее 4 mandatory-ответов</td>\n<td>Показать «Диагностика не завершена», предложить <code>/diagnose</code> заново</td>\n</tr>\n<tr>\n<td>dt_write_digital_twin недоступен</td>\n<td>Показать профиль в чате, попросить скопировать</td>\n</tr>\n<tr>\n<td>psycopg2 не установлен (VS Code)</td>\n<td>Сохранить в <code>~/.aist/cp-assessments/YYYY-MM-DD.json</code></td>\n</tr>\n<tr>\n<td>Профиль уже есть (&lt; 7 дней)</td>\n<td>Показать и спросить: «Пройти заново?»</td>\n</tr>\n</tbody>\n</table>\n<h2>Проактивный триггер</h2>\n<p>Claude должен предложить <code>/diagnose</code> <strong>без явного запроса</strong> когда:</p>\n<ol>\n<li>В <code>dt_read_digital_twin</code> по path <code>1_declarative/cp_profile</code> нет данных или <code>stage = null</code></li>\n<li>В <code>day-open</code> IWE-данные пустые или <code>stage = null</code></li>\n<li>Пилот говорит «с чего начать», «как мне развиваться», «что делать дальше» — без контекста ступени</li>\n</ol>\n<p>Формулировка предложения:</p>\n<pre><code>Вижу, что cp-профиль не заполнен (или устарел).\nХочешь пройти диагностику ступени? ~3 мин, 5 вопросов — скажи «да» или /diagnose.\n</code></pre>\n\n\n","files":[{"path":"SKILL.md","sizeBytes":20248,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-08T11:56:14.88232Z","sha256":"8C3C7E7BE687119EE4F1E985AA14EC04FB2FC72F500590A86EE2424AC67F5E2B","sizeBytes":7388},"review":null,"source":{"repositoryUrl":"https://github.com/TserenTserenov/FMT-exocortex-template","path":".claude/skills/diagnose","license":"MIT","commit":"4d7b8f2e95161240a02a028ae5a8b9d2914b7939","subtreeSha":"03B76E8F1F4306BAA7A9E8720C5CC80B35A7A32D1666A4DCEA73D91CBFDBA431","lastSyncedAt":"2026-09-25T07:36:52.516704Z"},"reviewedAt":"2026-09-08T11:56:43.585097Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/TserenTserenov/FMT-exocortex-template/tree/main/.claude/skills/diagnose"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install tserentserenov-fmt-exocortex-template@llmmart"},{"target":"git","command":"git clone https://github.com/TserenTserenov/FMT-exocortex-template.git"}]}