Skip to content
cccskills
FreePublished on GitHub

premortem

Лёгкий советник «раздвигающий шторки» — premortem-сессия которая находит дыры в плане с разных углов, предлагает варианты решений по каждой и помогает юзеру быстро принять осознанные решения. История запусков сохраняется в ./docs/premortem/. Use when user types «премортем», «premortem», «найди дыры в плане», «посмотри со стороны на план», «what could kill this plan». Do NOT use for: vague ideas without a concrete plan; one-right-answer questions; creative editing of a draft; already-irreversible decisions.

The English summary is being prepared. Showing the original description.

See how to install

Files included (54)

  • SKILL.md22.2 KB
  • assets/.gitkeep0 B
  • assets/plan-template.md749 B
  • evals/eval_metadata.json244 B
  • evals/evals.json1.6 KB
  • evals/fixtures/.gitkeep0 B
  • evals/fixtures/after-run-1.md2.1 KB
  • evals/fixtures/after-run-2.md4.5 KB
  • evals/fixtures/new.md506 B
  • evals/fixtures/with-reverse-premortem.md2.4 KB
  • Makefile638 B
  • pytest.ini207 B
  • references/.gitkeep0 B
  • references/angle-pool.md2.8 KB
  • references/bias-checklist.md2.3 KB
  • references/frame-language.md1.5 KB
  • references/helper-prompt-template.md4.1 KB
  • references/methodology.md1.8 KB
  • scripts/__init__.py89 B
  • scripts/classify_angles.py3.7 KB
  • scripts/cli.py4.3 KB
  • scripts/find_existing.py830 B
  • scripts/frontmatter.py1.4 KB
  • scripts/hole_dedup.py701 B
  • scripts/id_counter.py449 B
  • scripts/plan_io.py3.7 KB
  • scripts/plan_parse.py15.8 KB
  • scripts/plan_render.py6.6 KB
  • scripts/plan_schema.py7.3 KB
  • scripts/plan_serialize.py2.8 KB
  • scripts/slugify.py983 B
  • scripts/snapshot.py670 B
  • scripts/sort_holes.py830 B
  • scripts/stats.py525 B
  • scripts/validate_helper_response.py2.8 KB
  • tests/__init__.py0 B
  • tests/conftest.py516 B
  • tests/test_classify_angles.py3.4 KB
  • tests/test_cli.py3.9 KB
  • tests/test_find_existing.py1.2 KB
  • tests/test_frontmatter.py2.8 KB
  • tests/test_hole_dedup.py704 B
  • tests/test_id_counter.py529 B
  • tests/test_integration_sequences.py1.7 KB
  • tests/test_invariants.py15.6 KB
  • tests/test_plan_io.py4.2 KB
  • tests/test_plan_parse.py3.1 KB
  • tests/test_plan_render.py5.7 KB
  • tests/test_plan_schema.py11.1 KB
  • tests/test_slugify.py547 B
  • tests/test_snapshot.py995 B
  • tests/test_sort_holes.py1.3 KB
  • tests/test_stats.py1.5 KB
  • tests/test_validate_helper_response.py2.2 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Premortem skill

Overview

Скилл = советник, не риск-аудитор. Показывает что юзер не видит → предлагает варианты → юзер выбирает → агент потом исполняет. Четыре фазы: pre-flight (синхронизация контекста), silent scan (3 параллельных помощника находят 5–8 дыр), live диалог (краткие решения по каждой дыре, расширение топа), запись (<plan-name>.md + история в history/).

Цель — лёгкая 10–15-минутная сессия, не тяжёлый аудит.

Главный принцип: скрипты делают всю детерминированную механику (I/O, schema, ID, sort, dedup, classifier-switch). LLM — только семантика.

Триггеры

Включаем:

  • «премортем», «premortem», «premortem this», «run premortem»
  • «найди дыры в плане»
  • «посмотри со стороны на план»
  • «что я упускаю в <конкретный план>»
  • «future-proof this <plan/launch/decision>»
  • «what could kill this <plan/launch>»

НЕ включаем (слишком широкие):

  • «should I», «what could go wrong», «stress test», «what am I missing», «devil's advocate this» — конфликтуют с базовым поведением модели.

Когда применимо

  • Конкретный план / запуск / решение с обратимым выбором.
  • Юзер готов потратить 10–15 минут.
  • Есть минимум контекста (предмет / аудитория / успех).

Когда НЕ применимо

  • Идея без формы — сначала помочь оформить план.
  • Вопрос с одним правильным ответом — просто ответить.
  • Уже принятое необратимое решение — премортем не вернёт назад.
  • Творческая правка черновика — это редактирование, не премортем.

Phase 1: Pre-flight — синхронизация контекста

Цель: установить 5 минимумов: предмет / аудитория / критерий успеха / горизонт оценки / reference class.

Действия:

  1. Прочитать контекст. Просканировать текущий разговор и доступные файлы (Read / Glob). Извлечь то что уже сказано — не спрашивать заново.

  2. Найти пробелы. Сравнить с пятью минимумами. Записать что есть, что нет.

  3. Задать максимум 2 вопроса за раз. Если не хватает 4 элементов — спросить 2, получить ответ, спросить ещё 2. Не делать «анкету» из 5 вопросов сразу.

  4. Reference class — отдельный вопрос. «На что это похоже из уже сделанных проектов? Назови 1–2 примера — твоих или известных тебе». Если юзер говорит «не знаю» — двигаться дальше с пустым reference_class, помощники получат сигнал.

  5. Горизонт оценки — выбор из меню.

    Через сколько оценим что план провалился?
    А) через 30 дней
    Б) через 3 месяца
    В) через 12 месяцев
    Г) после первого пилота
    Д) после запуска
    Е) после привлечения первых N клиентов
    Ж) иное (напиши своё)
    
  6. Неясности → assumption. Если после 2 раундов вопросов что-то остаётся туманным — пометить как assumption и передать в Phase 2 в составе угла «Допущения». Не блокировать сессию.

  7. Resolve plan-name. Спросить или вывести из контекста. Прогнать через CLI:

    uv run scripts/cli.py slugify "<plan name from user>"
    

    Запомнить slug — он будет именем файла.

  8. Существует ли файл? Запустить:

    uv run scripts/cli.py find docs/premortem --name "<plan_name>"
    

    Если файл уже есть — это повторный запуск, перейти к секции «Rerun logic» ниже. Если нет — продолжать новый сценарий.

Phase 2: Silent scan — взгляд с разных сторон

Цель: 3 параллельных помощника находят 5–8 уникальных дыр.

Действия:

  1. Классифицировать тип плана и выбрать углы. Запустить:

    uv run scripts/cli.py classify "<plan_text>"
    

    Получить JSON: {profile, angles, confidence, matched_keywords}.

    Если confidence < 0.4 — fallback: задать одному LLM-помощнику вопрос «какие 6 углов лучше всего видят дыры этого плана» (одной строкой, без объяснений). Использовать его ответ.

    Юзеру показать только список выбранных углов одной строкой:

    Смотрю с углов: Клиент, Исполнитель, Противник, Допущения, Конкурент, Будущий поддерживающий.
    
  2. Установить premortem-фрейм.

    «Представим что к [горизонту] этот план провалился. Не "может провалиться" — провалился, факт. Что произошло?»

    (См. references/frame-language.md.)

  3. Запустить 3 параллельных помощника одним сообщением.

    Каждый получает свой промпт из references/helper-prompt-template.md плюс назначенные углы (по 2 угла на помощника). Распределение: 6 углов на 3 помощника = (2,2,2). Один помощник получает «Будущий поддерживающий» с обязательным WYSIATI-микрошагом.

    Модель: Opus 4.7 по умолчанию. Если юзер запустил скилл с флагом --model sonnet — Sonnet. Если флага нет, скилл может предложить выбор перед stage 2 одной строкой:

    «Запускаю на Opus ($1–2). Sonnet будет дешевле ($0.50–1) — переключить?»

    Параллельно: ВСЕ 3 в ОДНОМ сообщении с тремя Task tool calls.

  4. Получить 6 сырых ответов (3 × до 2). Прогнать каждый через валидатор:

    uv run scripts/cli.py validate-helper < helper_response.json
    

    Retry policy. Максимум 3 attempts на помощника. Классификация ошибок:

    Тип ошибкиRetryable?Сообщение для retry
    Невалидный JSON / extra proseда«Верни ТОЛЬКО JSON, без преамбулы»
    Schema fail (отсутствует поле)да«Не хватает поля X в дыре N»
    maxItems >2да«Максимум 2 дыры; верни лучшие 2»
    Generic risks без привязки к плануда«Дыры слишком общие; привяжи к деталям плана»
    Empty holes ({"holes": []})НЕТпринять как валидный пустой ответ
    Low confidence на всех дырахНЕТпринять как есть, пометить assumption

    Если после 3 attempts всё ещё ошибка — отбросить ответ помощника, продолжить с тем что есть. Не чинить вручную.

  5. Hash-дедуп. Прогнать все валидные дыры через:

    uv run scripts/cli.py dedup < all_holes.json
    

    Убирает явные дубли по нормализованному описанию (sha256). Оставшиеся дубли (одна дыра, разные слова) обработает шаг 6.

  6. Семантический дедуп (LLM clustering). Если после hash-дедупа осталось >8 дыр — попросить LLM сгруппировать близкие в кластеры. Промпт:

    Вот N сырых дыр от трёх помощников. Какие из них на самом деле ОДНА И ТА ЖЕ дыра,
    видимая с разных углов? Верни JSON:
    [
      {
        "merged": [индексы дыр объединённые в одну],
        "title": "новое объединённое название",
        "merged_from_angles": ["Клиент", "Допущения"],  // углы-источники
        "merged_descriptions": ["исходное описание 1", "исходное описание 2"]
      },
      ...
    ]
    
    ПРАВИЛА:
    - Не теряй нюансы: если две дыры близки но имеют разный угол атаки — оставь обе.
    - Если все 8+ — действительно разные дыры, верни пустой массив (ничего не объединять).
    - Объединение допустимо только если ≥80% совпадение по сути.
    

    Применить кластеры: для каждой объединённой дыры в Hole.merged_from записать ID исходных дыр (после назначения ID на шаге 8), в Hole.углы — все исходные углы, в описание — выбрать самое богатое исходное описание.

  7. Лимит на 8. Если после семантического дедупа всё ещё >8 — ранжировать по важность × уверенность × novelty (где novelty = 1 для новых, 0.5 для похожих на ранее найденные при rerun) и взять топ-8. Не отбрасывать assumption-дыры приоритетно — они часто и есть самое ценное.

  8. Назначить ID. Каждой уникальной дыре дать ID через:

    uv run scripts/cli.py next-id --existing "H-001,H-002"
    

    На первом запуске стартуем с H-001. Сохранить порядок: первая дыра → H-001, вторая → H-002, и т.д.

  9. Сохранить промежуточный snapshot in-memory (объект Plan). На диск пока не пишем — это произойдёт в Phase 4.

Phase 3: Live диалог — выбор решений

Цель: юзер быстро принимает решения по 5–8 дырам в кратком режиме. Топ 1–3 + high-impact дыры расширяются до полного режима постфактум.

Per-hole loop (краткий режим по умолчанию):

  1. Презентация дыры.

    ### H-NNN: <title>
    <описание (1 абзац)>
    Почему важно: <одна фраза>
    Угол: <угол>
    Уверенность: <маркер>
    
  2. Варианты решения. Сгенерировать 2–3 стратегических варианта (LLM, не скрипт). Каждый = направление с +/–, не задача.

    А: <направление 1> (+быстро, –не масштабируется)
    Б: <направление 2> (+глубоко, –долго)
    В: <направление 3> (+качество, –теряем момент)
    
  3. Юзер. Выбирает / просит ещё / откладывает / отвергает / просит «расширь H-NNN» (тогда сразу полный режим для этой дыры).

  4. Если выбрал — фиксация в краткий режим:

    • что выбрали (одна строка)
    • почему (одна фраза)
    • первый шаг (одна задача)
    • исполнитель: агент / человек / оба
  5. Переход к следующей дыре.

После всех дыр — финальная приоритизация:

  1. Проверка: есть ли принятые дыры?

    Если 0 принятых дыр (все ОТЛОЖЕНО / ОТВЕРГНУТО) — спросить юзера явно:

    «Ты не принял ни одного решения. Возможны варианты: А) сохранить как обзор без действий (юзер увидел дыры, решил пока ничего не делать) Б) вернуться к 1–2 дырам и принять решения В) пересмотреть — может я плохо предложил варианты

    Что делаем?»

    Если А — переходим к шагу 5 (session_recommendation), пропускаем топ и bias. Если Б — возвращаемся к Phase 3 per-hole loop для выбранных юзером дыр. Если В — перегенерируем варианты решений для названных дыр.

  2. Топ 1–3. Скилл сам отбирает из ПРИНЯТЫХ по важность × обратимость × уверенность. Если ПРИНЯТЫХ < 3 — берём все.

  3. Авто-расширение до полного режима. Для каждой дыры из топ 1–3 ИЛИ для любой ПРИНЯТОЙ дыры с (важность=высокая И уверенность ≠ предположение) — задать недостающие поля одним проходом:

    • 2–3 первых шага (prevent)
    • сигнал успеха (detect)
    • стоп-условие
    • что делать если уже случилось (limit damage)
    • открытые вопросы

    Пометить эти дыры режим: полный.

  4. Bias-проверка топа (1 вопрос юзеру).

    Скилл сам прогоняет топ через 6 биасов в системном промпте (см. references/bias-checklist.md), выбирает наиболее вероятный риск искажения и показывает юзеру:

    «Какой биас мог сильнее всего исказить твой топ? Я думаю — <биас>. Коррекция: <конкретное действие>. Согласен или другой?»

    Юзер подтверждает или меняет. Записывается одна строка в bias_проверка.

  5. Session recommendation — явный шаг.

    Скилл предлагает рекомендацию по сессии (один из 4 enum-значений) на основе паттерна принятых решений:

    • continue — большинство решений идут вперёд, нет дыр со статусом ОТЛОЖЕНО среди топа
    • reduce_stake — топ содержит решения вида «пилот / меньше / медленнее»
    • delay — есть ОТЛОЖЕНО в топе или явно сказано «доделать позиционирование / подождать»
    • abort — все или большинство критических дыр ОТВЕРГНУТЫ, или решения = «отказаться»

    Скилл показывает свою предварительную рекомендацию + причину, юзер подтверждает или меняет:

    «Моя рекомендация по сессии: delay — есть отложенные дыры в топе. Ты подтверждаешь эту общую рекомендацию или предпочитаешь: continue / reduce_stake / abort?»

    Записывается в Plan.session_recommendation.

  6. Reverse премортем (условный). Запускается только если session_recommendation in {reduce_stake, delay, abort}. Если continue — пропускается.

    «Прошёл [горизонт]. Не сделали (или сделали меньше). Оказалось зря — почему?»

    LLM генерирует 3 сильные причины + одну строку «что перевешивает». Записывается в reverse_премортем.

Phase 4: Запись с итерациями

Цель: один main-файл + история снимков. Любая последовательность запусков оставляет файл валидным.

Действия:

  1. Собрать Plan dataclass. В памяти на основе данных из Phase 3.

  2. Атомарная запись.

    uv run scripts/cli.py write --plan-json <plan.json> --path docs/premortem/<slug>.md
    

    CLI: валидирует → пишет во временный файл → fsync → os.rename. Lock через fcntl.

  3. Снимок в history/.

    uv run scripts/cli.py snapshot docs/premortem/<slug>.md
    

    Создаёт history/<slug>-<YYYY-MM-DD-HHMM>.md.

  4. Финальное сообщение юзеру.

    Премортем сохранён: docs/premortem/<slug>.md (запуск N).
    Топ 1–3:
    1. H-XXX — <title>. Первый шаг: ...
    2. H-YYY — ...
    3. H-ZZZ — ...
    
    История: docs/premortem/history/<slug>-<ts>.md
    

    Не пересказывать всё содержимое файла — юзер сам прочитает.

Rerun logic (повторный запуск)

Триггерится в Phase 1 шаг 8: файл уже существует.

Действия:

  1. Прочитать существующий файл. Скрипт plan_io.py read.

  2. Показать сводку. Запустить:

    uv run scripts/cli.py stats docs/premortem/<slug>.md
    

    Юзеру:

    Нашёл прошлый премортем по «<plan_name>» от <дата>.
    <всего> дыр: <принято> ПРИНЯТО, <в_работе> В РАБОТЕ, <отложено> ОТЛОЖЕНО, <закрыто> ЗАКРЫТА.
    Что хочешь сделать?
    А) обновить статусы существующих дыр
    Б) найти новые дыры
    В) и то и другое
    Г) начать заново под новый этап проекта
    
  3. А или В: обновить статусы. Пройти по всем активным дырам (не ОТВЕРГНУТО / не ЗАКРЫТА), спросить «Что с H-NNN: <title>? Не изменилось / в работе / закрыто (опиши как) / отвергнуто (причина)». Обновить статус и история_статуса.

  4. Б или В: новые дыры. Запустить Phase 2 заново, передать помощникам список существующих дыр в формате:

    Уже найденные дыры (не повторять):
    H-001: <title>
    H-002: <title>
    ...
    

    Помощники возвращают находки + статус каждой: same / worse / resolved / new / new-aspect.

  5. Г: начать заново. Юзер уточняет — это новый этап того же плана (тогда продолжаем в тот же файл, увеличиваем запусков) или новый план (тогда спрашиваем новое имя, создаём новый файл, оставляем старый нетронутым).

  6. Обновить frontmatter. обновлён = сегодня, запусков += 1.

  7. Снимок и запись. Как в Phase 4.

Что скилл НЕ делает

  • Не предлагает численные вероятности — LLM не калиброван.
  • Не использует 12-вопросный bias-чеклист как фазу — только 6 биасов в системном промпте.
  • Не генерит HTML / Slack / Notion — только md файл.
  • Не пытается заменить decision journal или OKR.
  • Не запускает reverse premortem если рекомендация = продолжать.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

Report a problem with this skill