本文へ移動
cccskills
無料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.

インストール方法を見る

含まれるファイル(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(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

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 если рекомендация = продолжать.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

このスキルの問題を報告する