srekit-postmortem
Скаффолдит постмортем через srekit postmortem и помогает заполнить его на основе того, что обсуждалось в текущей сессии.
Когда использовать
- Пользователь просит написать/оформить постмортем (любая формулировка).
- Пользователь начинает разбор инцидента и хочет файл-каркас, который дальше можно дописывать.
- Пользователь явно упоминает утилиту
srekit.
Никакого «исходного файла» (live-incident отчёта, INC-тикета, чат-лога) скилл не предполагает. Все данные для постмортема приходят из текущего разговора: что пользователь рассказал об инциденте, какие факты вы вместе зафиксировали, что видно в логах/коммитах. Если по какому-то полю данных в сессии нет — спрашивай у пользователя или ставь GAP-маркер; не выдумывай.
Что делает srekit postmortem
srekit postmortem — это локально установленная CLI-утилита, которая генерирует markdown-каркас постмортема в Google-SRE-стиле из встроенного (или кастомного) шаблона. Утилита не заполняет содержимое — она только готовит структуру с frontmatter (id, creation_date, severity, owner, …) и пустыми секциями.
Полный CLI-справочник: см. references/srekit-cli.md.
Ключевые флаги, которые ты будешь использовать:
| Флаг |
Назначение |
-T, --title |
обязательный — заголовок инцидента |
--severity |
SEV-1 / SEV-2 / SEV-3 (по умолчанию SEV-3) |
--owner |
ответственный (всегда роль, не имя — см. ниже) |
--start |
начало в RFC3339 |
--end |
конец/mitigation в RFC3339 |
--out |
путь к выходному файлу |
--templates-dir |
one-shot override директории пользовательских шаблонов (на одну команду; иначе берётся из конфига) |
--force |
перезаписать существующий файл |
--dry-run |
напечатать в stdout, не писать на диск |
--from FILE |
прочитать секции из JSON (- для stdin) — round-trip workflow |
--schema |
вывести JSON Schema для --from входа |
--validate FILE |
валидировать input-файл без рендера |
--template FILE (one-shot подмена шаблона) у postmortem больше нет — удалён в v0.22.0. Кастомный шаблон подключается через --templates-dir (или через конфиг — templates_dir: в ~/.config/srekit/config.yaml / env SREKIT_TEMPLATES_DIR).
Рабочий процесс
1. Убедись, что srekit доступен
srekit --version
Если команда не найдена — сообщи пользователю, что нужно поставить srekit (https://github.com/jtprogru/srekit), и остановись. Не пытайся обойтись без неё — пользователь явно хочет именно эту утилиту.
2. Найди upstream-артефакты в репо
Прежде чем спрашивать метаданные — быстро просканируй репозиторий на материалы, которые попадут в References или подскажут title / severity. Это не источник наполнения секций (наполнение всё равно из сессии — см. правило «не заполняй секции без данных в сессии»), но это контекст и линки.
Что искать:
- Runbook на алерт, который сработал. Если пользователь упомянул имя алерта или сервиса — поищи в репо
runbooks/, docs/runbooks/. Релевантный runbook — это:
- источник Mitigate-шагов, которые применялись (полезно для секции «Что сработало»);
- линк под References;
- сигнал, насколько runbook оказался полезен (если не помог — это What went wrong).
- Прошлые постмортемы по тому же failure mode.
incidents/postmortem-*.md, runbooks/postmortems/*.md. Если этот же сценарий уже происходил — это критичный контекст («повтор инцидента» сразу попадает в Lessons learned, и related-постмортем идёт в References).
- Legacy
incidents/incident-<slug>.md-файлы. Команды srekit incident нет с v0.29.0, но старые файлы могут лежать в репо в проектах, где live-doc вели в markdown. Если такой файл по этому инциденту есть — прочитай и используй timeline как fact-источник (но в постмортеме timeline консолидированный, а не копия — см. шаг 7). Под References — ссылка на live-doc.
- SLO-документ для затронутого сервиса.
docs/slo/slo-<service>.md или подобное. Конкретные SLI / target из SLO — то, что попадает в секцию Impact и в Action items по теме error-budget burn.
Сделай не больше двух-трёх grep'ов / ls'ов — это сканирование, не deep-research. Если ничего не нашёл — ок, идём дальше.
Что не делать:
- Не вытаскивай content из найденных файлов в секции постмортема. Это материал для References и для подтверждения / уточнения того, что пользователь рассказал, не источник.
- Не предполагай, что live-doc / runbook есть, если не видишь его. Отсутствие — нормальное состояние. Не блокируй работу.
3. Собери метаданные
Минимально необходимые для скаффолда:
| Поле |
Откуда брать |
| title |
из формулировки пользователя или явно спроси («как назовём инцидент?») |
| severity |
SEV-1 / SEV-2 / SEV-3. Если не указано — спроси; если контекст явно говорит (например, обсуждается полная деградация прод) — предложи и подтверди |
| owner |
роль/команда, не личное имя. Дефолт для h3llo — SRE Lead. Подтверди у пользователя |
| start |
момент начала инцидента в RFC3339. Если только дата — уточни время. Если ничего нет — спроси |
| end |
момент mitigation/resolved в RFC3339. Если инцидент ещё открыт — оставь пустым и поставь GAP в теле |
Стратегия:
- Что явно прозвучало в диалоге — подставь и подтверди одним сообщением («собираюсь скаффолдить с такими-то полями, ок?»).
- Что не прозвучало и не выводится — спроси короткой репликой. Не плоди вопросов: одно сообщение с 2–4 пунктами лучше, чем 4 отдельных.
- Не выдумывай timestamps. Если пользователь сказал «вчера утром» — переспроси точное время.
Все timestamps в RFC3339, в локальной TZ (например MSK = +03:00). В Timeline постмортема ты потом сконвертируешь их в UTC (см. шаг 7).
4. Выбери шаблон
srekit сам резолвит шаблон: если в конфиге задан templates_dir (или есть env SREKIT_TEMPLATES_DIR) и там лежит postmortem.yaml — берётся он, иначе fallback на embedded. Обычно ничего делать не нужно.
Когда стоит вмешаться:
- В репозитории есть свой шаблон постмортема в нестандартной директории (типично для h3llo —
runbooks/templates/, где формат — расширенная h3llo-структура с Impact-таблицей, Why it took N minutes, Communications log, Follow-up через 30/90 дней). В этом случае на одну команду переопредели через --templates-dir <DIR> (директория должна содержать postmortem.yaml в корне). Это директория, не путь к конкретному файлу — флаг --template FILE у postmortem был удалён в v0.22.0.
- Хочешь убедиться, что подхватится именно проектный шаблон, а не глобальный из конфига — передай
--templates-dir явно.
Скажи пользователю, какой шаблон выбран (embedded / configured / --templates-dir) и почему.
5. Определи путь к файлу постмортема
Правило (в порядке приоритета — выбирай первое, что подходит):
incidents/postmortem-<YYYY-MM-DD>-<slug>.md — если в репозитории есть каталог incidents/. Это конвенция h3llo: всё, что связано с конкретным инцидентом, лежит в incidents/, постмортем различается префиксом postmortem-. (До v0.29.0 в этом же каталоге могли лежать legacy live-incident-отчёты — теперь srekit incident нет; новые постмортемы туда же.)
runbooks/postmortems/postmortem-<YYYY-MM-DD>-<slug>.md — если есть такой каталог (другие проекты, явно отдельная директория для постмортемов).
postmortem-<YYYY-MM-DD>-<slug>.md в CWD — последний fallback.
Имя файла — всегда в формате postmortem-<YYYY-MM-DD>-<slug>.md:
- Префикс
postmortem- — срекит-конвенция, не меняется.
- Дата — день инцидента (не creation_date файла),
YYYY-MM-DD. Даёт читаемый хронологический sort в каталоге и быстро отвечает «когда это было?» взглядом на имя файла.
- Slug — kebab-case, короткий, передающий суть инцидента:
disk-50gb-create-hang, csi-controller-oom, vm-network-loss-az-b, inotify-kubelet-crash.
Не используй чужие схемы (<date>-<slug>-postmortem.md, INC-NNNN.md, <topic>-postmortem-<date>.md).
Важно: всегда передавай --out явно. Срекит-дефолтное имя — postmortem-<YYYY-MM-DD>-<slug>.md (дата = creation date, не дата инцидента), и сладжификатор плохо работает с кириллицей (для -T "Зависание создания 50ГБ дисков при создании ВМ" он выдаёт мусорное postmortem-…-50.md — выкидывает кириллицу, оставляет только цифры). Дата в дефолте — creation date файла, а нам нужна дата инцидента. Поэтому полагаться на авто-имя нельзя ни в одном из случаев — всегда собирай --out сам из выбранного каталога, даты инцидента и slug'а.
Если итоговый путь уже существует — спроси перед --force. Возможно, пользователь уже начал заполнять.
6. Скаффолд через srekit
srekit postmortem \
-T "<title>" \
--severity SEV-N \
--owner "<роль>" \
--start "<RFC3339 start>" \
--end "<RFC3339 end>" \
--out "<путь из шага 5>" \
[--templates-dir "<DIR с postmortem.yaml>"] # только если нужен проектный шаблон
Перед записью можешь прогнать --dry-run и показать пользователю первые 30 строк, чтобы он убедился, что метаданные верные.
7. Наполни секции
Это самая важная часть — srekit сделал каркас, дальше ты редактируешь его in-place через Edit. Заполняй по порядку, опираясь на то, что обсуждалось в сессии: реплики пользователя, выводы из логов/команд, найденные коммиты. Подробное руководство по каждой секции — references/section-guide.md.
Краткая логика:
- TL;DR / Summary — 2-3 предложения. Что случилось, кого затронуло, как смягчили, главный урок.
- Impact — масштаб (затронутые сервисы, число пользователей/тенантов, длительность). Если SLO ещё не зафиксированы — пиши GAP-маркер со ссылкой на каталог SLO, не выдумывай цифр.
- Timeline — собери в хронологическом порядке (от ранних событий к поздним), в UTC. Каждая строка — одно конкретное событие, а не пересказ. Если ты помнишь точные timestamps из сессии — ставь; если знаешь только относительные («через полчаса после первого репорта») — спроси у пользователя точное время или поставь GAP. Линкуется, не копируется. Если по этому инциденту существует подробный live-coordination-лог (Slack-тред, чат, Google Doc, legacy
incidents/incident-*.md) с минутными апдейтами — не копируй его сюда. Постмортем-Timeline — это консолидированные milestone'ы: detection, escalation, первая попытка mitigation, успешная mitigation, resolved. Детальный лог — ссылкой под References. Если консолидируешь — каждая строка добавляет ценность по сравнению с живым логом (контекст, связка с тех. фактом, источник), иначе вырезай.
- Root cause — раздели непосредственный технический фактор и contributing factors (отсутствующий алерт, накопление состояния месяцами, отсутствие automation). Если непосредственная причина не до конца ясна — пометь как «hypothesis, not confirmed», не объявляй преждевременно.
- What went well / wrong / lucky — синтезируй из обсуждавшегося. «Хорошо» = что сработало как задумано. «Плохо» = что замедлило (detection через чат, а не алерт; нет baseline; нет runbook). «Повезло» = blast radius мог быть больше, но не стал.
- Action items — из того, что в ходе сессии обозначилось как «надо сделать». Каждый action item обязан иметь owner (роль), priority, deadline. Если deadline неизвестен — GAP и предложи дефолт, не пиши «TBD».
- Lessons learned — обобщи системные выводы, не пересказ.
8. Примени проектные правила
Эти правила — обязательные для документов в репозиториях h3llo и любых других, где они зафиксированы (CONTRIBUTING.md, глобальные memory). Если живёшь в другой кодовой базе — проверь её соглашения, но эти почти всегда уместны для постмортема:
- Без личных имён. Везде — роли/команды: «SRE Lead», «Storage owner», «Internal Developers», «продуктовая разработка». Личные имена в опубликованном постмортеме запрещены (см. memory
feedback_no-personal-names-in-docs). Это не только про action items — это про весь текст.
- Blameless. Фокус на системе и процессе: «процесс позволил X», «не было guard rail на Y». Никогда — «инженер N сделал Z».
- GAP-маркеры вместо галлюцинаций. Если данных нет — пиши
<GAP — что нужно дополнить> или _TBD_ с пояснением, чего именно не хватает. Никогда не выдумывай числа, SLO-таргеты, дедлайны, имена тикетов (см. memory feedback_doc-pragmatism).
- Markdown без хардврапа. Один абзац = одна длинная строка. Структурные переносы (списки, таблицы, code fences) — как есть.
- Cross-refs — relative markdown.
[название](relative/path.md), без Obsidian-wikilinks [[…]] в коммитимых файлах.
- Язык — как у пользователя в диалоге. Если разговор на русском — постмортем на русском. На английском — на английском. Не смешивай.
9. Сообщи пользователю
- Путь к созданному файлу.
- Какой шаблон использован.
- Список оставшихся GAP-маркеров — это TODO для пользователя/команды, что нужно ещё дополнить (timestamps, owner'ы, SLO-цифры, ссылки на тикеты).
Не предлагай коммит — пользователь сам решит, когда постмортем готов к review.
Что НЕ делать
- Не заполняй секции без данных. Лучше большой постмортем с GAP-маркерами, чем красивый текст с выдуманными фактами. Это критично — пользователь явно указал, что выдумывать значения недопустимо.
- Не ищи «исходный live-incident отчёт» как условие старта. Данные для содержания секций приходят из сессии, не из отдельного файла. С v0.29.0 в
srekit нет команды incident — markdown-live-doc больше не стандарт; live-координация уехала в IM-инструменты. Если такой файл всё-таки лежит в репо (legacy, прошлая практика, ручной артефакт) — прочитай в шаге 2 для контекста и ссылки под References, но не блокируйся на его отсутствие.
- Не теряй contributing factors. Корневая причина часто закопана глубже, чем «непосредственная»: симптом починен mitigation'ом, но реальная причина массовости (накопление, отсутствие алерта, систематический bias) — отдельный пункт. Не своди root cause к одному фактору.
- Не используй
git commit/git push в рамках работы скилла. Пользователь сам решает, когда коммитить.
Пример
Диалог: пользователь рассказывает, что вчера в 14:25 MSK продуктовая разработка пожаловалась на зависание создания 50 ГБ дисков; mitigation сделали к 18:30 через серию drbdadm secondary на ноде w1; статус — mitigated, не resolved. Заголовок согласовали: «Зависание создания 50ГБ дисков при создании ВМ», severity SEV-2, owner — SRE Lead.
Команда скаффолда:
srekit postmortem \
-T "Зависание создания 50ГБ дисков при создании ВМ" \
--severity SEV-2 \
--owner "SRE Lead" \
--start 2026-06-03T14:25:00+03:00 \
--end 2026-06-03T18:30:00+03:00 \
--out incidents/postmortem-2026-06-03-disk-50gb-create-hang.md \
--templates-dir /Users/jtprogru/Work/h3llo.cloud/docs/infrastructure/runbooks/templates
(--templates-dir тут указан явно, потому что проектный postmortem.yaml лежит вне директории, прописанной в ~/.config/srekit/config.yaml. Если в конфиге уже стоит нужный templates_dir — флаг не нужен.)
Дальше — Edit по секциям. Timeline (фрагмент, в UTC):
| Время (UTC) |
Событие |
Источник |
| 2026-06-03 11:25 |
Продуктовая разработка сообщает о hang при create 50 GiB VM |
внутренний чат |
| 2026-06-03 12:25 |
SRE Lead запрашивает прод-доступ |
внутренний чат |
| 2026-06-03 12:35 |
Инцидент объявлен SEV-2 ретроспективно |
сессия |
| 2026-06-03 15:30 |
Verify: retry-storm схлопнулся (10+ → 1 PVC), статус mitigated |
сессия |
| 2026-06-03 16:41 |
pvc-create-bench: 0/10 hung, p95=77s — symptom закрыт |
bench CSV |
Action items:
| # |
Action |
Owner |
Priority |
Deadline |
Status |
Ссылка на тикет |
| 1 |
Kernel-check blkio_throttle на всех воркер-нодах (cgroup v1/v2) |
Storage / Piraeus owner |
P0 |
2026-06-05 |
Open |
<GAP — тикет> |
| 2 |
P0 RCA: «все Primary на w1» (16/16 zombie) |
Storage / Piraeus owner |
P0 |
2026-06-10 |
Open |
<GAP — тикет> |
| 3 |
Зафиксировать baseline SLO disk-create в 53-slo-catalog |
SRE |
P1 |
2026-06-10 |
Open |
<GAP — тикет> |
| 4 |
Регулярный pvc-create-bench в CI (baseline) |
Storage / Piraeus owner |
P2 |
2026-06-30 |
Open |
<GAP — тикет> |
GAP-маркеры в постмортеме:
Communications Lead — _TBD_ (роль не была явно назначена)
Error budget impact — <GAP — error budget policy ещё не утверждена, см. ADR-0011 (Proposed)>
- Финальный
Resolved timestamp — <GAP — инцидент в статусе mitigated, не resolved>
1---2name: srekit-postmortem-23description: Создаёт постмортем через `srekit postmortem` и наполняет секции (Summary, Impact, Timeline, Root cause, Action items, Lessons learned) фактами из текущего диалога. Срабатывай на «написать/оформить постмортем», «разбор инцидента», «постмортем по INC-…» — даже без упоминания srekit. Метаданные (title, severity, owner, start, end) бери из контекста или спроси; blameless, без личных имён, GAP-маркеры вместо галлюцинаций.4---56# srekit-postmortem78Скаффолдит постмортем через `srekit postmortem` и помогает заполнить его на основе того, что обсуждалось в текущей сессии.910## Когда использовать1112- Пользователь просит написать/оформить постмортем (любая формулировка).13- Пользователь начинает разбор инцидента и хочет файл-каркас, который дальше можно дописывать.14- Пользователь явно упоминает утилиту `srekit`.1516**Никакого «исходного файла» (live-incident отчёта, INC-тикета, чат-лога) скилл не предполагает.** Все данные для постмортема приходят из текущего разговора: что пользователь рассказал об инциденте, какие факты вы вместе зафиксировали, что видно в логах/коммитах. Если по какому-то полю данных в сессии нет — спрашивай у пользователя или ставь GAP-маркер; не выдумывай.1718## Что делает `srekit postmortem`1920`srekit postmortem` — это локально установленная CLI-утилита, которая генерирует markdown-каркас постмортема в Google-SRE-стиле из встроенного (или кастомного) шаблона. Утилита не заполняет содержимое — она только готовит структуру с frontmatter (id, creation_date, severity, owner, …) и пустыми секциями.2122Полный CLI-справочник: см. [`references/srekit-cli.md`](references/srekit-cli.md).2324Ключевые флаги, которые ты будешь использовать:2526| Флаг | Назначение |27| --- | --- |28| `-T, --title` | **обязательный** — заголовок инцидента |29| `--severity` | `SEV-1` / `SEV-2` / `SEV-3` (по умолчанию SEV-3) |30| `--owner` | ответственный (всегда роль, не имя — см. ниже) |31| `--start` | начало в RFC3339 |32| `--end` | конец/mitigation в RFC3339 |33| `--out` | путь к выходному файлу |34| `--templates-dir` | one-shot override директории пользовательских шаблонов (на одну команду; иначе берётся из конфига) |35| `--force` | перезаписать существующий файл |36| `--dry-run` | напечатать в stdout, не писать на диск |37| `--from FILE` | прочитать секции из JSON (`-` для stdin) — round-trip workflow |38| `--schema` | вывести JSON Schema для `--from` входа |39| `--validate FILE` | валидировать input-файл без рендера |4041`--template FILE` (one-shot подмена шаблона) у `postmortem` больше нет — удалён в v0.22.0. Кастомный шаблон подключается через `--templates-dir` (или через конфиг — `templates_dir:` в `~/.config/srekit/config.yaml` / env `SREKIT_TEMPLATES_DIR`).4243## Рабочий процесс4445### 1. Убедись, что `srekit` доступен4647```bash48srekit --version49```5051Если команда не найдена — сообщи пользователю, что нужно поставить `srekit` (`https://github.com/jtprogru/srekit`), и остановись. Не пытайся обойтись без неё — пользователь явно хочет именно эту утилиту.5253### 2. Найди upstream-артефакты в репо5455Прежде чем спрашивать метаданные — быстро просканируй репозиторий на материалы, которые попадут в **References** или подскажут title / severity. Это **не источник наполнения секций** (наполнение всё равно из сессии — см. правило «не заполняй секции без данных в сессии»), но это контекст и линки.5657Что искать:58591. **Runbook на алерт, который сработал.** Если пользователь упомянул имя алерта или сервиса — поищи в репо `runbooks/`, `docs/runbooks/`. Релевантный runbook — это:60 - источник Mitigate-шагов, которые применялись (полезно для секции «Что сработало»);61 - линк под References;62 - сигнал, насколько runbook оказался полезен (если не помог — это _What went wrong_).632. **Прошлые постмортемы по тому же failure mode.** `incidents/postmortem-*.md`, `runbooks/postmortems/*.md`. Если этот же сценарий уже происходил — это критичный контекст («повтор инцидента» сразу попадает в Lessons learned, и related-постмортем идёт в References).643. **Legacy `incidents/incident-<slug>.md`-файлы.** Команды `srekit incident` нет с v0.29.0, но старые файлы могут лежать в репо в проектах, где live-doc вели в markdown. Если такой файл по этому инциденту есть — прочитай и используй timeline как fact-источник (но **в постмортеме timeline консолидированный, а не копия** — см. шаг 7). Под References — ссылка на live-doc.654. **SLO-документ для затронутого сервиса.** `docs/slo/slo-<service>.md` или подобное. Конкретные SLI / target из SLO — то, что попадает в секцию Impact и в Action items по теме error-budget burn.6667Сделай не больше двух-трёх grep'ов / `ls`'ов — это сканирование, не deep-research. Если ничего не нашёл — ок, идём дальше.6869Что **не** делать:70- Не вытаскивай content из найденных файлов в секции постмортема. Это материал для References и для подтверждения / уточнения того, что пользователь рассказал, не источник.71- Не предполагай, что live-doc / runbook есть, если не видишь его. Отсутствие — нормальное состояние. Не блокируй работу.7273### 3. Собери метаданные7475Минимально необходимые для скаффолда:7677| Поле | Откуда брать |78| --- | --- |79| title | из формулировки пользователя или явно спроси («как назовём инцидент?») |80| severity | `SEV-1` / `SEV-2` / `SEV-3`. Если не указано — спроси; если контекст явно говорит (например, обсуждается полная деградация прод) — предложи и подтверди |81| owner | роль/команда, не личное имя. Дефолт для h3llo — `SRE Lead`. Подтверди у пользователя |82| start | момент начала инцидента в RFC3339. Если только дата — уточни время. Если ничего нет — спроси |83| end | момент mitigation/resolved в RFC3339. Если инцидент ещё открыт — оставь пустым и поставь GAP в теле |8485Стратегия:8687- Что явно прозвучало в диалоге — подставь и подтверди одним сообщением («собираюсь скаффолдить с такими-то полями, ок?»).88- Что не прозвучало и не выводится — спроси короткой репликой. Не плоди вопросов: одно сообщение с 2–4 пунктами лучше, чем 4 отдельных.89- Не выдумывай timestamps. Если пользователь сказал «вчера утром» — переспроси точное время.9091Все timestamps в RFC3339, в локальной TZ (например MSK = `+03:00`). В **Timeline** постмортема ты потом сконвертируешь их в UTC (см. шаг 7).9293### 4. Выбери шаблон9495`srekit` сам резолвит шаблон: если в конфиге задан `templates_dir` (или есть env `SREKIT_TEMPLATES_DIR`) и там лежит `postmortem.yaml` — берётся он, иначе fallback на embedded. Обычно ничего делать не нужно.9697Когда стоит вмешаться:9899- В репозитории есть свой шаблон постмортема в нестандартной директории (типично для h3llo — `runbooks/templates/`, где формат — расширенная h3llo-структура с Impact-таблицей, Why it took N minutes, Communications log, Follow-up через 30/90 дней). В этом случае на одну команду переопредели через `--templates-dir <DIR>` (директория должна содержать `postmortem.yaml` в корне). Это **директория**, не путь к конкретному файлу — флаг `--template FILE` у `postmortem` был удалён в v0.22.0.100- Хочешь убедиться, что подхватится именно проектный шаблон, а не глобальный из конфига — передай `--templates-dir` явно.101102Скажи пользователю, какой шаблон выбран (embedded / configured / `--templates-dir`) и почему.103104### 5. Определи путь к файлу постмортема105106Правило (в порядке приоритета — выбирай первое, что подходит):1071081. **`incidents/postmortem-<YYYY-MM-DD>-<slug>.md`** — если в репозитории есть каталог `incidents/`. Это конвенция h3llo: всё, что связано с конкретным инцидентом, лежит в `incidents/`, постмортем различается префиксом `postmortem-`. (До v0.29.0 в этом же каталоге могли лежать legacy live-incident-отчёты — теперь `srekit incident` нет; новые постмортемы туда же.)1092. **`runbooks/postmortems/postmortem-<YYYY-MM-DD>-<slug>.md`** — если есть такой каталог (другие проекты, явно отдельная директория для постмортемов).1103. **`postmortem-<YYYY-MM-DD>-<slug>.md` в CWD** — последний fallback.111112Имя файла — **всегда** в формате `postmortem-<YYYY-MM-DD>-<slug>.md`:113114- Префикс `postmortem-` — срекит-конвенция, не меняется.115- Дата — день инцидента (не creation_date файла), `YYYY-MM-DD`. Даёт читаемый хронологический sort в каталоге и быстро отвечает «когда это было?» взглядом на имя файла.116- Slug — kebab-case, короткий, передающий суть инцидента: `disk-50gb-create-hang`, `csi-controller-oom`, `vm-network-loss-az-b`, `inotify-kubelet-crash`.117118Не используй чужие схемы (`<date>-<slug>-postmortem.md`, `INC-NNNN.md`, `<topic>-postmortem-<date>.md`).119120**Важно: всегда передавай `--out` явно.** Срекит-дефолтное имя — `postmortem-<YYYY-MM-DD>-<slug>.md` (дата = creation date, не дата инцидента), и сладжификатор плохо работает с кириллицей (для `-T "Зависание создания 50ГБ дисков при создании ВМ"` он выдаёт мусорное `postmortem-…-50.md` — выкидывает кириллицу, оставляет только цифры). Дата в дефолте — creation date файла, а нам нужна дата инцидента. Поэтому полагаться на авто-имя нельзя ни в одном из случаев — всегда собирай `--out` сам из выбранного каталога, даты инцидента и slug'а.121122Если итоговый путь уже существует — **спроси перед `--force`**. Возможно, пользователь уже начал заполнять.123124### 6. Скаффолд через `srekit`125126```bash127srekit postmortem \128 -T "<title>" \129 --severity SEV-N \130 --owner "<роль>" \131 --start "<RFC3339 start>" \132 --end "<RFC3339 end>" \133 --out "<путь из шага 5>" \134 [--templates-dir "<DIR с postmortem.yaml>"] # только если нужен проектный шаблон135```136137Перед записью можешь прогнать `--dry-run` и показать пользователю первые 30 строк, чтобы он убедился, что метаданные верные.138139### 7. Наполни секции140141Это самая важная часть — `srekit` сделал каркас, дальше ты редактируешь его in-place через `Edit`. Заполняй по порядку, опираясь на то, что обсуждалось в сессии: реплики пользователя, выводы из логов/команд, найденные коммиты. Подробное руководство по каждой секции — [`references/section-guide.md`](references/section-guide.md).142143Краткая логика:144145- **TL;DR / Summary** — 2-3 предложения. Что случилось, кого затронуло, как смягчили, главный урок.146- **Impact** — масштаб (затронутые сервисы, число пользователей/тенантов, длительность). Если SLO ещё не зафиксированы — пиши GAP-маркер со ссылкой на каталог SLO, **не выдумывай цифр**.147- **Timeline** — собери в хронологическом порядке (от ранних событий к поздним), **в UTC**. Каждая строка — одно конкретное событие, а не пересказ. Если ты помнишь точные timestamps из сессии — ставь; если знаешь только относительные («через полчаса после первого репорта») — спроси у пользователя точное время или поставь GAP. **Линкуется, не копируется.** Если по этому инциденту существует подробный live-coordination-лог (Slack-тред, чат, Google Doc, legacy `incidents/incident-*.md`) с минутными апдейтами — **не копируй его сюда**. Постмортем-Timeline — это **консолидированные milestone'ы**: detection, escalation, первая попытка mitigation, успешная mitigation, resolved. Детальный лог — ссылкой под References. Если консолидируешь — каждая строка добавляет ценность по сравнению с живым логом (контекст, связка с тех. фактом, источник), иначе вырезай.148- **Root cause** — раздели _непосредственный технический фактор_ и _contributing factors_ (отсутствующий алерт, накопление состояния месяцами, отсутствие automation). Если непосредственная причина не до конца ясна — пометь как «hypothesis, not confirmed», не объявляй преждевременно.149- **What went well / wrong / lucky** — синтезируй из обсуждавшегося. «Хорошо» = что сработало как задумано. «Плохо» = что замедлило (detection через чат, а не алерт; нет baseline; нет runbook). «Повезло» = blast radius мог быть больше, но не стал.150- **Action items** — из того, что в ходе сессии обозначилось как «надо сделать». Каждый action item обязан иметь **owner (роль), priority, deadline**. Если deadline неизвестен — GAP и предложи дефолт, **не пиши «TBD»**.151- **Lessons learned** — обобщи системные выводы, не пересказ.152153### 8. Примени проектные правила154155Эти правила — обязательные для документов в репозиториях h3llo и любых других, где они зафиксированы (`CONTRIBUTING.md`, глобальные memory). Если живёшь в другой кодовой базе — проверь её соглашения, но эти почти всегда уместны для постмортема:1561571. **Без личных имён.** Везде — роли/команды: «SRE Lead», «Storage owner», «Internal Developers», «продуктовая разработка». Личные имена в опубликованном постмортеме запрещены (см. memory `feedback_no-personal-names-in-docs`). Это не только про action items — это про весь текст.1582. **Blameless.** Фокус на системе и процессе: «процесс позволил X», «не было guard rail на Y». Никогда — «инженер N сделал Z».1593. **GAP-маркеры вместо галлюцинаций.** Если данных нет — пиши `<GAP — что нужно дополнить>` или `_TBD_` с пояснением, чего именно не хватает. Никогда не выдумывай числа, SLO-таргеты, дедлайны, имена тикетов (см. memory `feedback_doc-pragmatism`).1604. **Markdown без хардврапа.** Один абзац = одна длинная строка. Структурные переносы (списки, таблицы, code fences) — как есть.1615. **Cross-refs — relative markdown.** `[название](relative/path.md)`, без Obsidian-wikilinks `[[…]]` в коммитимых файлах.1626. **Язык — как у пользователя в диалоге.** Если разговор на русском — постмортем на русском. На английском — на английском. Не смешивай.163164### 9. Сообщи пользователю165166- Путь к созданному файлу.167- Какой шаблон использован.168- Список оставшихся GAP-маркеров — это TODO для пользователя/команды, что нужно ещё дополнить (timestamps, owner'ы, SLO-цифры, ссылки на тикеты).169170Не предлагай коммит — пользователь сам решит, когда постмортем готов к review.171172## Что НЕ делать173174- **Не заполняй секции без данных.** Лучше большой постмортем с GAP-маркерами, чем красивый текст с выдуманными фактами. Это критично — пользователь явно указал, что выдумывать значения недопустимо.175- **Не ищи «исходный live-incident отчёт» как условие старта.** Данные для **содержания** секций приходят из сессии, не из отдельного файла. С v0.29.0 в `srekit` нет команды `incident` — markdown-live-doc больше не стандарт; live-координация уехала в IM-инструменты. Если такой файл всё-таки лежит в репо (legacy, прошлая практика, ручной артефакт) — прочитай в шаге 2 для контекста и ссылки под References, но не блокируйся на его отсутствие.176- **Не теряй contributing factors.** Корневая причина часто закопана глубже, чем «непосредственная»: симптом починен mitigation'ом, но реальная причина массовости (накопление, отсутствие алерта, систематический bias) — отдельный пункт. Не своди root cause к одному фактору.177- **Не используй `git commit`/`git push`** в рамках работы скилла. Пользователь сам решает, когда коммитить.178179## Пример180181Диалог: пользователь рассказывает, что вчера в 14:25 MSK продуктовая разработка пожаловалась на зависание создания 50 ГБ дисков; mitigation сделали к 18:30 через серию `drbdadm secondary` на ноде w1; статус — `mitigated`, не `resolved`. Заголовок согласовали: «Зависание создания 50ГБ дисков при создании ВМ», severity SEV-2, owner — SRE Lead.182183Команда скаффолда:184185```bash186srekit postmortem \187 -T "Зависание создания 50ГБ дисков при создании ВМ" \188 --severity SEV-2 \189 --owner "SRE Lead" \190 --start 2026-06-03T14:25:00+03:00 \191 --end 2026-06-03T18:30:00+03:00 \192 --out incidents/postmortem-2026-06-03-disk-50gb-create-hang.md \193 --templates-dir /Users/jtprogru/Work/h3llo.cloud/docs/infrastructure/runbooks/templates194```195196(`--templates-dir` тут указан явно, потому что проектный `postmortem.yaml` лежит вне директории, прописанной в `~/.config/srekit/config.yaml`. Если в конфиге уже стоит нужный `templates_dir` — флаг не нужен.)197198Дальше — `Edit` по секциям. Timeline (фрагмент, в UTC):199200| Время (UTC) | Событие | Источник |201|---|---|---|202| 2026-06-03 11:25 | Продуктовая разработка сообщает о hang при create 50 GiB VM | внутренний чат |203| 2026-06-03 12:25 | SRE Lead запрашивает прод-доступ | внутренний чат |204| 2026-06-03 12:35 | Инцидент объявлен SEV-2 ретроспективно | сессия |205| 2026-06-03 15:30 | Verify: retry-storm схлопнулся (10+ → 1 PVC), статус mitigated | сессия |206| 2026-06-03 16:41 | pvc-create-bench: 0/10 hung, p95=77s — symptom закрыт | bench CSV |207208Action items:209210| # | Action | Owner | Priority | Deadline | Status | Ссылка на тикет |211|---|---|---|---|---|---|---|212| 1 | Kernel-check `blkio_throttle` на всех воркер-нодах (cgroup v1/v2) | Storage / Piraeus owner | P0 | 2026-06-05 | Open | `<GAP — тикет>` |213| 2 | P0 RCA: «все Primary на w1» (16/16 zombie) | Storage / Piraeus owner | P0 | 2026-06-10 | Open | `<GAP — тикет>` |214| 3 | Зафиксировать baseline SLO disk-create в 53-slo-catalog | SRE | P1 | 2026-06-10 | Open | `<GAP — тикет>` |215| 4 | Регулярный pvc-create-bench в CI (baseline) | Storage / Piraeus owner | P2 | 2026-06-30 | Open | `<GAP — тикет>` |216217GAP-маркеры в постмортеме:218219- `Communications Lead` — `_TBD_` (роль не была явно назначена)220- `Error budget impact` — `<GAP — error budget policy ещё не утверждена, см. ADR-0011 (Proposed)>`221- Финальный `Resolved` timestamp — `<GAP — инцидент в статусе mitigated, не resolved>`