Звать, когда об инциденте надо написать — владельцу в окне, в теле или комментарии изменения, в задаче дежурного, в живой задаче-передаче следующему окну, потребителям каталога, — и перед отправкой уже написанного. Не для самого разбора и не для выбора меры.
Installs into .claude/skills of the current project.
Are you the author of Incident Communications?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/artvsmark-incident-communications)
---
name: incident-communications
description: >-
Звать, когда об инциденте надо написать — владельцу в окне, в теле или
комментарии изменения, в задаче дежурного, в живой задаче-передаче
следующему окну, потребителям каталога, — и перед отправкой уже написанного.
Не для самого разбора и не для выбора меры.
argument-hint: "[кому и о чём]"
---
# Сообщение об инциденте
> **Читатель:** агент — окно, которое пишет об инциденте человеку, машине или следующему окну, в момент до отправки.
## Зачем это существует
Сообщения здесь подводили не отсутствием, а тем, что **читатель понимал из
них больше, чем в них было проверено**, — или не получал их вовсе.
- **2 сентября** дежурный сообщил «ветка зелёная», когда `attribution-history`
была красной: работа стояла у него в исключениях, а сообщение об этом
молчало. Два изменения уехали на сломанном основании
([`AGENTS.md`](../../../AGENTS.md) § «Открытая работа», пункт 0).
- **4 сентября** «чисто» прогона перед толчком снималось на Python 3.11.15
при планке 3.12 — а все семь прогонов конвейера шли на 3.12, и ни один
механизм этого не спрашивал. Поверхность в докладе названа не была
([`AGENTS.md`](../../../AGENTS.md) § «Перед толчком»).
- **8 сентября** из 29 слитых изменений с прогоном ревью вердикт успел к
слиянию у 10: #392 слилось на 2,3 минуты раньше вердикта, и две верные
находки не увидел никто — у сообщения не было адресата после слияния
([`scripts/review_findings.py`](../../../scripts/review_findings.py)).
- **10 сентября** снятия находок в теле #475 были написаны словами —
`Разобрано: 202-boundary` вместо отпечатка. Человеку это выглядело разобранным,
машине не значило ничего; поймано чтением за минуты до слияния
([`CHANGELOG.md`](../../../CHANGELOG.md), запись «Снятие заметки внешнего взгляда проверяется машинно»).
## Что сделать
**1. Назвать адресата — от него зависят место и минимум.**
| Адресат | Куда | Что сообщение несёт само |
|---|---|---|
| владелец в окне | ответ в разговоре | факты с адресами; у владельца полный доступ, дублировать журналы не нужно |
| следующее окно | живая задача-передача в трекере, собранная по ходу, а не в конце: решения с причиной и отвергнутым, где остановились — ссылками, что пробовали и не сработало, чего окно не знает, как работаем — ссылкой на свод ([138](../../../rules/ru/138-the-handover-is-assembled-as-you-go.md)) | работу, тест и первую строку ошибки: ссылка на журнал, который окно не откроет, следом не считается ([151](../../../rules/ru/151-the-trail-goes-where-the-fixer-can-reach.md)) |
| красное по расписанию | задача, которую завёл дежурный `main-red.yml`; вторая не заводится — адресат уже есть ([142](../../../rules/ru/142-a-scheduled-red-needs-an-addressee.md), граница «не работает») | что красное, с какого прогона, что проверено |
| изменение | тело — из первого коммита ветки, ставится конвейером один раз при открытии; правка тела после этого идёт отдельно | строки для машины — шаг 5 |
| потребители каталога | их трекер или задача-адресат из прогона сверки | полные адреса, а не пути в нашем дереве: у получателя его нет ([076](../../../rules/ru/076-messages-point-at-what-the-user-actually-has.md)) |
**2. У каждого слова статуса — поверхность и то, чего оно НЕ означает**
([056](../../../rules/ru/056-a-signal-states-what-it-does-not-mean.md)).
| Слово | Что обязано стоять рядом | Чего оно НЕ означает |
|---|---|---|
| «чисто», «прошло» | где снято: локально на какой версии, на изменении #N, на `main`; и сколько проверок создано ([010](../../../rules/ru/010-empty-checklist-is-not-green.md)) | не «проверено везде»: снятое не на площадке — гипотеза ([037](../../../rules/ru/037-finding-status-depends-on-window.md)) |
| «починено» | номер изменения или прогона, на котором отработало | не «причина устранена», пока нет живого исхода |
| «причина» | замер, которым она подтверждена | без замера — «гипотеза», и слово другое |
| «не отработала» | что именно не отработало | не «чисто»: третий исход при пересказе не сворачивается во второй |
**3. Неполное и пустое — называть.** Частичный перечень находок, проверок,
тестов пишется «N из M» ([016](../../../rules/ru/016-no-silent-truncation.md)).
Пустой раздел — фактом, датой и причиной: «не запускался» и «ничего не
найдено» — разные сообщения ([027](../../../rules/ru/027-empty-state-is-a-state.md)).
**4. Отвергнутое — с причиной.** Гипотеза о причине, которую проверили и
отбросили, остаётся в сообщении с тем, чем она опровергнута: иначе её проверят
заново ([026](../../../rules/ru/026-rejected-findings-must-be-recorded.md)).
**5. Строки для машины — её формой, отдельным абзацем над трейлерами.** Их
читает не человек, и выглядеть верно им мало:
- `Closes #N`, либо `Part of #N` со строкой `Остаётся:`, либо «Без задачи,
потому что…» — форма в [`scripts/pr_body.py`](../../../scripts/pr_body.py);
- `Разобрано: <семь шестнадцатеричных знаков>` — отпечаток из задачи находок,
а не слова;
- трейлеры — последним абзацем: машина читает их только там
([156](../../../rules/ru/156-trailers-live-in-the-tail-not-in-the-prose.md)).
Перед толчком тело проверяется той же командой, что стоит в конвейере:
`python scripts/pr_body.py --check --body-file <файл>`. После публикации строки,
на которые должна ответить машина, перечитываются по месту: код ответа 201
доставки не доказывает ([188](../../../rules/ru/188-published-is-not-delivered.md)).
**6. Срок — только с источником.** Срок, зависящий от чужого события — релиз,
площадка, сосед, — сверяется с живым источником
([203](../../../rules/ru/203-experimental-is-a-claim-about-someone-elses-calendar.md)).
Для своих сроков правила в каталоге нет, и сообщение их не обещает.
**7. Куда НЕ писать.** Ход инцидента не вписывается в документы о текущем
состоянии — `AGENTS.md`, `CLAUDE.md`, `README` ([024](../../../rules/ru/024-no-worklog-in-active-docs.md)).
Номер задачи уместен в сообщении и во фрагменте журнала; вывод, переезжающий в
свод, идёт туда без номера ([025](../../../rules/ru/025-issue-links-by-zone.md)).
## Что выдать
1. **Адресат и место** — из таблицы шага 1.
2. **Текст** — факты с адресом и поверхностью, гипотезы названы гипотезами,
неполное — числом, пустое — с датой и причиной.
3. **Что не проверено** — отдельной строкой, а не молчанием.
4. **Строки для машины** — отдельным абзацем, формой из шага 5, и результат
`pr_body.py --check`, если это тело изменения.
## Чего навык НЕ делает
- **Не краснеет.** Форму машинных строк держит гейт `pr_body.py` и сторож
толчка; навык её не заменяет, а зовёт.
- **Не публикует от имени человека.** Тело изменения ставит конвейер, из
облачного окна такие записи не делаются
([131](../../../rules/ru/131-no-writes-from-a-cloud-session.md)).
- **Не разбирает и не выбирает меру** — это
[`/incident-triage`](../incident-triage/SKILL.md) и
[`/incident-mitigation`](../incident-mitigation/SKILL.md).
- **Не обещает сроков** без источника.