Звать, когда инцидент инженерной работы починен и его надо разобрать: что случилось, почему и что не даст ему повториться — новое правило, второй инцидент к существующему, механизм или вердикт «правилом не становится». Тем же заходом, что починка, а не потом.
Installs into .claude/skills of the current project.
Are you the author of Postmortem?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/artvsmark-postmortem)
---
name: postmortem
description: >-
Звать, когда инцидент инженерной работы починен и его надо разобрать: что
случилось, почему и что не даст ему повториться — новое правило, второй
инцидент к существующему, механизм или вердикт «правилом не становится». Тем
же заходом, что починка, а не потом.
argument-hint: "[инцидент или изменение-починка]"
---
# Разбор после инцидента
> **Читатель:** агент — окно, которое починило инцидент и разбирает его, сразу после починки.
## Зачем это существует
Разборы здесь подводили в трёх местах, и каждое стоило каталогу записи.
- **Вывод по чтению, а не по замеру.** Запись утверждала: при уплотняющем
слиянии автор берётся из коммитов ветки. Под утверждение построили гейт,
набор подделок с обеих сторон и мутацию — всё работало. Замер по шести
изменениям показал другое: решает учётная запись, **открывшая** изменение
([146](../../../rules/ru/146-a-green-gate-does-not-verify-its-premise.md),
инцидент «первый»). Это была запись 143, и прожила она двадцать пять минут:
добавлена коммитом `1ad5aaf` 26 августа в 10:48 UTC, удалена как дубль 131 и
135 коммитом `8c035bd` в 11:13 UTC. Числа взяты из истории —
`TZ=UTC git show -s --format='%h %ad' --date=iso-local 1ad5aaf 8c035bd`, — а не из
текста 146, где их нет.
- **Починка одного случая ломала соседний.** 8 сентября из десяти находок ревью
три оказались одним классом: `#413` чинил жирную разметку и портил `**kwargs`
и `id_`, `#415` чинил это и ломал третьего соседа — набор был зелёным все три
раза ([195](../../../rules/ru/195-a-narrowed-predicate-names-its-neighbour.md),
инцидент).
- **Вывод остался намерением.** 10 сентября, за час, три ссылки на правила
подряд в одном абзаце — все мимо. После первой было записано «сначала
применимость, потом цитата»; не помогло дважды
([204](../../../rules/ru/204-a-citation-is-checked-by-applicability.md),
инцидент).
## Что сделать
**0. Тем же заходом, что починка.** Числа, последовательность и то, что
пробовали, живут в окне часы, а не дни: разбор, отложенный «на потом», пишется
по памяти ([138](../../../rules/ru/138-the-handover-is-assembled-as-you-go.md)).
**1. Хронология** — время UTC с площадки, номера прогонов и изменений, а не
пересказ.
**2. Воздействие — числом.** Сколько изменений уехало, сколько часов стояла
очередь, сколько прогонов отказало, сколько окон прошло мимо.
**3. Причина — замером на живом предмете.** Не рассуждением и не зелёным
гейтом: зелёное подтверждает механизм, а не утверждение, под которое он
построен ([146](../../../rules/ru/146-a-green-gate-does-not-verify-its-premise.md)).
Отвергнутые гипотезы остаются в разборе — с тем, чем опровергнуты, иначе их
проверят заново ([026](../../../rules/ru/026-rejected-findings-must-be-recorded.md)).
**4. Способствующие факторы.** Если починка правила признак — условие, образец,
набор ключей, — перечислить соседние случаи того же признака и ответить по
каждому строкой `Соседи:` во фрагменте журнала
([195](../../../rules/ru/195-a-narrowed-predicate-names-its-neighbour.md)); это
спрашивает гейт `check_narrowing.py`.
**5. Итог — один из четырёх, и путь к нему уже механизирован.**
| Итог | Как | Чем держится |
|---|---|---|
| **новое правило** | сначала `python scripts/check_duplicates.py --near <файл-черновик | ->` — нет ли такого уже (черновик файлом или потоком: номера у ненаписанной записи нет); потом `python scripts/new_rule.py --slug … --tier … --area … --trail владелец/репо#N`. Человеку остаются утверждение, инцидент с числами и граница «не работает». Без инцидента это не правило ([080](../../../rules/ru/080-every-new-rule-goes-into-the-catalogue.md)) | `check_duplicates.py --check`, `audit_catalogue.py`, `build_rules_index.py --check` |
| **второй инцидент к существующему** | дописывается в «Инцидент» правила второй историей ([`CONTRIBUTING.md`](../../../CONTRIBUTING.md) § «Как устроена запись»). Пересмотр **по существу** — новой записью со строкой «Заменено.» у старой, не правкой задним числом ([043](../../../rules/ru/043-decisions-are-superseded-not-edited.md)) | скрипта нет — это проверяет ревью |
| **правилом не становится** | строка `>` во фрагменте `changelog.d/<слаг>.fixed.md`: «правилом не становится, потому что…» — с причиной ([026](../../../rules/ru/026-rejected-findings-must-be-recorded.md)) | `collect_changelog.py --check` |
| **наблюдение без своего инцидента** | кандидат в `candidates/`, не правило | `check_candidates.py` |
**6. Корректирующее действие — механизм, а не намерение.** Требование, которое
можно проверить машинно, становится гейтом; иначе его не будут соблюдать
([002](../../../rules/ru/002-rule-without-mechanism.md)). Гейт ставится в путь
самого действия — сторож, обязательная проверка, — а не рядом: вердикт,
который читает тот же, кто следом действует, остаётся запиской
([208](../../../rules/ru/208-a-verdict-its-own-actor-reads-is-a-reminder.md)).
Объявлено «машинно нельзя» — сначала разобрать требование надвое
([182](../../../rules/ru/182-an-unmechanisable-answer-is-split-in-two.md)).
Новый гейт прогоняется тем, что обязан отвергнуть, и тем, что обязан
пропустить ([140](../../../rules/ru/140-a-gate-is-tested-by-what-it-must-reject.md));
что тест краснеет до починки, доказывается полу-откатом
([014](../../../rules/ru/014-red-before-fix-needs-partial-revert.md)).
**7. Владелец и критерий завершения.** У каждого действия — задача или строка
изменения: `Closes #N` либо `Part of #N` с названным остатком
([173](../../../rules/ru/173-a-change-closes-the-task-or-names-the-rest.md)).
Критерий — число или номер прогона, на котором отработало, а не «сделано».
## Что выдать
1. **Хронология** — время UTC и номера.
2. **Воздействие** — числа.
3. **Причина** — и замер, которым она подтверждена; отвергнутые гипотезы с опровержением.
4. **Способствующие факторы** — соседние случаи, если менялся признак.
5. **Итог** — одна строка таблицы шага 5.
6. **Корректирующие действия** — механизм, владелец, критерий завершения.
## Чего навык НЕ делает
- **Не краснеет.** Форму записи, вердикт фрагмента и соседей держат гейты;
навык зовёт их, а не повторяет.
- **Не ищет виноватого.** Предмет разбора — механизм, а не внимательность
исполнителя. Отдельного правила «без обвинения» в каталоге нет; это тот же
приём, что у [208](../../../rules/ru/208-a-verdict-its-own-actor-reads-is-a-reminder.md):
чинить механизм, а не человека.
- **Не присваивает номер правила руками** — его берёт `new_rule.py`, и номера
не переиспользуются.
- **Не ревьюирует свой разбор.** Ревью делает не автор — это
`/incident-review` другим заходом.